Funkcje i programowanie funkcyjne

Python pozwala łatwo tworzyć własne funkcje czerpiąc z pomysłów różnych języków programowania funkcyjnego (funkcjonalnego). Funkcję definiujemy za pomocą instrukcji def. Oto przykład:
def nasza_funkcja(argument1, argument2):
	return f'{argument1} {argument2}'

print(nasza_funkcja("Poczatek", "Koniec"))
Instrukcja return zwraca podany obiekt. Aby wywołać funkcję należy napisać jej nazwę, a po niej argumenty (parametry) funkcji (funkcja może nie wymagać argumentów). Kolejność i liczba argumentów przekazanych do funkcji musi zgadzać się z definicją funkcji. Można też przekazywać parametry przypisując je konkretnym zmiennym zadeklarowanych w funkcji:
nasza_funkcja(argument1="Poczatek", argument2="Koniec")
Możemy także w definicji funkcji przypisać argumentom domyślne wartości (argumenty hasłowe), które będą użyte jeżeli przy wywołaniu funkcji nie będą podane wartości dla nich (argumenty opcjonalne):
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:

(1,) {'z': 2}

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:
lambda argument : wyrażenie
Argumenty to lista argumentów oddzielona przecinkami, a "wyrażenie" to wyrażenie wykorzystujące te argumenty. Przykłady:
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))
Pierwszy argument to nazwa funkcji przyjmującej jeden argument, drugi to lista/tupla/słownik. Wynik zwracany jest w postaci listy.
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)))
Wynik powyższego kodu to:
[(1, 2), (3, 4), (5, 6)]
Funkcja reduce() pobiera dane z sekwencji i zwraca na ich podstawie pojedynczą wartość np. sumę liczb. Funkcja ta wykonuje podaną jako pierwszy argument funkcję dla pierwszych dwóch elementów sekwencji a następnie wykonuje tą funkcję dla wyniku i trzeciego elementu - i tak do wyczerpania elementów sekwencji:
from functools import reduce

liczby = [2,2,2,2,2]
def suma(x,y):
	return x + y

print(reduce(suma, liczby))
Funkcja filter filtruje elementy sekwencji przy użyciu podanej funkcji, która musi zwracać wartość Prawda lub Fałsz:
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)'))
RkBlog

Podstawy Pythona, 14 July 2008, Piotr Maliński

Comment article
RkBlog main page Search RSS Contact