Matematikai Algoritmusok és Felfedezések I.

5. Előadás: Objektum orientált programozás 2, Modulok

2021 március 8.

Öröklődés

In [46]:
class Ember:
    pass
 
class Matematikus(Ember):
    pass

e = Ember()  
m = Matematikus()
print(isinstance(e, Matematikus))
print(isinstance(m, Ember))
print(issubclass(Ember, Matematikus))
print(issubclass(Matematikus,Ember))
False
True
False
True

Ha nem írunk semmilyen osztályt, automatikusan az object osztály a szülő osztály:

In [3]:
o=object()
In [4]:
class A: pass
class B(object): pass

print(issubclass(A, object))
print(issubclass(B, object))
True
True

Metódus öröklődés

A metódusok öröklődnek, de felülírhatóak.

In [5]:
class A(object):
    def foo(self):
        print("A.foo függvény")
        
    def bar(self):
        print("A.bar függvény")
        
class B(A):
    def foo(self):
        print("B.foo függvény")
        
b = B()
b.foo()
b.bar()
B.foo függvény
A.bar függvény

Attribútum öröklődés

Mivel az adat attribútumok bárhol létrehozhatóak, nem öröklődnek!

In [10]:
class A(object):
    
    def foo(self):
        self.value = 42
        
class B(A):
    pass

b = B()
a = A()
print('a',a.__dict__,'b',b.__dict__)            # a __dict__ kiírja az összes attribútumot 
a.foo()
print('a',a.__dict__,'b',b.__dict__)            
b.foo()
print('a',a.__dict__,'b',b.__dict__)          
a {} b {}
a {'value': 42} b {}
a {'value': 42} b {'value': 42}
In [15]:
dir(a)
Out[15]:
['__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'foo',
 'value']
In [14]:
a.__dict__
Out[14]:
{'value': 42}

A szülő osztály konstruktora

  • meghívódik az szülő osztály __init__ függvénye. Viszont mivel az __init__ nem egy szokásos konstruktor, így nem hívódik meg automatikusan a szülő osztály init függvénye, ha felülírja a gyerek osztály.
In [53]:
class A(object):
    def __init__(self):
        print("A.__init__ called")
        
class B(A):
    #pass
    def __init__(self):
        print("B.__init__ called")
        
class C(A):
    pass
        
b = B()
print("c létrehozása")
c = C()
B.__init__ called
c létrehozása
A.__init__ called

A szülő osztály metódusai kétféleképpen is elérhetőek

  1. a már tanult módon, az osztály nevével
  2. vagy pedig a super függvény segítségével
In [19]:
class A(object):
    def __init__(self):
        print("A.__init__ ")
        
        
class B(A):
    def __init__(self):
        A.__init__(self)
        print("B.__init__ ")
        
class C(A):
    def __init__(self):
        super().__init__()
        print("C.__init__ ")
        
print("B")
b = B()
print("C")
c = C()
B
A.__init__ 
B.__init__ 
C
A.__init__ 
C.__init__ 

1. Példa: polinomok

In [22]:
class Polinom:
    
    def __init__(self, lista):
        self.ehlista=lista 
       
    def __str__(self):
        szoveg=""
        for i,eh in enumerate(self.ehlista):
            szoveg=szoveg+str(eh)+"x^"+str(i)+"+"
        szoveg=szoveg.rstrip("+")    
        return szoveg
    
    def deri(self):
        l=[i*eh for i,eh in enumerate(self.ehlista) if i!=0]
        return Polinom(l)
    
In [23]:
a=Polinom([1,2,4,5])
print(a)
print(a.deri())
1x^0+2x^1+4x^2+5x^3
2x^0+8x^1+15x^2
In [34]:
class Masodfoku(Polinom):
    def egyikgyok(self):
        a=self.ehlista[2]
        b=self.ehlista[1]
        c=self.ehlista[0]
        return (-b+(b**2-4*a*c)**(1/2))/(2*a) 
In [35]:
p=Masodfoku([2,3,1])
print(p)
p.egyikgyok()
#print(p.deri())
1x^2+3x^1+2x^0
Out[35]:
-1.0
In [32]:
class Polinom:
    
    def __init__(self, lista):
        self.ehlista=lista
       
    def __str__(self):
        szoveg="".join([str(eh)+"x^"+str(i)+"+" for i,eh in enumerate(self.ehlista)][::-1])
        szoveg=szoveg.rstrip("+")    
        return szoveg
    
    def deri(self): 
        l=[i*eh for i,eh in enumerate(self.ehlista) if i!=0]
        return Polinom(l)
    
    def beh(self,x):
        valasz=sum([eh*x**i for i,eh in enumerate(self.ehlista)])
        return valasz
     
    def __add__(self, other):
        
        l=max(len(self.ehlista),len(other.ehlista))
        bovitett_eh1=self.ehlista + [0]*(l - len(self.ehlista))
        bovitett_eh2=other.ehlista + [0]*(l - len(other.ehlista))
            
        uj_ehlista=[bovitett_eh1[i]+bovitett_eh2[i] for i in range(l) ]
        while uj_ehlista[-1]==0:
            del uj_ehlista[-1]
        
        return Polinom( uj_ehlista )
        
In [42]:
p=Polinom([1,2])
print(p,p.beh(5))
print(p.deri())
2x^1+1x^0 11
2x^0

Mi lesz az eredmény?

In [45]:
m=Masodfoku([1,2,7])
print(m.beh(m.egyikgyok()))
(2.220446049250313e-16+1.1102230246251565e-16j)
In [46]:
print(p+p)
print(Polinom([1,2,0])+Polinom([2,1]))
print(Polinom([-1,2,3])+Polinom([1,2,-3]))
4x^1+2x^0
3x^1+3x^0
4x^1+0x^0

2. Példa: Sárkányok

sarkany

In [47]:
class sarkany:
    def __init__(self, nev):
        self.nev=nev
In [48]:
class repulo_sarkany(sarkany):
    def __init__(self, nev, szarnyfesztav):
        super().__init__(nev)
        self.szarnyfesztav=szarnyfesztav
    
    def tamadas(self):
        print("A", self.nev, "nevű sárkány a levegőből rád vetette magát", )
        
    def repules(self):
        print("A", self.nev, "nevű sárkány repül", )
        
In [49]:
smaug=repulo_sarkany("Smaug",12)
smaug.repules()
smaug.tamadas()
smaug.szarnyfesztav
A Smaug nevű sárkány repül
A Smaug nevű sárkány a levegőből rád vetette magát
Out[49]:
12
In [51]:
class tuzokado_sarkany(sarkany):
    def __init__(self, nev):
        super().__init__(nev)
    
    def tamadas(self):
        print("A", self.nev, "nevű sárkány szénné égetett", )
        
    def tuzokadas(self):
        print("A", self.nev, "nevű sárkány a tüzet okád", )
    
In [52]:
susu=tuzokado_sarkany("Süsü")
susu.tuzokadas()
susu.tamadas()
A Süsü nevű sárkány a tüzet okád
A Süsü nevű sárkány szénné égetett

Többszörös öröklődés

  • mindegyik osztály metódusai öröklődnek
In [53]:
class repulo_tuzokado_sarkany(repulo_sarkany,tuzokado_sarkany):
     def __init__(self, nev, szarnyfesztav):
        self.nev=nev  
        self.szarnyfesztav=szarnyfesztav
    
     

Vajon mi lesz az eredmény?

In [54]:
viserion=repulo_tuzokado_sarkany("Viserion",25)
viserion.repules()
viserion.tuzokadas()
viserion.tamadas()
A Viserion nevű sárkány repül
A Viserion nevű sárkány a tüzet okád
A Viserion nevű sárkány a levegőből rád vetette magát

Azt, hogy melyik hívódik meg, az MRO (Method Resolution Order) határozza meg. Ez egy sorrend az osztályokon, és egy metódus hívásnál addig megy a sorrendben még meg nem találja valamelyik osztályban a metódust. Nem pontosan így működik, de ökölszabálynak jó, hogy felfelé mélységi kersést végez, balról jobbra sorrendben.

Modulok importálása

  • Az import két műveletet hajt végre
    1. megkeresi a megadott név alapján a modult,
    2. elérhetővi teszi a lokális scopeban

Teljes modul importálása

import modulnév

In [55]:
import sys

