← Lekcje
Python · lekcja 13

Moduły: math i random

  1. Moduł, czyli gotowe funkcje napisane przez kogoś innego
  2. Dwa zapisy importu: import math i from math import sqrt
  3. Moduł math: sqrt, floor, ceil, pi
  4. Moduł random: randint, choice i program z kostką
Rozgrzewka · 3 minuty

Co pamiętacie z lekcji o funkcjach?

  1. Co robi słowo def i po co w ogóle piszemy własne funkcje?
  2. Co robi instrukcja return w funkcji?
  3. Czym różni się parametr od argumentu?
Część 1 · Czym jest moduł

Gotowe funkcje z cudzej półki

Moduł to plik z rozszerzeniem .py, w którym ktoś zebrał funkcje dotyczące jednego zagadnienia. Python przynosi setki takich plików ze sobą: to biblioteka standardowa. Nie trzeba ich instalować, wystarczy po nie sięgnąć.

biblioteka standardowa Pythona math pierwiastki, zaokrąglenia random losowe liczby, losowy wybór datetime daty i godziny os pliki i foldery Wasz program mówi: import math
docs.python.org, The Python Tutorial, rozdz. 6 (Modules) · Podręcznik Informatyka na czasie 2 (Nowa Era), s. 125–126 (8.3 Test pierwszości liczby, pojęcie modułu z marginesu)
Część 1 · Dwa zapisy importu

Bez importu Python nie zna tej nazwy

print(sqrt(25))
NameError: name 'sqrt' is not defined

import math
print(math.sqrt(25))
5.0

from math import sqrt
print(sqrt(25))
5.0
  • Bez importu Python przerywa program: nie wie, skąd wziąć nazwę sqrt.
  • import math wnosi nazwę modułu. Do funkcji sięgacie przez kropkę: math.sqrt(25).
  • from math import sqrt wnosi samą funkcję, więc piszecie krótko sqrt(25), ale math.floor wtedy nie zadziała.

Kropka w math.sqrt czyta się „funkcja sqrt z modułu math”, tak jak nazwisko po imieniu.

docs.python.org, The Python Tutorial, rozdz. 6.1 (More on Modules) · Podręcznik Informatyka na czasie 2 (Nowa Era), s. 228 (dodatek 9, słowa kluczowe import i from)
Część 2 · Moduł math

math: liczenie, którego nie chcecie pisać sami

ZapisCo robiWynik
math.sqrt(25)pierwiastek kwadratowy5.0
math.sqrt(2)pierwiastek kwadratowy1.4142135623730951
math.floor(4.7)zaokrąglenie w dół (podłoga)4
math.ceil(4.2)zaokrąglenie w górę (sufit)5
math.pistała π, bez nawiasu3.141592653589793
round(math.pi, 2)zaokrąglenie do dwóch miejsc3.14

Dla liczb ujemnych „w dół” znaczy w stronę mniejszych: math.floor(-2.5) to -3, a math.ceil(-2.5) to -2.

docs.python.org, The Python Tutorial, rozdz. 10.6 (Mathematics) · Podręcznik Informatyka na czasie 2 (Nowa Era), s. 227 (dodatek 8, wybrane funkcje matematyczne z biblioteki math)
Część 3 · Moduł random

random: ten sam kod, inny wynik

import random

print(random.randint(1, 6))
print(random.choice(["orzeł", "reszka"]))

Przykładowy wynik jednego uruchomienia: 3, potem orzeł. Po drugim uruchomieniu wyjdzie coś innego.

  • randint(a, b) oddaje losową liczbę całkowitą od a do b.
  • choice(items) oddaje losowy element niepustej listy.

W praktyce: dokumentacja ostrzega, że losowanie z modułu random nie nadaje się do haseł ani kluczy. Do takich zadań Python ma osobny moduł secrets.

docs.python.org, The Python Tutorial, rozdz. 10.6 (Mathematics) · docs.python.org, dokumentacja biblioteki standardowej, moduł random (randint, choice, ostrzeżenie o zastosowaniach bezpieczeństwa)
Część 3 · Skąd dokąd losuje

randint bierze oba końce, range nie

random.randint(1, 6) sześć możliwych wyników 1 2 3 4 5 6 range(1, 6) pięć liczb, szóstki już nie ma 1 2 3 4 5 6 poza zakresem
docs.python.org, dokumentacja biblioteki standardowej, moduł random (randint: a <= N <= b) · docs.python.org, The Python Tutorial, rozdz. 4.3 (The range() Function)
Część 3 · Cały program

Trzy rzuty kostką i suma oczek

import random

print("Rzucam kostką trzy razy.")
total = 0
for i in range(3):
    throw = random.randint(1, 6)
    print("Rzut", i + 1, "to", throw)
    total = total + throw
print("Razem oczek:", total)
Rzucam kostką trzy razy.
Rzut 1 to 1
Rzut 2 to 2
Rzut 3 to 5
Razem oczek: 8

Drugie uruchomienie dało 5, 1 i 3, czyli 9 oczek. Kod ten sam, wynik inny.

Ćwiczenie · przy komputerze · 11 minut

Ćwiczenie: trzy małe programy

Otwórz edytor i napisz trzy programy, każdy w osobnym pliku. Uruchom każdy co najmniej dwa razy.

  1. Plik root.py: poproś o liczbę, wczytaj ją i wypisz jej pierwiastek zaokrąglony do dwóch miejsc po przecinku. Sprawdź program dla liczby 20.
  2. Plik dice.py: wylosuj dwa rzuty kostką, wypisz każdy z osobna, a pod spodem ich sumę.
  3. Plik lunch.py: zrób listę czterech potraw i wylosuj z niej jedną, wypisując „Dziś na obiad: …”.
Jak sprawdzić, czy program jest dobry

Uruchom każdy program dwa razy. Programy z random mają za drugim razem dać inny wynik. Jeśli zobaczysz NameError, brakuje wiersza importu na samej górze pliku.

Sprawdzenie

Trzy pytania na koniec

  1. Co się stanie, gdy użyjesz sqrt(25) bez wiersza importu?
  2. Czym różni się import math od from math import sqrt?
  3. Ile różnych wyników może dać random.randint(1, 6)?
Podsumowanie

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
import mathNikt nie pisze pierwiastków, dat ani obsługi sieci od zera: program składa się z gotowych modułówcodziennie
random.choiceSerwis losuje, którą wersję strony Wam pokazać, i potem porównuje, która sprzedaje lepiejcodziennie
random.randint do hasłaGeneratory haseł i kodów jednorazowych biorą losowość z modułu secrets, bo random da się przewidziećzastępowane
Biblioteka standardowaModułów spoza niej doinstalowuje się tysiące poleceniem pip install, każdy to czyjś kodstandard w firmach