Funkcje i programowanie funkcyjne
def nasza_funkcja(argument1, argument2):
return f'{argument1} {argument2}'
print(nasza_funkcja("Poczatek", "Koniec"))
def nasza_funkcja(argument1, argument2='The end'):
return f'{argument1} {argument2}'
print(nasza_funkcja(argument1="Poczatek"))
Przy przypisywaniu wartości domyślnych argumentom należy używać typów prostych. Przypisanie pustej listy czy słownika spowoduje że przypiszemy referencję (odwołanie) do takiego obiektu - każde wywołanie funkcji będzie operować na jednym obiekcie listy/słownika a nie na nowej pustej jego kopii.
Funkcje obsługują też dwa specjalne argumenty: *args i **kwargs. Pierszy to krotka (tupla) nienazwanych argumentów przekazanych do funkcji (może być ich wiele). Drugi to słownik nazwanych argumentów przekazanych do funkcji.
def funkcja(*args, **kwargs):
print(args, kwargs)
funkcja(1, z=2)
Co wypisze:
args i kwargs stosuje się czasami gdy zachodzi potrzeba przekazywania opcjonalnych argumentów do funkcji lub do funkcji używanych przez nią - bez explicite deklarowania ich.
Reguły obowiązywania zasięgu
Za każdym razem gdy dochodzi do wykonania jakiejś funkcji, tworzona jest nowa lokalna przestrzeń nazw. Nowa przestrzeń obejmuje nazwy parametrów funkcji, a także nazwy zmiennych używanych wewnątrz funkcji. Przystępując do rozwiązywania nazwy interpreter zaczyna od przeszukania lokalnej przestrzeni nazw, następnie jeżeli nie zostanie znaleziona poszukiwana nazwa interpreter przeszukuje przestrzeń globalną - moduł, w którym znajduje się funkcja. Jeżeli przeszukiwanie skończy się niepowodzeniem to przeszukiwana jest przestrzeń wbudowana.
Zmienne stosowane wewnątrz funkcji nie będą dostępne poza nią, chyba że przypiszemy je do globalnej przestrzeni nazw - co zazwyczaj nie jest dobrą praktyką programistyczną.
Operator lambda
Wyrażenie lambda służy do definiowania anonimowych funkcji w postaci wyrażenia:a = lambda : 'a'
print(a())
b = lambda x,y : x+y
print(b(1,2))
Funkcje map(), zip(), reduce() i filter()
Funkcja map() wykonuje podaną funkcję dla każdego elementu listy/tupli/słownika:liczby = [1,2,3,4,5]
def dwa(x):
return x * 2
print(map(dwa, liczby))
Funkcja zip() tworzy za to listę tupli z podanych elementów:
liczby_n = [1,3,5]
liczby_p = [2,4,6]
print(list(zip(liczby_n, liczby_p)))
from functools import reduce
liczby = [2,2,2,2,2]
def suma(x,y):
return x + y
print(reduce(suma, liczby))
liczby = [1,2,3,4,5]
def parzyste(x):
return x%2 == 0
print(list(filter(parzyste, liczby)))
Funkcje eval(), exec() i execfile()
Funkcja eval() wykonuje wyrażenie zawarte w łańcuchu i zwraca wynik. Funkcja exec() wykonuje dowolny kod Pythona zawarty w łańcuchu tak jakby znajdował się w miejscu tej instrukcji, natomiast funkcja execfile() wykonuje kod podanego pliku.print(eval('2+2'))
print(exec('for i in range(1,3): print(i)'))
Comment article