← Lekcje
Python · lekcja 12

Funkcje: def, parametry, return

  1. Po co funkcja: ten sam przepis zapisany raz
  2. Budowa: def, nawias, dwukropek, wcięty blok
  3. return: skąd program bierze wynik funkcji
  4. Zmienna lokalna i opis funkcji w jednej linii
Rozgrzewka · 3 minuty

Co pamiętacie z lekcji o napisach?

  1. Ile wynosi len("Python")?
  2. Co da wycinek "Python"[0:3]?
  3. Zmienna name ma wartość "Ola". Co wypisze print(f"Cześć, {name}!")?
Część 1 · Po co funkcja

Ten sam przepis zapisany raz

Funkcja to nazwany kawałek programu, który robi jedną rzecz. Zapisujecie go raz, a potem wystarczy podać jego nazwę, żeby wykonał się od nowa. Tak samo działa przepis w książce kucharskiej: opis jest jeden, a naleśniki smażycie wiele razy.

Bez funkcji: trzy razy to samo print(2 * 2 * 2) print(5 * 5 * 5) print(9 * 9 * 9) poprawka w trzech miejscach Z funkcją: przepis jeden def cube(n): return n * n * n print(cube(2), cube(5)) poprawka w jednym miejscu
docs.python.org, The Python Tutorial, rozdz. 4.8 (Defining Functions) · Podręcznik Informatyka na czasie 2 (Nowa Era), s. 121 (8.2 Podzielność liczb, pojęcie z marginesu: funkcja)
Część 1 · Budowa funkcji

Nagłówek, wcięty blok i słowo return

def function_name(parameters):
    statements
    return result
  • Nagłówek: słowo def, nazwa, parametry w nawiasie, dwukropek.
  • Blok: instrukcje wcięte o 4 spacje, tak jak pod if.
  • return: oddaje wynik temu, kto funkcję wywołał.
def area_of_square(a):
    return a * a

print(area_of_square(5))
print(area_of_square(12))
25
144
docs.python.org, The Python Tutorial, rozdz. 4.8 (Defining Functions) · Podręcznik Informatyka na czasie 2 (Nowa Era), s. 226 (dodatek 7 Podstawowe typy instrukcji, budowa funkcji)
Część 2 · Definicja kontra wywołanie

Zapisanie przepisu to jeszcze nie gotowanie

def area_of_square(a): return a * a DEFINICJA Python zapamiętuje przepis i nic jeszcze nie liczy print(area_of_square(5)) WYWOŁANIE dopiero teraz Python liczy i oddaje wynik 25 wchodzi 5 wraca 25

Funkcja bez wywołania nie robi nic, tak jak przepis, którego nikt nie użył. Ta sama definicja obsłuży area_of_square(5), area_of_square(12) i każdą inną liczbę.

docs.python.org, The Python Tutorial, rozdz. 4.8 (Defining Functions) · Podręcznik Informatyka na czasie 2 (Nowa Era), s. 121–122 (8.2 Podzielność liczb, definicja funkcji i jej wywołanie)
Część 2 · Parametr i argument

Nazwa w definicji, wartość w wywołaniu

def add(a, b):
    return a + b

print(add(2, 3))
print(add(10, 7))
5
17
  • Parametr to nazwa w nawiasie definicji: tu a i b. To pusta szufladka, która czeka na wartość.
  • Argument to wartość podana w wywołaniu: tu 2 i 3, potem 10 i 7.
  • Pierwszy argument trafia do pierwszego parametru, drugi do drugiego.
docs.python.org, The Python Tutorial, rozdz. 4.8 (Defining Functions) · Podręcznik Informatyka na czasie 2 (Nowa Era), s. 122–123 (8.2 Podzielność liczb, pojęcie z marginesu: parametry formalny i aktualny funkcji)
Część 2 · Instrukcja return

Wypisać to nie to samo co oddać

def show_hello():
    print("Cześć!")

result = show_hello()
print(result)
Cześć!
None

print pokazuje coś człowiekowi na ekranie. return oddaje wartość programowi, który funkcję wywołał, więc da się ją zapamiętać w zmiennej albo policzyć dalej.

Funkcja bez return też się wykonuje, ale oddaje None, czyli „nic”. Dlatego result ma wartość None.

W praktyce: programiści Pythona mają wspólny zbiór zaleceń PEP 8. Nazwy funkcji pisze się w nim małymi literami, a słowa rozdziela podkreśleniem, na przykład total_price.

docs.python.org, The Python Tutorial, rozdz. 4.8 (Defining Functions) · ciekawostka: peps.python.org/pep-0008/ (Function and Variable Names)
Część 3 · Zmienna lokalna

Co powstaje w funkcji, w funkcji zostaje

def total_price(price, count):
    total = price * count
    return total

print(total_price(3, 4))
print(total)
12
Traceback (most recent call last):
  File "prices.py", line 6, in <module>
    print(total)
NameError: name 'total'
is not defined

Zmienna total powstaje dopiero przy wywołaniu funkcji i znika, gdy funkcja się kończy. Taką zmienną nazywamy lokalną. Reszta programu jej nie widzi, dlatego print(total) kończy się błędem NameError.

docs.python.org, The Python Tutorial, rozdz. 4.8 (Defining Functions, local symbol table)
Część 3 · Opis funkcji

Jedna linia, która mówi, co funkcja robi

def kelvin(celsius):
    """Zamienia Celsjusza na kelwiny."""
    return celsius + 273.15

print(kelvin(20))
print(kelvin.__doc__)
293.15
Zamienia Celsjusza na kelwiny.

Napis w potrójnych cudzysłowach tuż pod nagłówkiem to docstring, czyli opis funkcji. Python zapamiętuje go i oddaje przez function_name.__doc__.

W praktyce: z docstringów gotowe narzędzia składają dokumentację całego programu, więc firmy wymagają ich w każdej funkcji.

docs.python.org, The Python Tutorial, rozdz. 4.9.7 (Documentation Strings)
Ćwiczenie · przy komputerze · 12 minut

Ćwiczenie: trzy własne funkcje

Załóż plik functions.py. Po każdym zadaniu uruchom program i sprawdź, czy wynik zgadza się z tym, co sam policzyłeś.

  1. Napisz funkcję cube z jednym parametrem, która oddaje sześcian liczby. Wywołaj ją dla 3 i dla 7.
  2. Napisz funkcję average z dwoma parametrami, która oddaje średnią dwóch liczb. Wywołaj ją dla 4 i 7.
  3. Napisz funkcję shout, która dostaje imię i oddaje je wielkimi literami z trzema wykrzyknikami. Wywołaj ją dla "ola".
Wskazówka

Gdy Python zgłosi IndentationError, sprawdź wcięcie w bloku funkcji: cztery spacje, w każdej linii tyle samo. Gdy program nic nie wypisuje, brakuje wywołania funkcji w print.

Sprawdzenie

Trzy pytania na koniec

  1. Czym różni się definicja funkcji od jej wywołania?
  2. Czym różni się print w funkcji od return w funkcji?
  3. Dlaczego zmiennej utworzonej wewnątrz funkcji nie da się użyć poza nią?
Podsumowanie

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
Kilka funkcji w jednym plikuFunkcje grupuje się w moduły, a program dołącza je poleceniem importrozszerzane
Nazwa area_of_squareZespoły trzymają się jednego zapisu z zaleceń PEP 8: małe litery i podkreśleniastandard
Docstring dla siebieNarzędzia składają z docstringów dokumentację całego projektucodziennie
return oddaje jedną wartośćFunkcja może oddać kilka wartości naraz, jak divmod(a, b): iloraz i resztęrozszerzane
docs.python.org, The Python Tutorial, rozdz. 6 (Modules) i rozdz. 4.9.7 (Documentation Strings) · peps.python.org/pep-0008/ (Function and Variable Names) · docs.python.org, Built-in Functions (divmod)