", ".join(dir(sys))  # a dir függvény megadja az objektum attribútumait és metódusait.  
Out[55]:
'__breakpointhook__, __displayhook__, __doc__, __excepthook__, __interactivehook__, __loader__, __name__, __package__, __spec__, __stderr__, __stdin__, __stdout__, _base_executable, _clear_type_cache, _current_frames, _debugmallocstats, _enablelegacywindowsfsencoding, _framework, _getframe, _git, _home, _xoptions, api_version, argv, base_exec_prefix, base_prefix, breakpointhook, builtin_module_names, byteorder, call_tracing, callstats, copyright, displayhook, dllhandle, dont_write_bytecode, exc_info, excepthook, exec_prefix, executable, exit, flags, float_info, float_repr_style, get_asyncgen_hooks, get_coroutine_origin_tracking_depth, get_coroutine_wrapper, getallocatedblocks, getcheckinterval, getdefaultencoding, getfilesystemencodeerrors, getfilesystemencoding, getprofile, getrecursionlimit, getrefcount, getsizeof, getswitchinterval, gettrace, getwindowsversion, hash_info, hexversion, implementation, int_info, intern, is_finalizing, last_traceback, last_type, last_value, maxsize, maxunicode, meta_path, modules, path, path_hooks, path_importer_cache, platform, prefix, ps1, ps2, ps3, set_asyncgen_hooks, set_coroutine_origin_tracking_depth, set_coroutine_wrapper, setcheckinterval, setprofile, setrecursionlimit, setswitchinterval, settrace, stderr, stdin, stdout, thread_info, version, version_info, warnoptions, winver'

Példák dokumentációra

In [56]:
import random
type(random)
Out[56]:
module

importálás után modulnev.attribútum alakban érjük el a modul tartalmát.

In [57]:
random.choice([3,4,5]) 
Out[57]:
3

Saját modult is készíthetünk

A notebookal azonos mappában készítsünk egy mod.py fájlt.

In [1]:
import mod 
A mod.py fájl lefutott
In [2]:
dir(mod)
Out[2]:
['Foo',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__spec__',
 'a',
 'foo',
 's']
In [3]:
print(mod.a)
mod.foo(1)
print(mod.s)
[100, 200, 300]
arg 1
If Comrade Napoleon says it, it must be right.

almodulok importálása

from modulnév import almodul

Az almodult ezután almodul néven érjük el és nem modulnév.almodul néven.

In [5]:
from os import path

try:
    os
except NameError:
    print("os nincs definiálva")
    
try:
    path
    print("path megtalálva")
except NameError:
    print("path nincs definiálva")
    
os nincs definiálva
path megtalálva
In [6]:
try:
    os.path
    print("os.path megtalálva")
except NameError:
    print("os.path nincs definiálva")
os.path nincs definiálva

Az as kulcssszó segítségével megadhatunk egy másik nevet is:

In [7]:
import numpy as np
In [8]:
import os as os_module

try:
    os
except NameError:
    print("os nincs definiálva")
    
try:
    os_module
    print("os_module megtalálva")
except NameError:
    print("os_module nincs definiálva")
os nincs definiálva
os_module megtalálva

Egyszerre több mindent is importálhatunk

In [9]:
import os, sys
from sys import stdin, stderr, stdout

Konkrét függvényeket és osztályokat is importálhatunk

In [10]:
from argparse import ArgumentParser
import inspect

inspect.isclass(ArgumentParser) 
Out[10]:
True

Minden importálása egy modulból

from modulnév import * után a modul tartalma elérhető a modulnév. nélkül.

NAGYON NEM AJÁNLOTT mert tudtunkon kívül felülírhatunk dolgokat.

In [13]:
def stat():
    print("Én egy statisztika vagyok")
stat()
from os import *
stat() 
Én egy statisztika vagyok
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-13-8c264af88881> in <module>
      3 stat()
      4 from os import *
----> 5 stat()

TypeError: stat() missing required argument 'path' (pos 1)
In [14]:
stat
Out[14]:
<function nt.stat(path, *, dir_fd=None, follow_symlinks=True)>

Modulok instalálása

In [15]:
import wikipedia

Ha ModuleNotFoundError-t kapunk, akkor a Python nem találta meg a számítógépünkön a modult. Ekkor általában az a gond, hogy tényleg nincs is a gépünkön, így instalálni kell.

