Kurs Python · Moduł 1: Podstawy Pythona

Funkcje - Narzędzia eksploracyjne

4 min czytania ·
W tej lekcji7

Witaj! Po każdym etapie trasy liczysz średnią prędkość marszu. Za trzecim razem przepisujesz ten sam wzór i robisz literówkę. Dobry badacz nie wykonuje każdej czynności od zera. Ma gotowe narzędzia: jeden ruch maczetą, jeden gest na rozbicie namiotu. W programowaniu takie wielokrotnie używane narzędzie nazywamy funkcją. Funkcja to nazwany blok kodu, który możemy uruchomić, kiedy tylko chcemy.

Definiowanie funkcji - słowo def

Funkcję tworzymy słowem kluczowym def (od "define" - zdefiniować). Podajemy nazwę funkcji, nawiasy i dwukropek, a poniżej - wcięty blok kodu. Wcięcie, zwykle cztery spacje, mówi Pythonowi, które linie należą do funkcji:

def greet_explorer():
    print("Witaj na Safari!")
    print("Darwin życzy udanej ekspedycji.")

# Wywołanie funkcji - uruchamiamy ją po nazwie
greet_explorer()

Samo zdefiniowanie funkcji jej nie uruchamia - to jak napisanie instrukcji obsługi narzędzia. Aby narzędzia użyć, musimy je wywołać, pisząc nazwę z nawiasami: greet_explorer(). Możemy ją wywołać wiele razy! Sama nazwa bez nawiasów niczego nie wykona - to tylko narzędzie wiszące na haku.

Parametry - przekazywanie danych do funkcji

Narzędzie staje się potężniejsze, gdy możemy mu coś przekazać. Parametry to dane, które funkcja przyjmuje w nawiasach. W definicji name jest miejscem na wartość, a przy wywołaniu podajemy konkretny argument:

def greet_explorer(name):
    print(f"Witaj, {name}, na Safari!")

greet_explorer("Darwin")   # Witaj, Darwin, na Safari!
greet_explorer("Ania")     # Witaj, Ania, na Safari!

Ta sama funkcja wypisała dwa różne powitania, bo przy każdym wywołaniu name dostaje nową wartość. Parametr żyje tylko wewnątrz funkcji - poza nią nazwa name nie istnieje.

Funkcja może przyjmować wiele parametrów. Oddzielamy je przecinkami, a argumenty trafiają na swoje miejsca według kolejności:

def describe_animal(species, weight):
    print(f"{species} waży {weight} kg.")

describe_animal("Słoń", 5000)  # Słoń waży 5000 kg.
describe_animal("Lew", 190)    # Lew waży 190 kg.

Kolejność ma znaczenie: describe_animal(5000, "Słoń") wypisze zdanie "5000 waży Słoń kg." - Python nie zgadnie, o co Ci chodziło.

Zwracanie wartości - słowo return

Do tej pory funkcje tylko wyświetlały tekst. Ale często chcemy, aby funkcja obliczyła coś i oddała nam wynik. Do tego służy słowo return:

def calculate_speed(distance, time):
    speed = distance / time
    return speed

# Wynik możemy zapisać do zmiennej
result = calculate_speed(30, 4)
print(f"Prędkość: {result} km/h")   # Prędkość: 7.5 km/h

# Albo użyć od razu
print(f"Prędkość: {calculate_speed(60, 3)} km/h")   # Prędkość: 20.0 km/h

Różnica jest ważna: print() tylko pokazuje tekst na ekranie, a return oddaje wartość, którą możemy dalej wykorzystać w obliczeniach. Po wykonaniu return funkcja natychmiast się kończy.

Co się dzieje bez return?

Najczęstszy błąd początkujących tropicieli: funkcja wypisuje wynik zamiast go zwrócić. Na ekranie wszystko wygląda dobrze, ale do zmiennej nic nie trafia:

def show_speed(distance, time):
    print(distance / time)

result = show_speed(30, 4)  # wypisze 7.5
print(result)               # None

Funkcja bez return zwraca None, czyli "brak wartości" z lekcji o typach. Liczba 7.5 pojawiła się na ekranie, ale result jej nie przechowuje. Dlatego polecam: niech funkcje liczące zwracają wynik, a wyświetlanie zostaw kodowi, który je wywołuje.

Funkcje z warunkami - łączymy wiedzę

Funkcje mogą zawierać wszystko, czego się nauczyłeś/aś - warunki, pętle, operatory. Ta funkcja ocenia, czy zwierzę jest zbyt ciężkie, by podchodzić do niego blisko:

def is_dangerous(weight):
    if weight > 1000:
        return True
    else:
        return False

print(is_dangerous(5000))  # True (słoń)
print(is_dangerous(190))   # False (lew)

Działa, ale jest przegadane. Porównanie weight > 1000 samo jest już wartością True albo False, więc można je zwrócić wprost:

def is_dangerous(weight):
    return weight > 1000

print(is_dangerous(5000))  # True

Wynik jest identyczny, a funkcja krótsza o trzy linie. Taki zapis polecam - im mniej rozgałęzień, tym trudniej zabłądzić.

Praktyka

Napisz funkcję, która oblicza, ile dni zajmie przejście zadanego dystansu. Uruchom funkcję w edytorze i wywołaj ją dla innych wartości:

Kod do tej lekcji: main.py
# Funkcje - kalkulator dni ekspedycji

# TODO: zdefiniuj funkcję, która oblicza liczbę dni
# distance - dystans w km, daily_pace - km na dzień
def calculate_days(distance, daily_pace):
    days = distance / daily_pace
    return days

# TODO: wywołaj funkcję i wyświetl wynik
result = calculate_days(120, 30)
print(f"Ekspedycja zajmie {result} dni")

# Wypróbuj inne wartości:
print(f"100 km w tempie 25 km/dzień: {calculate_days(100, 25)} dni")

Podsumowanie

W tej lekcji stworzyłeś/aś własne narzędzia badacza:

  • def - definiuje funkcję (nazwany blok kodu)
  • Wywołanie funkcji przez nazwa()
  • Parametry - dane przekazywane do funkcji w nawiasach
  • return - zwraca wynik, który można dalej wykorzystać
  • Różnicę między print() (wyświetla) a return (oddaje wartość)

Gratulacje! Znasz już fundamenty Pythona: zmienne, typy, operatory, warunki, pętle i funkcje. Czas połączyć tę wiedzę w wielkim projekcie ekspedycji!

Pamiętaj: funkcja to narzędzie z plecaka - definiujesz je raz przez def, a potem sięgasz po nie wywołaniem, ile razy zechcesz.

Hasła z dokumentacji w tej lekcji

Widzisz błąd w tej lekcji?

Sprawdź się

Odpowiedz na pytania z tej lekcji. Wybierz odpowiedź, a od razu zobaczysz, czy jest poprawna.

  1. 1. Którym słowem kluczowym definiujemy funkcję?

  2. 2. Do czego służy return w funkcji?

  3. 3. Czym różni się print() od return?

Zadania praktyczne w grze

  • Klikanie w kolejności

    Kliknij elementy, aby wywołać funkcję greet():

  • Edytor kodu

    Zdefiniuj funkcję calculate_days(distance, daily_pace), która zwraca (return) distance / daily_pace. Wywołaj ją dla 150 km i 30 km dziennie i wyświetl wynik:

Przydatne artykuły