… ale je dobré vedieť, že existujú.
*args
a **kwargs
Namiesto:
= []
lst for i in range(10):
**2) lst.append(i
je možné v Pythone napísať:
= [ i**2 for i in range(10) ] lst
Namiesto:
= []
lst
for i in range(10):
if i % 2 == 0:
**2) lst.append(i
je možné použiť:
= [ i**2 for i in range(10) if i % 2 == 0 ] lst
help
Ak chcete dokumentáciu a nechcete chodiť na internet:
help(len)
V interaktívnych Pythonoch (IPython
, Jupyter Notebook
) je skratka:
len ?
alebo
len?
Ak chcete mať definovaný help
a vlastných funkciách:
def is_prime(x):
"""Determines whether a number is a prime number.
- Input: `x` - a positive integer.
- Output: `True` or `False`.
"""
if x == 1:
return False
for i in range(2, x):
if x % i == 0:
return False
return True
Reťazcu na začiatku funkcie sa hovorí docstring (documentation string).
help(is_prime)
K argumentu vo funkcií je možné pristúpiť aj pomocou jeho mena:
def f(a, b):
print(a, b)
1, 2) # 1 2
f(=1, b=2) # 1 2
f(a=1, a=2) # 2 1 f(b
Je možné prednastaviť hodnoty argumentov:
def f(a, b=1):
print(a, b)
3) # 3 1
f(1,2) # 1 2
f(=4) # 4 1 f(a
Toto ale nefunguje (SyntaxError
):
def f(a=1, b):
...
Prednastavené argumenty musia byť za neprednastavenými argumentmi.
*args
Funkcie je možné definovať tak, aby brali ľubovoľný počet parametrov:
def print_args(*args):
print(type(args)) # tuple
for i in args:
print(i)
args
je len (štandardne zaužívaný) názov premennej, iný názov funguje tiež:
def print_args(*x):
...
*args
Je možné to kombinovať s inými argumentami:
def add_to_list(lst, *args):
for i in args:
lst.append(i)
= [1, 2]
x 3, 4, 'abc') add_to_list(l,
**kwargs
Ak chcete variabilný počet argumentov, ale zároveň vám záleží na mene argumentu:
def print_kwargs(**kwargs):
print(type(kwargs)) # dict
for i in kwargs:
print(i, kwargs[i])
=1, b=2, c='red') print_kwargs(a
Znovu, kwargs
je len (štandardne zaužívaný) názov premennej, iný názov funguje tiež. kwargs
je skratka pre keyword arguments.
**kwargs
Znova, rôzne kombinácie sú dovolené:
def print_all(a, *args, b=33, **kwargs):
print(a, b)
for i in args:
print('arg:', i)
for k, v in kwargs.items():
print('kwarg', k, v)
1, 2, 3, 4, c='red', d=5) print_all(
Nasledujúce slidy “preletia v rýchlosti” nad konceptom triedy – triedy sú relatívne komplikované.
Pre Python sú slová trieda a typ viac-menej ekvivalentné pojmy.
1
je z triedy/typu int
[1,2]
je z triedy/typu list
Konkrétne realizácie (inštancie) triedy sú objekty.
(Pre Python sú slová objekt a inštancia viac-menej ekvivalentné pojmy.)
Trieda je teda nejaký vzor pre objekt - určuje ako sa objekt chová. Napr.:
+
je definovaný pre oba typy int
a list
, ale chová sa inakTrieda teda určuje chovanie objektu:
Python vám dovoľuje vytvoriť si vlastné triedy:
class MyLittleClass:
def my_method(self, arg1, arg2):
...
= MyLittleClass()
my_object 1, 2) my_object.my_method(
Metóda je funkcia, ktorá je asociovaná k triede.
Metódu je možné zavolať dvoma spôsobmi:
str.replace('A D C', 'D', 'B')
alebo
'A D C'.replace('D', 'B')
Druhý spôsob vidíte častejšie.
Metóda je teda funkcia, ktorej ako prvý argument dáme objekt, pre ktorý je metóda definovaná.
Na inicializáciu je špeciálna metóda __init__
.
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
= Point(1.0, 3.0)
p print(p.x, p.y)
Iné tzv. magické metódy existujú pre rôzne aplikácie, najčastejšie pre definíciu chovania operátorov a základných funkcií (len
, str
,…) – Kompletný zoznam.
Sčítanie bodov:
class Point:
def __init__(self, x, y):
...def __add__(self, other):
= self.x + other.x
x_new = self.y + other.y
y_new return Point(x_new, y_new)
= Point(1.0, 3.0)
p1 = Point(-1.0, 3.0)
p2 = p1 + p2
p3 print(p3.x, p3.y)
dir
Vypíše čo objekt obsahuje (metódy, dáta):
= Point(1, 2)
p print(dir(p))
Malo by byť jasné, že triedy nutne nepotrebujete – funkcie a základné dátové typy v bohate stačia.
Výhody používania tried:
class Swan: class Duck:
def quack(self): def quack(self):
... ...
.py
import
:import názov_súboru_bez_koncovky
Ako organizovať balíček a viac o moduloch v dokumentácií Pythonu.