pip (pip installs packages)

A pip program automatikusan telepítődik az Anaconda keretében. Windowson az Anaconda Promptból érjük el, Linuxon pedig a terminálból. Használat:

  • pip install modulnev Modul instalálása
  • pip uninstall modulnev Modul törlése
  • pip list Instalált modulok listája

Olyan packageket tudunk installálni amik megtalálhatóak a PyPi-ben. (https://pypi.org/)

In [16]:
!pip list     # a ! a mögötte lévő parancsot lefuttatja a terminálban
Package                            Version    
---------------------------------- -----------
-olorama                           0.4.1      
alabaster                          0.7.12     
altgraph                           0.17.2     
anaconda-client                    1.7.2      
anaconda-navigator                 2.0.4      
anaconda-project                   0.8.3      
asn1crypto                         1.0.1      
astroid                            2.3.1      
astropy                            3.2.1      
atomicwrites                       1.3.0      
attrs                              20.3.0     
Babel                              2.7.0      
backcall                           0.1.0      
backports.functools-lru-cache      1.5        
backports.os                       0.1.1      
backports.shutil-get-terminal-size 1.0.0      
backports.tempfile                 1.0        
backports.weakref                  1.0.post1  
beautifulsoup4                     4.8.0      
bidict                             0.21.3     
bitarray                           1.0.1      
bkcharts                           0.2        
bleach                             3.1.0      
bokeh                              1.3.4      
boto                               2.49.0     
Bottleneck                         1.2.1      
build                              0.6.0.post1
certifi                            2019.9.11  
cffi                               1.12.3     
chardet                            3.0.4      
chess                              1.6.1      
click                              8.0.3      
click-default-group                1.2.2      
cloudpickle                        1.2.2      
cloup                              0.7.1      
clyent                             1.2.2      
colorama                           0.4.4      
colour                             0.1.5      
commonmark                         0.9.1      
comtypes                           1.1.7      
conda                              4.10.3     
conda-build                        3.18.9     
conda-content-trust                0+unknown  
conda-package-handling             1.6.0      
conda-repo-cli                     1.0.4      
conda-token                        0.3.0      
conda-verify                       3.4.2      
contextlib2                        0.6.0      
cryptography                       2.7        
cycler                             0.10.0     
Cython                             0.29.13    
cytoolz                            0.10.0     
dask                               2.5.2      
decorator                          5.1.0      
defusedxml                         0.6.0      
distributed                        2.5.2      
docutils                           0.15.2     
entrypoints                        0.3        
et-xmlfile                         1.0.1      
fastcache                          1.1.0      
filelock                           3.0.12     
Flask                              1.1.1      
fsspec                             0.5.2      
funcy                              1.16       
future                             0.17.1     
gevent                             1.4.0      
glcontext                          2.3.4      
glob2                              0.7        
greenlet                           0.4.15     
h5py                               2.9.0      
HeapDict                           1.0.1      
html5lib                           1.0.1      
idna                               2.8        
imageio                            2.6.0      
imagesize                          1.1.0      
importlib-metadata                 4.8.1      
ipykernel                          5.1.2      
ipython                            7.8.0      
ipython-genutils                   0.2.0      
ipywidgets                         7.5.1      
isort                              4.3.21     
isosurfaces                        0.1.0      
itsdangerous                       1.1.0      
jdcal                              1.4.1      
jedi                               0.15.1     
Jinja2                             2.10.3     
joblib                             0.13.2     
json5                              0.8.5      
jsonschema                         3.0.2      
jupyter                            1.0.0      
jupyter-client                     5.3.3      
jupyter-console                    6.0.0      
jupyter-core                       4.5.0      
jupyter-manim                      1.3        
jupyterlab                         1.1.4      
jupyterlab-server                  1.0.6      
jupyterthemes                      0.20.0     
keyring                            18.0.0     
kiwisolver                         1.1.0      
lazy-object-proxy                  1.4.2      
lesscpy                            0.14.0     
libarchive-c                       2.8        
llvmlite                           0.29.0     
locket                             0.2.0      
lxml                               4.4.1      
maf2-tantargy                      0.0.1      
manim                              0.12.0     
ManimPango                         0.3.1      
mapbox-earcut                      0.12.11    
MarkupSafe                         1.1.1      
matplotlib                         3.1.1      
mccabe                             0.6.1      
menuinst                           1.4.16     
mistune                            0.8.4      
mkl-fft                            1.0.14     
mkl-random                         1.1.0      
mkl-service                        2.3.0      
mock                               3.0.5      
moderngl                           5.6.4      
moderngl-window                    2.4.0      
more-itertools                     7.2.0      
mpmath                             1.1.0      
msgpack                            0.6.1      
multipledispatch                   0.6.0      
navigator-updater                  0.2.1      
nbconvert                          5.6.0      
nbformat                           4.4.0      
networkx                           2.6.3      
nltk                               3.4.5      
nose                               1.3.7      
notebook                           6.0.1      
numba                              0.45.1     
numexpr                            2.7.0      
numpy                              1.16.5     
numpydoc                           0.9.1      
olefile                            0.46       
opencv-python                      4.3.0.38   
openpyxl                           3.0.0      
packaging                          19.2       
pandas                             0.25.1     
pandocfilters                      1.4.2      
parsimonious                       0.8.1      
parso                              0.5.1      
partd                              1.0.0      
path.py                            12.0.1     
pathlib2                           2.3.5      
patsy                              0.5.1      
pefile                             2021.9.3   
pep517                             0.11.0     
pep8                               1.7.1      
pickleshare                        0.7.5      
Pillow                             6.2.0      
pip                                19.2.3     
pkginfo                            1.5.0.1    
pluggy                             0.13.0     
ply                                3.11       
progressbar                        2.5        
prometheus-client                  0.7.1      
prompt-toolkit                     2.0.10     
psutil                             5.6.3      
py                                 1.8.0      
py-aiger                           6.1.14     
py-aiger-cnf                       5.0.2      
pycairo                            1.19.1     
pycodestyle                        2.5.0      
pycosat                            0.6.3      
pycparser                          2.19       
pycrypto                           2.6.1      
pycurl                             7.43.0.3   
pydub                              0.24.1     
pyflakes                           2.1.1      
pyglet                             1.5.21     
Pygments                           2.10.0     
pyinstaller                        4.5.1      
pyinstaller-hooks-contrib          2021.3     
pylint                             2.4.2      
pyodbc                             4.0.27     
pyOpenSSL                          19.0.0     
pyparsing                          2.4.2      
pypblib                            0.0.4      
pyreadline                         2.1        
pyrr                               0.10.3     
pyrsistent                         0.17.3     
PySocks                            1.7.1      
pytest                             5.2.1      
pytest-arraydiff                   0.3        
pytest-astropy                     0.5.0      
pytest-doctestplus                 0.4.0      
pytest-openfiles                   0.4.0      
pytest-remotedata                  0.3.2      
python-dateutil                    2.8.0      
python-sat                         0.1.7.dev10
pytz                               2019.3     
PyWavelets                         1.0.3      
pywin32                            223        
pywin32-ctypes                     0.2.0      
pywinpty                           0.5.5      
PyYAML                             5.1.2      
pyzmq                              18.1.0     
QtAwesome                          0.6.0      
qtconsole                          4.5.5      
QtPy                               1.9.0      
readme-renderer                    29.0       
requests                           2.22.0     
requests-toolbelt                  0.9.1      
rfc3986                            1.5.0      
rich                               10.14.0    
rise                               5.7.1      
rope                               0.14.0     
ruamel-yaml                        0.15.46    
scikit-image                       0.15.0     
scikit-learn                       0.21.3     
scipy                              1.3.1      
screeninfo                         0.6.7      
seaborn                            0.9.0      
Send2Trash                         1.5.0      
setuptools                         41.4.0     
simplegeneric                      0.8.1      
singledispatch                     3.4.0.3    
six                                1.12.0     
skia-pathops                       0.7.1      
snowballstemmer                    2.0.0      
sortedcollections                  1.1.2      
sortedcontainers                   2.4.0      
soupsieve                          1.9.3      
Sphinx                             2.2.0      
sphinxcontrib-applehelp            1.0.1      
sphinxcontrib-devhelp              1.0.1      
sphinxcontrib-htmlhelp             1.0.2      
sphinxcontrib-jsmath               1.0.1      
sphinxcontrib-qthelp               1.0.2      
sphinxcontrib-serializinghtml      1.1.3      
sphinxcontrib-websupport           1.1.2      
spyder                             3.3.6      
spyder-kernels                     0.5.2      
SQLAlchemy                         1.3.9      
statsmodels                        0.10.1     
sympy                              1.4        
tables                             3.5.2      
tblib                              1.4.0      
terminado                          0.8.2      
testpath                           0.4.2      
tomli                              1.2.1      
toolz                              0.10.0     
toposort                           1.6        
tornado                            6.0.3      
tqdm                               4.36.1     
traitlets                          4.3.3      
twine                              3.4.2      
typing-extensions                  3.7.4.2    
unicodecsv                         0.14.1     
urllib3                            1.24.2     
watchdog                           2.1.6      
wcwidth                            0.1.7      
webencodings                       0.5.1      
Werkzeug                           0.16.0     
wheel                              0.33.6     
widgetsnbextension                 3.5.1      
wikipedia                          1.4.0      
win-inet-pton                      1.1.0      
win-unicode-console                0.5        
wincertstore                       0.2        
wrapt                              1.11.2     
xlrd                               1.2.0      
XlsxWriter                         1.2.1      
xlwings                            0.15.10    
xlwt                               1.3.0      
xmltodict                          0.12.0     
zict                               1.0.0      
zipp                               0.6.0      

Hasznos beépített packagek, standard library

Részletek: https://docs.python.org/3/library/

Numeric and Mathematical Modules

  • numbers — Numeric abstract base classes
  • math — Mathematical functions
  • cmath — Mathematical functions for complex numbers
  • decimal — Decimal fixed point and floating point arithmetic
  • fractions — Rational numbers
  • random — Generate pseudo-random numbers
  • statistics — Mathematical statistics functions

Functional Programming Modules

  • itertools — Functions creating iterators for efficient looping
  • functools — Higher-order functions and operations on callable objects
  • operator — Standard operators as functions
  • matek és tudományos modulok
    • numpy
    • scipy
    • sympy
  • vizualizáció
    • Matplotlib
    • bokeh
  • deep, machine és mindenféle learning, adatbányászat
    • Keras
    • TensorFlow
    • PyTorch
    • Pandas
  • nyelvi feldolgozás
    • NLTK

Kiegészítő anyagok

String formatálás

Több módszer van arra, hogy kényelmesebben generáljunk szöveges kimenetet. Az egyik a format() függvény. Ez egy stringből egy másik stringet készít úgy, hogy hogy a megadott paramétereket behelyettesíti a kapcsos zárójelek közé. A függvényekhez hasonlóan több féle paraméter átadás működik:

In [17]:
# default argumentumok
print("Kedves {}, az ön egyenlege {}.".format("Ádám", 230.2346))

# pozíció szerintei argumentumok 
print("Kedves {1}, az ön egyenlege {0}.".format("Ádám", 230.2346))

# kucsszavas argumentumok
print("Kedves {nev}, az ön egyenlege {egyen}.".format(nev="Ádám", egyen=230.2346))

# vegyes
print("Kedves {0}, az ön egyenlege {egyen}.".format("Ádám",egyen= 230.2346))
Kedves Ádám, az ön egyenlege 230.2346.
Kedves 230.2346, az ön egyenlege Ádám.
Kedves Ádám, az ön egyenlege 230.2346.
Kedves Ádám, az ön egyenlege 230.2346.

Ha az adatok egy dicitionaryben vannak, azt is használhatjuk.

In [3]:
person = {'eletkor': 23, 'nev': 'Ádam'}

print("{p[nev]} életkora: {p[eletkor]}".format(p=person))
Ádam életkora: 23

string interpolation

Egy másik lehetőség az f-stringek használata. (részletek: PEP498)

  • Hasonló az előzőhöz, de bármilyen változót használhatunk
  • Figyeld meg a f betűt a string előtt!
In [19]:
szam1 = 12
szam2 = 1
nev="Paprika Jancsi"
print(f"{nev}nak {szam1} almája és {szam2} kutyája van.")
Paprika Jancsinak 12 almája és 1 kutyája van.