Kurs Python · Moduł 1: Podstawy Pythona
Funkcje - Narzędzia eksploracyjne
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/hRóż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) # NoneFunkcja 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)) # TrueWynik 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) areturn(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. Którym słowem kluczowym definiujemy funkcję?
2. Do czego służy return w funkcji?
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: