Rozdział 13 · Automatyzacja z funkcjami

Projektowanie dobrej funkcji

Zanim napiszesz implementację, warto zaprojektować funkcję: jeden jasny obowiązek, zrozumiała nazwa, wyraźny kontrakt.

Dobre imiona – czasowniki akcji

DobrzeZły
calculate_total()do_it()
normalize_text()func1()
draw_polygon()thing()
find_max_score()test2()

Funkcje zwykle przedstawiają DZIAŁANIE — nazwa powinna być czasownikiem lub zwrotem czasownikowym. Dla funkcji zwracających True/False, działają dobrze prefiksy is_, has_, can_, contains_ są heteroseksualni Zgłasza się, że wartość boolowska wróci.

Jedna funkcja, jedna jasna odpowiedzialność

plohaya_dekompoziciya.py
def process_everything():
    # prosi o opinię
    # sprawdzone
    # liczy się
    # odbitki
    # Losowanie
    # aktualizuje pięć struktur danych
    ...
horoshaya_dekompoziciya.py
def read_answer(): ...
def normalize_answer(answer): ...
def check_answer(answer, correct): ...
def show_result(correct): ...
To jest wytyczne, a nie dogmat
Małe programy mogą rozsądnie łączyć kilka prostych działań w jedną funkcję — nie musisz sztucznie dzielić każdej linii na osobną funkcję (zobacz §13.19 dla przykładu CZEGO NIE robić). Celem jest jasność, a nie liczba funkcji.

Ile linii powinna zajmować funkcja?

Nie ma zasady „maksymalnie 10 linijek”

Pytania zamiast liczby linii
1
Czy ma jeden jasny cel?
2
Czy nazwa wyjaśnia, co ona robi?
3
Czy łatwo jest to przetestować osobno?
4
Czy w środku jest mocno powtarzająca się logika?
5
Czy wejścia i wyjścia są czytelnikowi jasne?

Kontrakt funkcji

Zanim napiszesz implementację, warto wyraźnie sformułować kontrakt — co funkcja przyjmuje, co zwraca i czy ma efekty uboczne:

Część kontraktucalculate_discount(price, percent)
Logujprice: liczba, percent: liczba
Wyjścieobniżona cena
Skutki ubocznenie
Przykładcalculate_discount(100, 10) → 90

Warunki wstępne

Niektóre funkcje oczekują znaczących danych wejściowych, takich jak draw_polygon(sides, length) zakłada sides >= 3 oraz length > 0. To warunki wstępne — wymagania dotyczące danych wejściowych, które warto sprawdzić zwykłymi warunkami:

predusloviya.py
def polygon_angle(sides):
    if sides < 3:
        return None

    return 360 / sides
None nie jest jedyną opcją
Zwroty None przy niepoprawnym wejściu — prosty i działający wariant na tym etapie kursu. Bardziej rygorystyczne metody (na przykład zgłoszenie wyjątek) są omawiane w rozdziałach poświęconych obsłudze błędów.

Lista kontrolna projektowania cech

Zanim napiszesz def

  • Jaką JEDNĄ pracę ona wykonuje?
  • Jakie dane potrzebuje? To są parametry.
  • Czy zwraca wynik — i jaki wynik?
  • Czy to zmienia coś celowo (efekt uboczny)?
  • Jak nazwać ją tak, aby nazwa wyjaśniała akcję?
  • Na jakich danych wejściowych powinno być testowane?
Praktyka: projektowanie funkcji na podstawie kontraktu
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →