10: def

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:

  1. 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 funkcji x * x, pamiętając, że x równa się 10. Dlatego x * x daje 100, które jest drukowane.
  2. 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 zwraca 4.
    • Następnie brana jest pod uwagę zewnętrzna część; ponieważ kwadrat(2) dał 4, teraz mamy kwadrat(4). To zwraca 16, które jest drukowane.

Cztery Najczęstsze Błędy

Jednym z błędów popełnionym podczas definiowania funkcji jest zapominanie o instrukcji  return.

Przykład
Błąd 1: zapomnienie 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:
Przykład: Efekt uboczny i brak instrukcji return

Innym częstym błędem jest zapominanie o wcięciu kodu, co powoduje IndentationError.

Przykład
Błąd 2: zapomnienie wcięcia

Jak widzieliśmy w lekcji 2, wywołanie za mało lub zbyt wiele argumentów powoduje błąd.

Przykład
Błąd 3: wywołanie zbyt wielu argumentów

Na koniec, jeśli podczas definiowania lub wywoływania funkcji popełnisz typowy błąd, otrzymasz informację o błędzie, że funkcja jest niezdefiniowana.

Przykład
Błąd 4: błąd nazwy

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').

Zadanie na kodowanie : Sześcian
Zdefiniuj funkcję cube(n), która pobiera na wejściu jedną liczbę n a wyświetla na wyjściu jego sześcian n × n × n.
Wpisz polecenia takie jak print(mafonction("test-argument")) w polu poniżej.

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:

Zadanie wielokrotnego wyboru: In-n-Out
Co otrzymamy na wyjściu tego programu?

def f():          # function of 0 arguments
print("in f")
print("not in f")
f() # call f now
Poprawnie! Funkcja 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:

\textrm{perimeter = width + height + width + height}

Zobacz przykładowy schemat.



Zadanie na kodowanie : Prostokąt
Definiowanie funkcji rectanglePerimeter(width, height), która oblicza pole prostokąta.
Wpisz polecenia takie jak print(mafonction("test-argument")) w polu poniżej.

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ę!