Definicja funkcji
W tej lekcji pokażemy najważniejszą ideę programowania: definiowanie własnych funkcji! Funkcje pozwalają uczynić program krótszym, lepiej zorganizowanym, łatwiejszym do odczytania, debugowania i co też jest ważne, funkcje są wielokrotnego użytku. W późniejszych lekcjach zobaczymy inne korzyści, takie jak rekurencja (rekursja).
Zaczniemy od przykładu. Pamiętasz funkcję abs
? Pobiera jeden argument (liczbę x) i zwraca wartość bezwzględną (czyli x, gdy x ≥ 0, i -x, gdy x < 0). Sposób definiowania tej funkcji w Pythonie jest następujący:
def abs(x): # definicja funkcji o nazwie 'abs' z jednym argumentem o nazwie 'x' if x >= 0: # tu się zaczyna ciało funkcji return x else: return -x # tu się kończy ciało funkcji(Kliknij tutaj aby zobaczyć ten kod w konsoli.)
Dwie Części Definicji Funkcji
Pierwsza linia w definicji funkcji określa nazwę funkcji i jej argumenty. To powinno wyglądać tak
def «function-name»(«argument-list»):
W powyższym przykładzie abs
był nazwą funkcji, a x
listą argumentów. Jest to lista argumentów, ponieważ może istnieć wiele argumentów, takich jak x, y, z
; Możliwe jest również zero argumentów, tzn. pusta lista. Argumenty są wejściami funkcji.
Wszystko po pierwszej linijce definicji funkcji jest ciałem funkcji. Ciało jest wciętym blokiem kodu. Kiedy wywołana jest funkcja, ciało jest wykonywane na tych argumentach / wejściach. Wreszcie, kiedy docieramy do tej linii w ciele funkcyjnym,
return «value»
funkcja przestaje działać i zwraca «value»
jako wyjście. Oznacza to, że wartość zwracana jest wynikiem funkcji. Jak pokazuje przykład abs
, ciało może zawierać kilka wyjść
; Ale tylko pierwszy wykonany ma swój efekt, ponieważ funkcja przestaje działać.
Przykład: Definiowanie i Wywołanie Funkcji
Poniższy program zawiera definicję funkcji i niektóre inne instrukcje, które są wykonywane po zdefiniowaniu funkcji. Czy możesz odgadnąć, jakie będzie wyjście?
Widzimy, że funkcja nazywa się kwadrat
i ma tylko jeden argument x
, a ciało funkcji składa się z jednej linii return x*x
. Następnie, poza funkcją mamy dwa polecenia, które wywołują tę funkcję łącznie trzy razy.
Jak pokazuje wizualizator, każdorazowo przydzielany jest funkcji oddzielny fragmentu przestrzeni roboczej (a frame, ramka). Po zwróceniu funkcji ta przestrzeń robocza nie jest już potrzebna i jest wymazywana.
Tutaj słownie wyjaśnione są kolejne krok programu:
- Kiedy wykonywane jest pierwsze polecenie, Python musi obliczyć
kwadrat(10)
.- Python porównuje listę na wejściu
(10)
z listą argumentów(x)
. Wykonuje ciało funkcjix * x
, pamiętając, żex
równa się10
. Dlategox * x
daje100
, które jest drukowane.
- Python porównuje listę na wejściu
- Gdy wykonywane jest drugie polecenie, Python musi obliczyć
kwadrat(kwadrat(2))
.- Najpierw rozważana jest wewnętrzna część
kwadrat(2)
. Tymczasowo x jest równe 2 i realizowane jest ciało funkcji, które zwraca4
. - Następnie brana jest pod uwagę zewnętrzna część; ponieważ
kwadrat(2)
dał4
, teraz mamykwadrat(4)
. To zwraca16
, które jest drukowane.
- Najpierw rozważana jest wewnętrzna część
Cztery Najczęstsze Błędy
Jednym z błędów popełnionym podczas definiowania funkcji jest zapominanie o instrukcji return
.
Jak widać, jeśli w ciele nie ma return
, funkcja domyślnie zwraca None
. Tak więc, jeśli są jakiekolwiek braki w zadaniu, funkcja zwraca None
; często problem ten występuje w związku z faktem, że niektóre wejścia funkcji nie powodują wykonania instrukcji return
.
Możesz też celowo pominąć instrukcje return . Ma to sens tylko wtedy, gdy Twoja funkcja ma jakiś efekt uboczny inny niż jego wartość zwracana, na przykład drukowanie niektórych danych wyjściowych:
|
Innym częstym błędem jest zapominanie o wcięciu kodu, co powoduje IndentationError
.
Jak widzieliśmy w lekcji 2, wywołanie za mało lub zbyt wiele argumentów powoduje błąd.
Na koniec, jeśli podczas definiowania lub wywoływania funkcji popełnisz typowy błąd, otrzymasz informację o błędzie, że funkcja jest niezdefiniowana.
Spróbuj Sam
Nie musisz używać input() , czy print() w tym, ani w kolejnych ćwiczeniach, w których zostaniesz poproszony o "zdefiniowanie funkcji". Nasz tester automatycznie wywoła Twoją funkcję z argumentami, sprawdzi wynik i bezpośrednio zwróci .
Prawidłowym rozwiązaniem tego szczególnego ćwiczenia będą 2 wiersze (zobacz na górze tej lekcji 'Dwie Części Definicji Funkcji'). |
Dwa Argumenty lub Więcej
Powyższe funkcje pobierają tylko jeden argument, ale funkcja może zostać zaprojektowana do pobierania dowolnej liczby argumentów. Na przykład, chcesz wywołać input()
z 0 argumentami (zdefiniujesz funkcję z zerowymi argumentami w lekcji 15A).
Oto przykład z geometrii z dwoma argumentami. Załóżmy, że potrzebujemy funkcję do obliczania pola trójkąta dysponując długością podstawy i jego wysokością. Wzór na pole:
pole = podstawa × wysokość / 2
W kodzie wygląda to tak: wymieniamy def «function-name»(«argument1»)
z def «function-name»(«argument1», «argument2»)
.
Inną ważną rzeczą na którą trzeba zwrócić jest to, że gdy funkcja jest definiowana, to różni się od funkcji kiedy jest wykonywana. Ciało nie działa, dopóki funkcja nie zostanie faktycznie wywołana. Aby to sprawdzić, wykonaj poniższe ćwiczenie:
def f(): # function of 0 arguments
print("in f")
print("not in f")
f() # call f now
f
jest zdefiniowana jako pierwsza, ale ciało nie jest od razu wykonywane. Po funkcji, drukujemy wyjście not in f
. Dopiero po tym, wywoływana jest funkcja, ciało jest realizowane i drukowane in f
.W ostatnim ćwiczeniu poprosimy cię, abyś napisał własną funkcję z dwoma argumentami obliczającą obwód prostokąta. (Obwód jest sumą długości wszystkich boków). W prostokącie o danej szerokości i wysokości obwód jest podany następująco:
Zobacz przykładowy schemat.
Funkcje Wywoływanych Funkcji
Funkcje są elementami konstrukcyjnymi dużych programów: możesz wykonać to samo zadanie dwukrotnie, bez dwukrotnego pisania tego samego kodu i można ponownie zastosować rozwiązania typowych zadań. Oto przykład budowy jednej funkcji i używania jej w innej.
Czy możesz odgadnąć, zanim program uruchomisz, jaki program da efekt? Pamiętasz z lekcji 4, że mnożenie łańcucha przez liczbę całkowitą oznacza wielokrotne powtórzenie łańcucha, np. "tar"*2 daje "tartar" . |
Przeciągnij pionową, szarą linię w lewo i w prawo, aby wybrać kod & wizualizację.
Możesz zobaczyć nowe zjawisko w wizualizacji: w kolumnie "Frames" (ramki), gdy jesteśmy między krokiem 8 z 30, istnieją nie tylko zmienne globalne, ale dwie ramki (jedna outer
i druga inner
, która właśnie została stworzona). outer
czeka, aż inner
zostanie całkowicie skończona, a następnie outer
jest kontynuowana. Zdarza się, że następuje kolejne wezwanie do inner
i outer
znowu czeka; a kiedy inner
jest gotowa, outer
jest kontynuowana. Wreszcie, my wywołujemy outer
i cały proces jest powtarzany.
Jesteś gotowy na następną lekcję!