LEKCJA 5. Funkcje – porządkujemy program i samodzielnie rozwiązujemy problem

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 * 2
wynik = 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:

  1. utwórz funkcję przyjmującą dwa parametry,
  2. w funkcji oblicz pole,
  3. zwróć wynik,
  4. poza funkcją pobierz dane,
  5. wywołaj funkcję,
  6. wyświetl wynik.

Program:

def oblicz_pole(a, b):
pole = a * b
return pole
dlugosc = 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 20
a = 10, b = 2 → wynik 20
a = 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:

  1. pobrać dwie liczby,
  2. wywołać funkcję,
  3. 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 b
x = 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 a
x = 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 + b
x = 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 3
2 i 7
5 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:

  1. pięć razy pobrać liczbę punktów,
  2. policzyć wyniki wynoszące co najmniej 50 punktów,
  3. 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 licznik
wynik = 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.