Temat 1/ Klasa 3/ Lekcja 5
1. Co to jest funkcja?
W większych programach warto dzielić rozwiązanie na mniejsze części.
Służą do tego między innymi funkcje.
Funkcja to nazwany fragment programu wykonujący określone zadanie.
Poznaliśmy już gotowe funkcje Pythona:
print()input()int()float()
Możemy również tworzyć własne.
2. Najprostsza funkcja bez parametrów
def powitanie(): print("Witaj!")
Słowo:
def
informuje Pythona, że definiujemy własną funkcję.
powitanie to jej nazwa.
Samo zdefiniowanie funkcji nie powoduje jeszcze jej wykonania.
Musimy ją wywołać:
powitanie()
Cały program:
def powitanie(): print("Witaj!")powitanie()
3. Funkcja z parametrem
Funkcji możemy przekazać dane.
def powitanie(imie): print("Witaj", imie)powitanie("Anna")
imie jest parametrem funkcji.
Możemy później wykonać:
powitanie("Kasia")powitanie("Tomek")
Ta sama funkcja działa dla różnych danych.
4. Funkcja z dwoma parametrami
def pole_prostokata(a, b): pole = a * b print("Pole:", pole)pole_prostokata(5, 4)
Parametry:
a, b
otrzymują wartości:
5 i 4
Funkcja oblicza:
5 * 4
i wyświetla:
Pole: 20
5. Funkcja zwracająca wynik
Funkcja może również zwrócić wartość.
Służy do tego return.
def pole_prostokata(a, b): pole = a * b return pole
Teraz możemy napisać:
wynik = pole_prostokata(5, 4)print(wynik)
Funkcja oblicza pole i przekazuje wynik do miejsca, z którego została wywołana.
6. print() a return
Te dwie instrukcje nie oznaczają tego samego.
print(wynik)
wyświetla wartość na ekranie.
Natomiast:
return wynik
zwraca wartość z funkcji, dzięki czemu można ją później wykorzystać w programie.
Przykład:
def podwoj(liczba): return liczba * 2wynik = podwoj(6)print(wynik)
Wynik:
12
7. Funkcja i instrukcja warunkowa
Funkcja może wykorzystywać poznane wcześniej konstrukcje.
def sprawdz_liczbe(liczba): if liczba > 0: print("Dodatnia") elif liczba < 0: print("Ujemna") else: print("Zero")
Wywołanie:
sprawdz_liczbe(-5)
spowoduje wyświetlenie:
Ujemna
8. Projektujemy rozwiązanie
Problem:
Napisz program, który pobiera od użytkownika długość i szerokość prostokąta. Obliczanie pola powinno zostać wykonane przez funkcję z parametrami.
Plan:
- utwórz funkcję przyjmującą dwa parametry,
- w funkcji oblicz pole,
- zwróć wynik,
- poza funkcją pobierz dane,
- wywołaj funkcję,
- wyświetl wynik.
Program:
def oblicz_pole(a, b): pole = a * b return poledlugosc = float(input("Podaj długość: "))szerokosc = float(input("Podaj szerokość: "))wynik = oblicz_pole(dlugosc, szerokosc)print("Pole wynosi:", wynik)
9. Testowanie funkcji
Nie musimy za każdym razem testować programu przypadkowymi wartościami.
Dla funkcji:
def oblicz_pole(a, b): return a * b
możemy zaplanować testy:
a = 5, b = 4 → wynik 20a = 10, b = 2 → wynik 20a = 2.5, b = 4 → wynik 10
Jeżeli otrzymujemy oczekiwane wyniki, zwiększa to nasze zaufanie do poprawności rozwiązania.
10. Pełny proces rozwiązywania problemu
Przy samodzielnym zadaniu warto postępować według schematu:
Krok 1. Zrozum problem
Co program ma zrobić?
Krok 2. Określ dane
Co użytkownik podaje?
Krok 3. Określ wynik
Co program ma wyświetlić lub obliczyć?
Krok 4. Zaplanuj rozwiązanie
Jakie działania trzeba wykonać i w jakiej kolejności?
Krok 5. Dobierz konstrukcje Pythona
Czy potrzebujemy:
- zmiennych,
input(),- obliczeń,
if,for,while,- funkcji?
Krok 6. Napisz program
Zamień plan na kod.
Krok 7. Dobierz dane testowe
Sprawdź różne przypadki.
Krok 8. Popraw błędy
Jeżeli wynik jest nieprawidłowy, znajdź przyczynę, popraw kod i wykonaj test ponownie.
Zadanie podsumowujące
Napisz funkcję:
wieksza(a, b)
która otrzymuje dwie liczby i zwraca większą z nich.
Następnie program ma:
- pobrać dwie liczby,
- wywołać funkcję,
- wyświetlić większą liczbę.
Najpierw spróbuj samodzielnie zaplanować i napisać rozwiązanie.
Który program jest prawidłowy?
A
def wieksza(a, b): if a > b: return a else: return bx = float(input("Podaj pierwszą liczbę: "))y = float(input("Podaj drugą liczbę: "))wynik = wieksza(x, y)print("Większa liczba:", wynik)
B
def wieksza(a, b): if a > b: return b else: return ax = float(input("Podaj pierwszą liczbę: "))y = float(input("Podaj drugą liczbę: "))wynik = wieksza(x, y)print("Większa liczba:", wynik)
C
def wieksza(a, b): if a > b: print(a) else: print(b)x = float(input("Podaj pierwszą liczbę: "))y = float(input("Podaj drugą liczbę: "))wynik = wieksza(x, y)print("Większa liczba:", wynik)
D
def wieksza(a, b): return a + bx = float(input("Podaj pierwszą liczbę: "))y = float(input("Podaj drugą liczbę: "))wynik = wieksza(x, y)print("Większa liczba:", wynik)
Wskazówka
Funkcja ma zwrócić większą wartość, a nie sumę obu liczb.
Zwróć również uwagę na różnicę między:
print()
a:
return
Odpowiedź
Prawidłowa odpowiedź: A.
Jeżeli a > b, funkcja zwraca a. W przeciwnym przypadku zwraca b.
B jest błędne, ponieważ zwraca mniejszą wartość.
C jest błędne, ponieważ funkcja jedynie wyświetla większą wartość. Nie zwraca jej za pomocą return. W efekcie zmienna wynik nie otrzyma oczekiwanej liczby.
D jest błędne, ponieważ oblicza sumę dwóch liczb zamiast wybierać większą.
Dane testowe
Warto sprawdzić:
8 i 32 i 75 i 5-2 i -8
Ostatni przykład pokazuje, dlaczego dane testowe powinny być różnorodne.
Zadanie z gwiazdką ★
Napisz program wykorzystujący funkcję:
policz_zaliczone()
Funkcja nie ma parametrów.
Powinna:
- pięć razy pobrać liczbę punktów,
- policzyć wyniki wynoszące co najmniej 50 punktów,
- zwrócić liczbę zaliczonych wyników.
Następnie program powinien wyświetlić wynik.
Rozwiązanie
def policz_zaliczone(): licznik = 0 for i in range(5): punkty = int(input("Podaj liczbę punktów: ")) if punkty >= 50: licznik = licznik + 1 return licznikwynik = policz_zaliczone()print("Liczba zaliczonych wyników:", wynik)
Dlaczego rozwiązanie jest bardziej wymagające?
Trzeba prawidłowo połączyć:
- funkcję bez parametrów,
- zmienną,
- pętlę,
- pobieranie danych,
- instrukcję warunkową,
- licznik,
return.
Nie pojawia się jednak żadna konstrukcja, której wcześniej nie poznaliśmy.
