[ Pobierz całość w formacie PDF ]
4.7. Jeszcze więcej o definiowaniu funkcji 23
i = 5
def f(arg = i): print arg
i = 6
f()
wypisze5.
Ważne ostrzeżenie: wartość domyślna określana jest tylko raz. Ma to znaczenie w przypadku, gdy wartością tą
jest obiekt mutowalny, jak np. lista czy słownik. W przykładzie poniżej, funkcja akumuluje argumenty przekazane
jej w kolejnych wywołaniach:
def f(a, l = []):
l.append(a)
return l
print f(1)
print f(2)
print f(3)
Instrukcjeprintspowodują:
[1]
[1, 2]
[1, 2, 3]
jeśli nie chce się, aby wartości domyślne były współdzielone pomiędzy kolejnymi wywołaniami funkcji, można
ją napisać w taki sposób:
def f(a, l = None):
if l is None:
l = []
l.append(a)
return l
4.7.2 Argumenty kluczowe
Funkcja może być wywołana z użyciem argumentów kluczowych, tzn. w formie klucz = wartość . Na
przykład, poniższa funkcja:
def papuga(napiecie, stan= racja , akcja= voom , typ= Norwegian Blue ):
print "-- Ta papuga nie zrobiłaby", akcja
print "jeśli przyłożysz", napiecie, "woltów do niej."
print "-- Zliczne upierzenie, ten", typ
print "-- Tak,", stan, "!"
mogłaby być wywołana na parę różnych sposobów:
papuga(1000)
papuga(akcja = VOOOOOM , napiecie = 1000000)
papuga( tysiąc , stan = już wącha kwiatki od spodu )
parrot( milion , bereft of life , skoku )
lecz poniższe wywołania byłyby nieprawidłowe:
24 Rozdział 4. Jeszcze więcej sposobów na kontrolowanie programu
papuga() # brakuje wymaganego argumentu
papuga(napiecie=5.0, trup ) # niekluczowy argument za kluczowym
papuga(110, napiecie=220) # zduplikowana wartość argumentu
papuga(aktor= John Cleese ) # nieznana nazwa argumentu
W ogólności mówiąc,5 lista argumentów wywołania, musi mieć jakiś argument pozycyjny, po którym następuje
jakikolwiek argument kluczowy, gdzie klucze wybrane są z listy parametrów formalnych. Nie jest ważne, czy
parametr formalny ma wartość domyślną, czy też nie. %7ładen z argumentów nie może otrzymać wartości więcej
niż jeden raz nazwy parametrów formalnych odpowiadające argumentom pozycyjnym w wywołaniu nie mogą
być w nim użyte jako kluczowe. Oto przykład wywołania, które się nie powiedzie z uwagi na wymienione przed
chwilą ograniczenia:
>>> def function(a):
... pass
...
>>> function(0, a=0)
Traceback (innermost last):
File "", line 1, in ?
TypeError: keyword parameter redefined
Gdy na liście parametrów formalnych funkcji widnieje**nazwa, to przy wywołaniu funkcji przypisywany jest mu
słownik zawierający wszystkie klucze, które nie odpowiadają nazwom parametrów formalnych. Mechanizm ten
może być połączony z wystąpieniem parametru formalnego o nazwie*nazwa (co zostanie opisane w następnym
podrozdziale), który w momencie wywołania staje się krotką (ang. tuple), która zawiera wszystkie argumenty
pozycyjne (niekluczowe) wymienione w wywołaniu funkcji za parametrami formalnymi. (*nazwa musi pojawić
się przed**nazwa na liście parametrów formalnych). Jeżeli, na przykład, zdefiniujemy funkcję w ten sposób:
def sklep_z_serami(rodzaj, *argumenty, **klucze):
print "-- Czy macie", rodzaj, ?
print "-- Przykro mi,", rodzaj, "właśnie się skończył."
for arg in argumenty: print arg
print - *40
for kl in klucze.keys(): print kl, : , klucze[kl]
która mogłaby być wywołana o tak6:
sklep_z_serami( Limburger , "Jest bardzo dojrzały, proszę pana.",
"Jest naprawdę bardzo, BARDZO dojrzały, proszę pana.",
klient= John Cleese ,
wlasciciel= Michael Palin ,
skecz= Skecz ze sklepem z serami )
co oczywiście spowoduje wypisanie:
5
jak mawiał Nikuś Dyzma (przyp. tłum.)
6
To jest bardzo nieudolne tłumaczenie tego prześmiesznego skeczu. Z.p. Beksiński zrobił to wiele śmieszniej: niestety, nie miałem tego
nagrania przy sobie (przyp. tłum.)
4.7. Jeszcze więcej o definiowaniu funkcji 25
-- Czy macie Limburger ?
-- Przykro mi, Limburger właśnie się skończył.
Jest bardzo dojrzały, proszę pana.
Jest naprawdę bardzo, BARDZO dojrzały, proszę pana.
----------------------------------------
klient : John Cleese
wlasciciel : Michael Palin
skecz : Skecz ze sklepem z serami
4.7.3 Lista arbitralnych argumentów
Ostatnim sposobem na to, aby funkcja została wywołana w dowolną liczbą argumentów jest wprost określenie
tego w definicji. Wszystkie argumenty zostaną zapakowane w krotkę.7 Przedtem na liście argumentów może
pojawić się zero lub więcej normalnych argumentów.
def fprintf(plik, format, *args):
plik.write(format % args)
4.7.4 Formy lambda
Ze względu na wzrastającą liczbę głosów użytkowników, dodano do Pythona parę nowych właściwości spo-
tykanych zwykle w językach funkcjonalnych. Za pomocą słowa kluczowego lambda możesz tworzyć małe,
anonimowe (czyli nienazwane) funkcje. Oto funkcja, która zwraca sumę jej dwóch argumentów: lambda a,
b: a+b . Formy lambda mogą zostać użyte we wszystkich miejscach, gdzie wymagane są obiekty funkcji.
Składniowo ograniczone są do pojedynczego wyrażenia. Semantycznie, są właściwie szczyptą cukru na składnię
zwykłych definicji funkcji. Podobnie jak zagnieżdżone definicje funkcji, formy lambda nie mogą używać nazw
[ Pobierz całość w formacie PDF ]