Wiele błędów początkujących programistów wynika z pomylenia liczby z napisem: "12" + "3" daje 123, a 12 + 3 daje 15. Ta lekcja porządkuje cztery podstawowe typy — str, int, float, bool — i uczy zamieniać je funkcjami int, float, str i bool, a także obsługiwać błędne dane przez try i except.
Scenariusz jest przeznaczony na 45 minut dla klasy znającej zmienne i print. Pasuje przed lekcją o pobieraniu danych, ale można go zrobić także po niej.
Przygotowanie stanowisk
Potrzebny jest Python 3 i edytor lub IDLE. Rozpakuj pakiet z sekcji materiałów do osobnego folderu i uruchamiaj skrypty z tego folderu. Program uruchomisz przez Run → Run Module albo poleceniem python start.py, python3 start.py lub py start.py.
Cele i plan lekcji
Po zajęciach uczeń potrafi:
- rozpoznać typ wartości i sprawdzić go funkcją
type; - zamienić tekst na liczbę i liczbę na tekst;
- wyjaśnić różnicę między
int(3.9)around(3.9); - obsłużyć błędną konwersję przez
try ... except ValueError; - wskazać wartości, które w warunku są fałszywe.
| Czas | Praca na lekcji |
|---|---|
| 0–5 min | Problem: "12" + "3" kontra 12 + 3 |
| 5–15 min | Typy i funkcja type, konwersje |
| 15–22 min | Zaokrąglanie, ValueError, wartości logiczne |
| 22–37 min | Trzy zadania samodzielne |
| 37–42 min | Omówienie wyników |
| 42–45 min | Pytania kontrolne |
Cztery typy i konwersje
str to tekst ("12"), int — liczba całkowita (12), float — liczba z częścią ułamkową (3.5), bool — wartość logiczna (True lub False). Funkcja type(x) zwraca typ wartości. Operator + dodaje liczby, ale łączy napisy, a * powiela napis: "12" * 2 to 1212.
Konwersje: int("12") daje 12, float("2.5") daje 2.5, str(45) daje "45". Funkcja int odcina część ułamkową (int(3.9) to 3, int(-3.9) to −3), natomiast round zaokrągla — i dla połówek stosuje zaokrąglanie do najbliższej liczby parzystej, więc round(2.5) to 2, a round(3.5) to 4. Próba zamiany tekstu, który nie jest liczbą, zgłasza ValueError; można go przechwycić blokiem try ... except ValueError. W Pythonie ułamki zapisujemy z kropką, więc przecinek trzeba najpierw zamienić metodą replace.
W warunkach fałszywe są: 0, 0.0, pusty napis, pusta lista i None; prawdziwe jest m.in. napis "0" (bo nie jest pusty).
Zadania
Zadanie 1. Napis czy liczba? Dla tekst = "12" wypisz tekst + "3", int(tekst) + 3 i tekst * 2, a w drugiej linii typy: napisu, int(tekst), liczby 3.5 i wartości True.
Zadanie 2. Zaokrąglanie. Wypisz int(3.9), int(-3.9), round(3.5), round(2.5) oraz float("2.5") * 2. Zbuduj napisy 45 min i Wynik: 5 z liczb za pomocą str.
Zadanie 3. Błędne dane. Dla listy ["15", "3,5", "abc", "7.2"] zamień każdy element na liczbę (przecinek zamień na kropkę). Dla tekstu, który nie jest liczbą, wypisz komunikat zamiast zatrzymywać program. Na końcu sprawdź bool dla 0, "", "0", [] i 7.
Dla chętnych: dla listy ["10", "20", "x", "30"] zsumuj tylko elementy składające się z cyfr (isdigit).
Rozwiązanie i wyniki
# Zadanie 1
tekst = "12"
print(tekst + "3", int(tekst) + 3, tekst * 2)
print(type(tekst), type(int(tekst)), type(3.5), type(True))
# Zadanie 2
print(int(3.9), int(-3.9), round(3.5), round(2.5), float("2.5") * 2)
print(str(45) + " min", "Wynik: " + str(2 + 3))
# Zadanie 3
for napis in ["15", "3,5", "abc", "7.2"]:
try:
print(napis, "->", float(napis.replace(",", ".")))
except ValueError:
print(napis, "-> to nie jest liczba")
print(bool(0), bool(""), bool("0"), bool([]), bool(7))
Program wypisze:
123 15 1212
<class 'str'> <class 'int'> <class 'float'> <class 'bool'>
3 -3 4 2 5.0
45 min Wynik: 5
15 -> 15.0
3,5 -> 3.5
abc -> to nie jest liczba
7.2 -> 7.2
False False True False True
Zadanie dla chętnych (rozszerzenie.py) wypisuje:
Suma poprawnych: 60
Typowe błędy
| Objaw | Co sprawdzić |
|---|---|
| TypeError: can only concatenate str (not "int") to str | Do napisu dodano liczbę; użyj str(liczba) albo int(napis). |
"5" + "5" daje 55 | To łączenie napisów; zamień oba na int. |
| ValueError: could not convert string to float: '3,5' | Przecinek zamiast kropki; użyj replace(",", "."). |
int("3.5") zgłasza błąd | int nie czyta ułamków zapisanych jako tekst; użyj float, a potem int. |
round(2.5) daje 2 | To zaokrąglanie do najbliższej parzystej; zachowanie jest zgodne z dokumentacją. |
| Pusty tekst uznany za prawdę | bool("") to False, ale bool("0") to True. |
Pytania kontrolne i punktacja
- Co wypisze
"7" + "3", a co7 + 3? - Czym różni się
int(4.8)odround(4.8)? - Jaką wartość ma
bool("0")?
Odpowiedzi: 73 oraz 10. int odcina część ułamkową (4), round zaokrągla (5). True, bo napis nie jest pusty.
Proponowana punktacja (razem 10 punktów): zadanie 1 — trzy wyniki 2 pkt, typy 1 pkt; zadanie 2 — pięć wartości 2 pkt, konwersja str 1 pkt; zadanie 3 — replace 1 pkt, try/except 2 pkt, bool 1 pkt. Zadanie dla chętnych nie jest wymagane do pełnej oceny.
Materiały do pobrania
Rozpakuj ZIP przed otwarciem plików. Materiały są dostępne bez logowania; publiczne rozwiązanie służy nauce i samodzielnemu sprawdzeniu, a nie poufnemu sprawdzianowi.
Co dalej?
Następny krok to pobieranie danych od użytkownika i instrukcje warunkowe. Ten materiał rozwija dział o typach i konwersjach w kursie Python w TablicaPro, gdzie znajdziesz prezentacje, ćwiczenia i testy do prowadzenia lekcji.
Źródła techniczne: typy wbudowane w dokumentacji oraz funkcja round. Zobacz też lekcję o napisach.
Poprowadź kolejne lekcje Python
Pełny kurs: prezentacje, ćwiczenia i testy do pracy z klasą.
Kup dostęp do kursu Python →