← Lekcje
Python · lekcja 22

Funkcje w Pythonie i podzielność

Liczby pierwsze, część 2 z 3

  1. Funkcja: przepis zapisany raz, używany wiele razy
  2. Czym różni się zapisanie przepisu od jego użycia?
  3. Program sprawdzający, czy liczba dzieli się przez 3
  4. Reszty z dzielenia przez 2, 3, 5 i 7 bez zmiany funkcji

Podręcznik: s. 121–123 oraz dodatek 7, s. 226.

Rozgrzewka · 3 minuty

Pierwsze, złożone i rozkład na czynniki

Wracamy do poprzedniej lekcji o liczbach pierwszych.

  1. Jaką liczbę nazywamy pierwszą, a jaką złożoną?
  2. Ile liczb pierwszych jest wśród liczb mniejszych od 100?
  3. Liczba 91 kończy się cyfrą 1. Czy to wystarczy, żeby uznać ją za pierwszą?
podręcznik s. 117–120
Część 1 · Po co funkcje

Przepis zapisany raz, używany wiele razy

Trudniejszy problem najlepiej rozłożyć na prostsze podproblemy. W praktyce oznacza to wyodrębnianie fragmentów programu, czyli podprogramów. W Pythonie takie podprogramy nazywamy funkcjami. Funkcja to jak przepis w książce kucharskiej: opis czynności ma swoją nazwę, a potem wystarczy powiedzieć nazwę, żeby wszystko wykonać od nowa.

Przepis „Naleśniki” 1. wymieszaj mąkę, jajka i mleko 2. usmaż ciasto na patelni 3. podaj z owocami zrób naleśniki zrób naleśniki zrób naleśniki Trzy razy to samo działanie, opis tylko jeden
Podręcznik Informatyka na czasie 2, s. 121 (8.2 Podzielność liczb, „Funkcje w języku Python”, pojęcie z marginesu: funkcja)
Część 1 · Budowa funkcji

Nagłówek, blok i słowo return

def function_name(parameters):
    statements
  • Nagłówek to def, nazwa funkcji, parametry w nawiasie i dwukropek.
  • Parametry funkcji to nazwy wartości, które funkcja dostaje do pracy.
  • Blok instrukcji pod nagłówkiem jest wcięty, tak jak w pętli.
  • Instrukcja return oddaje wynik temu, kto funkcję wywołał.
def trapezoid_area(a, b, h):
    return (a+b)*h/2

print(trapezoid_area(a, b, h))

Nazwy funkcji i zmiennych piszemy bez polskich znaków.

Podręcznik Informatyka na czasie 2, s. 121 (8.2 Podzielność liczb, budowa funkcji, pojęcia z marginesu: parametr funkcji, instrukcja return, ramka „Warto wiedzieć”) oraz s. 226 (dodatek 7 Podstawowe typy instrukcji, funkcja trapezoid_area)
Część 1 · Definicja kontra wywołanie

Zapisanie przepisu to jeszcze nie gotowanie

def square_area(a): return a * a DEFINICJA Python zapamiętuje przepis i nic jeszcze nie liczy print(square_area(5)) WYWOŁANIE dopiero teraz Python liczy i oddaje wynik 25 wchodzi 5 wraca 25

Funkcja bez wywołania nie robi nic, tak jak przepis, którego nikt nie użył. Ta sama definicja obsłuży square_area(5), square_area(12) i każdą inną liczbę.

Podręcznik Informatyka na czasie 2, s. 121–122 (8.2 Podzielność liczb, definicja funkcji i jej wywołanie)
Część 2 · Podzielność przez 3

Program, który liczy resztę z dzielenia

Liczba dzieli się przez 3 wtedy, gdy reszta z dzielenia przez 3 wynosi zero. Tworzymy funkcję division_remainder i wywołujemy ją dla liczby podanej przez użytkownika oraz dla trójki.

Specyfikacja

Dane: dwie liczby naturalne a i b.

Wynik: reszta z dzielenia liczby a przez liczbę b.

1. def division_remainder(a, b):
2.     return a % b
3.
4. number = int(input("Podaj liczbę: "))
5.
6. print("Reszta z dzielenia", number, end=" ")
7. print("przez 3 wynosi:", end=" ")
8. print(division_remainder(number, 3))
Podręcznik Informatyka na czasie 2, s. 121–122 (8.2 Podzielność liczb, ramka „Specyfikacja” i kod źródłowy programu sprawdzającego podzielność liczby przez 3)
Część 2 · Wiersz po wierszu

Cztery wiersze, które trzeba znać

  • Wiersze 1. i 2. to definicja funkcji. W nawiasie jest lista parametrów, a wiersz 2. wyznacza resztę operatorem % i oddaje wynik słowem return.
  • Wiersz 4. pyta użytkownika o liczbę i zapamiętuje ją w zmiennej number.
  • Wiersz 8. to wywołanie funkcji dla dwóch wartości: zmiennej number oraz liczby 3.
Podaj liczbę: 23101985
Reszta z dzielenia 23101985 przez 3 wynosi: 2
>>>

Reszta wyszła 2, więc 23101985 nie dzieli się przez 3. Gdyby wyszło 0, liczba dzieliłaby się bez reszty.

Podręcznik Informatyka na czasie 2, s. 122 (8.2 Podzielność liczb, omówienie wierszy 1., 2., 4. i 8. oraz rys. 8.3 „Wywołanie programu sprawdzającego podzielność przez 3”)
Część 2 · Dwa rodzaje parametrów

Parametr formalny i parametr aktualny

