09.1 Podstawy definiowania funkcji

def silnia(n):
    """zwraca silnię liczby podanej jako argument"""    #1
    r = 1
    while n > 0:
        r = r * n
        n = n - 1
    return r    #2


>>> silnia(4)    #1
24    #2
>>> x = silnia(4)    #3
>> x
24


09.2. Parametry pozycyjne

>>> def potęga(x, y):
...     r = 1
...     while y > 0:
...         r = r * x
...         y = y - 1
...     return r
...
>>> potęga(3, 3)
27


>>> potęga(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: potęga() missing 1 required positional argument: 'y'



>>> def potęga (x, y=2):
...     r = 1
...     while y > 0:
...         r = r * x
...         y = y - 1
...     return r
...


>>> potęga(3, 3)
27
>>> potęga(3)
9

09.2.2 Przekazywanie argumentów przez nazwę parametru

def pokaż_info_o_plikach(rozmiar=False, data_utworzenia=False, data_modyfikacji=False, ...):
    ...pobierz nazwy plikow...
    if rozmiar:
        # kod obsługujący pobieranie rozmiaru pliku
    if data_utworzenia:
        # kod obsługujący pobieranie daty utworzenia pliku
    # wykonywanie dowolnych innych czynności

    return struktura_informacji_o_pliku


info_o_pliku = pokaż_info_o_plikach(rozmiar=True, data_modyfikacji=True)

09.2.3 Zmienna liczba argumentów

>>> def maksimum(*liczby):
...     if len(liczby) == 0:
...         return None
...     else:
...         liczba_max = liczby[0]
...         for n in liczby[1:]:
...             if n > liczba_max:
...                 liczba_max = n
...         return liczba_max
...

>>> maksimum(3, 2, 8)
8
>>> maksimum(1, 5, 9, -2, 2)
9


>>> def przykładowa_funkcja(x, y, **inne):
...     print("x: {0}, y: {1}, klucze w zmiennej 'inne': {2}".format(x, y, list(inne.keys())))
...     inne_razem = 0
...     for k in inne.keys():
...         inne_razem = inne_razem + inne[k]
...     print("Łącznie w zmiennej 'inne' jest wartość {0}".format(inne_razem))
...


>>> przykładowa_funkcja(2, y="1", foo=3, bar=4)
x: 2, y: 1, klucze w zmiennej 'inne': ['foo', 'bar']
Łącznie w zmiennej 'inne' jest wartość 7

09.3 Obiekty mutowalne jako argumenty

>>> def f(n, lista1, lista2):
...     lista1.append(3)
...     lista2 = [4, 5, 6]
...     n = n + 1
...
>>> x = 5
>>> y = [1, 2]
>>> z = [4, 5]
>>> f(x, y, z)
>>> x, y, z
(5, [1, 2, 3], [4, 5])

09.4 Zmienne lokalne, nielokalne i globalne

def silnia(n):
    """zwraca silnię liczby podanej jako argument"""
    r = 1
    while n > 0:
        r = r * n
        n = n - 1
    return r

>>> def funkcja():
...     global a
...     a = 1
...     b = 2
...

>>> a = "jeden"
>>> b = "dwa"
>>> funkcja()
>>> a
1
>>> b
'dwa'

Na najwyższym poziomie-> zmienna_globalna: 0, zmienna_nonlocal: 0
Wewnątrz test-> zmienna_globalna: 0, zmienna_nonlocal: 2
Wewnątrz test_wewnętrzny-> zmienna_globalna: 1, zmienna_nonlocal: 4
Wewnątrz test-> zmienna_globalna: 1, zmienna_nonlocal: 4
Na najwyższym poziomie-> zmienna_globalna: 1, zmienna_nonlocal: 0

09.5 Przypisywanie funkcji do zmiennych

>>> def f_na_kelwin (stopnie_f):    #1
...     return 273.15 + (stopnie_f - 32) * 5 / 9
...
>>> def c_na_kelwin(stopnie_c):    #2
...     return 273.15 + stopnie_c
...
>>> temperatura_abs = f_na_kelwin    #3
>>> temperatura_abs(32)
273.15
>>> temperatura_abs = c_na_kelwin    #4
>>> temperatura_abs(0)
273.15


>>> t = {"FnaK": f_na_kelwin, "CnaK": c_na_kelwin}    #1
>>> t["FnaK"](32)    #A
273.15
>>> t["CnaK"](0)    #B
273.15


09.6 Wyrażenia lambda

>>> t2 = {"FnaK": lambda st_f: 273.15 + (st_f - 32) * 5 / 9,
...       "CnaK": lambda st_c: 273.15 + st_c}                #1
>>> t2["FnaK"](32)
273.15

09.7 Funkcje generatorów

>>> def cztery():
...     x = 0                                    #A
...     while x < 4:
...         print("W generatorze, x =", x)
...         yield x                               #B
...         x += 1                               #C
... 
>>> for i in cztery():
...     print(i)
...
W generatorze, x = 0
0
W generatorze, x = 1
1
W generatorze, x = 2
2
W generatorze, x = 3
3


>>> 2 in cztery()
W generatorze, x = 0
W generatorze, x = 1
W generatorze, x = 2
True
>>> 5 in cztery()
W generatorze, x = 0
W generatorze, x = 1
W generatorze, x = 2
W generatorze, x = 3
False


09.8 Dekoratory

>>> def dekoruj(funkcja):
...     print("W funkcji dekorującej, dekorując", funkcja.__name__)
...     def funkcja_obudowująca(*args):
...         print("Wykonuję", funkcja.__name__)
...         return funkcja(*args)
...     return funkcja_obudowująca
...
>>> def moja_funkcja(parametr):
...     print(parametr)
...
>>> moja_funkcja = dekoruj(moja_funkcja)
W funkcji dekorującej, dekorując moja_funkcja
>>> moja_funkcja("Cześć")
Wykonuję moja_funkcja
Cześć



>>> def dekoruj(funkcja):
...     print("W funkcji dekorującej, dekorując", funkcja.__name__)  #1
...     def funkcja_obudowująca(*args):
...         print("Wykonuję", funkcja.__name__)
...         return funkcja(*args)
...     return funkcja_obudowująca                                #2
...
>>> @dekoruj                                                     #3
... def moja_funkcja(parametr):
...     print(parametr)
...
W funkcji dekorującej, dekorując moja_funkcja                      #4
>>> moja_funkcja("Cześć")
Wykonuję moja_funkcja
Cześć