Program główny number = 23101985 division_remainder(number, 3) parametry aktualne: 23101985 oraz 3 Definicja funkcji def division_remainder(a, b): return a % b parametry formalne: a oraz b wartości wynik 2

Parametr aktualny przekazuje faktyczną wartość do funkcji zdefiniowanej wcześniej. Ta sama funkcja policzy resztę z dzielenia dowolnych liczb, bo w środku pracuje na nazwach a i b, a nie na konkretnych liczbach.

Podręcznik Informatyka na czasie 2, s. 122–123 (8.2 Podzielność liczb, pojęcie z marginesu: parametry formalny i aktualny funkcji)
Część 3 · Cztery wywołania

Ta sama funkcja, cztery dzielniki

 1. def division_remainder(a, b):
 2.     return a % b
 3.
 4. number = int(input("Podaj liczbę: "))
 5.
 6. print("Reszty z dzielenia", number, end=" ")
 7. print("przez 2, 3, 5, 7", end=" ")
 8. print("wynoszą odpowiednio:")
 9. print(division_remainder(number, 2))
10. print(division_remainder(number, 3))
11. print(division_remainder(number, 5))
12. print(division_remainder(number, 7))

Program ma podać cztery reszty: z dzielenia przez 2, 3, 5 i 7. Funkcja już jest, więc zmiana to samo dopisanie czterech wywołań.

Funkcje definiujemy, gdy chcemy nazwać pewną grupę instrukcji i oddzielić fragment kodu od reszty programu, zwykle po to, aby go wielokrotnie wykorzystać.

Podręcznik Informatyka na czasie 2, s. 123 (8.2 Podzielność liczb, kod źródłowy programu obliczającego reszty z dzielenia przez 2, 3, 5, 7 oraz ramka „Zapamiętaj”)
Część 3 · Nazwy funkcji

Skąd biorą się nazwy funkcji?

Nazwa funkcji ma mówić, co ta funkcja robi. division_remainder („reszta z dzielenia”) jest dobrą nazwą, bo po samej nazwie widać wynik. Nazwa function1 nie mówi nic i za miesiąc nikt nie odgadnie, po co powstała.

Ciekawostka. Programiści Pythona mają wspólny zbiór zaleceń o nazwie PEP 8, napisany w 2001 roku przez twórcę języka Guida van Rossuma razem z Barrym Warsawem i Alyssą Coghlan. Nazwy funkcji i zmiennych piszemy małymi literami, a słowa oddzielamy podkreśleniem: division_remainder. Zapis z wielkich liter, jak ResztaZDzielenia w podręczniku, jest dopuszczony tylko tam, gdzie tak przyjęto wcześniej.

Na lekcji piszemy jak w pracy zespołowej: po angielsku, małymi literami, z podkreśleniem. W podręczniku te same funkcje mają polskie nazwy z wielkich liter.

ciekawostka o PEP 8 i cytowane zalecenie: peps.python.org/pep-0008/
Ćwiczenie · na kartce · 12 minut

Ćwiczenie: tabela śledzenia i własna funkcja

  1. Podpisz kartkę. Przepisz wiersze 1., 2. i 8. ze slajdu 6, ze zmianą dzielnika z 3 na 17.
  2. Przepisz tabelę z prawej i uzupełnij ją dla liczb 34, 100 i 123.
  3. Napisz własną funkcję is_even na wzór podręcznikowej: def z jednym parametrem, wiersz z return, jedno wywołanie.
a (parametr) | b  | result return | dzieli się?
     34      | 17 |              |
    100      | 17 |              |
    123      | 17 |              |

W ostatniej kolumnie wpisz „tak” albo „nie”. Wcięcie w bloku funkcji zaznacz wyraźnie.

Dla chętnych (dom): uruchom u siebie plik divisibility.py: cztery wywołania dla 2, 3, 5 i 7, wiersze 6.–8. w jednej linii, wersja z pętlą for po liście [2, 3, 5, 7].

Podręcznik Informatyka na czasie 2, s. 123 (ćwiczenie 1b: podzielność przez 17; ćwiczenie 2a i 2b: skrócenie wierszy 6.–8. i pętla for po liście)
Część 3 · Pytania kontrolne

Trzy pytania na koniec

  1. Czym różni się definicja funkcji od jej wywołania?
  2. Co robi instrukcja return i dokąd trafia to, co ona przekazuje?
  3. Dlaczego program liczący reszty z dzielenia przez 2, 3, 5 i 7 nie wymagał żadnej zmiany w samej funkcji?
Podręcznik Informatyka na czasie 2, s. 121–123 (8.2 Podzielność liczb, ramka „Zapamiętaj”)
Część 3 · Podsumowanie

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
Własna funkcja licząca resztęPython ma to gotowe: divmod(a, b) zwraca naraz iloraz i resztę z dzielenia całkowitego, a sam operator % zwraca samą resztę.zastąpione
Nazwa division_remainderZespoły trzymają się jednego zapisu z zaleceń PEP 8: nazwy funkcji małymi literami ze znakiem podkreślenia.zmienione
Ten sam fragment kodu wpisany kilka razyPowtarzający się fragment zamienia się w jedną funkcję i wywołuje w wielu miejscach. Poprawka wtedy idzie w jednym miejscu, a nie w pięciu.nadal w użyciu
Funkcje w jednym pliku z programemFunkcje grupuje się w moduły i biblioteki, a program dołącza je poleceniem import.rozszerzane
return oddaje jedną wartośćFunkcja może oddać kilka wartości naraz, jak divmod, który zwraca parę liczb.rozszerzane
divmod: docs.python.org/3/library/functions.html · zalecenia nazewnicze: peps.python.org/pep-0008/