Rozdział 5 · Pobawmy się liczbami!

Obliczania debugowania

Niepoprawna liczba bez żadnego błędu — najbardziej podstępny typ błędu. Omówimy trzy przyczyny i niezawodny sposób ich wyszukiwania.

Wzór z błędną liczbą jest znacznie bardziej podstępny niż błąd, który odpada Program: Python nie powie ci, że coś jest nie tak. Spójrzmy, jak szukać takich problemów świadomie, a nie metodą „zmieniałem się i patrzył”

Obliczenia nie dająefekt, żeoczekiwaneSkładniabłądprogram w ogóle niezaczyna się – Pythonwskazuje na linię zanim...Błąd w wzorzeprogram działa, aleliczy nie to, cojest priorytetem,...Funkcjereprezentacja liczbprogram działa i wydaje się działaćbyłoby poprawne, ale porównanie lubzaokrąglenie zachowuje się...
Trzy różne typy problemów — i trzy różne sposoby ich wyszukiwania

1. Błąd składniowy

Najprostszy przypadek to taki, że program w ogóle się nie uruchamia, a Python wskazuje na konkretny Nić i charakter jeszcze przed rozpoczęciem egzekucji:

sintaksicheskaya.py
# itog = (a + b * c
#SyntaxError:'(' was never closed – Brakuje nawiasów końcowych
Liczenie nawiasów w parach
Najpewniejszy sposób znalezienia niezakończonego nawiasu — policzyć otwierające i zamykające nawiasy w podejrzanym łańcuch znaków osobno; powinno ich być tyle samo.

2. Błąd w wzorze

Najbardziej niebezpieczną kategorią jest sytuacja, gdy program działa bez żadnego błędu, ale wynik jest nieprawidłowy. Zazwyczaj istnieje jeden z trzech powodów, które już omówiliśmy w tym rozdziale:

PrzyczynaPrzykładGdzie to już widzieliśmy
zapomnianych nawiasów4 + 7 + 9 / 3 zamiast (4 + 7 + 9) / 3sekcja „Nawiasy i formuły"
nie ta zmiennaprint(shirina + shirina) zamiast print(perimetr)sekcja „Nawiasy i formuły"
Zdezorientowany priorytet-2 ** 2 nie jest tym samym co (-2) ** 2sekcja „Operatorzy uniarni”

Sztuczka: Przerysuj wzór przez nazwane kroki

Gdy długa formuła daje podejrzany wynik, najpewniejszy sposób na znalezienie Problem — podziel go na nazwane kroki pośrednie i wpisz każdy:

trassirovka.py
# był jednym z łańcuch znaków, nie wiadomo, co poszło nie tak:
itog = (cena - skidka) * kolichestvo + dostavka / kolichestvo

# stał się — możesz zobaczyć każdy wynik pośredni:
cena_so_skidkoj = cena - skidka
print(„Cena po rabacie:”, cena_so_skidkoj)

summa_za_tovar = cena_so_skidkoj * kolichestvo
print(„Ilość za przedmiot:”, summa_za_tovar)

dostavka_na_edinicu = dostavka / kolichestvo
print(„Dostawa na jednostkę:”, dostavka_na_edinicu)

itog = summa_za_tovar + dostavka_na_edinicu
print(„Podsumowanie:”, itog)
łącznie = (100 − 10) × 3 + 15 / 3
cena po rabacie = 90
ilość na przedmiot = 270
dostawa na jednostkę = 5.0
łącznie = 275,0
Trace zamienia pojedynczy tajemniczy łańcuch znaków w sekwencję zrozumiałych, weryfikowalnych kroków
To tymczasowy kod, a nie stały
Podział na nazwaną kroki — technika właśnie do debugowanie. Gdy wzór działa poprawnie, pośredni print() zwykle usuwane, ale czasem należy pozostawić znaczące nazwy zmiennych pośrednich — czynią kod jaśniejszym, nawet jeśli już nie jest debugowany.

3. Cechy reprezentacji liczb

Trzecia kategoria to kod poprawny składniowo, wzór również jest poprawny, ale wynik nadal jest niespodzianki. Zazwyczaj powodem jest to, że już szczegółowo omówiliśmy to w rozdziale 4:

float_lovushka.py
print(0.1 + 0.2 == 0.3)          # False! nie jest błędem, lecz cechą float
print(round(0.1 + 0.2, 10) == 0.3)  #True – Porównanie tolerancji działa poprawnie
Zobacz rozdział 4, aby uzyskać więcej szczegółów
Dlaczego tak się dzieje i jak poprawnie float porównać, szczegółowo omówiono w sekcji „Poprawne porównanie float” == między float zachowuje się nieoczekiwanie — oznacza to, że sprawa dotyczy reprezentacji liczb, a nie błędu w formule.

Przewiduj przed startem

Najlepszym nawykiem przy debugowaniu jest budowanie go zanim pojawią się błędy: zanim go uruchomisz kod, przewidź wynik. Jeśli przewidywanie nie pokrywa się z rzeczywistością, albo znalazłeś błąd, albo źle zrozumieć kod. Oba przypadki należy analizować bez dalszego uruchamiania kodu.

Podstawowa praktyka
Przewidzieć wynik

Nie uruchamiając kodu, określ wynik: итог = 2 + 3 * 4 ** 2 // 5. Potem się sprawdz.

★★ Zadanie samodzielne
Znajdź błąd w wzorze

W kodzie srednyaya_ocenka = ocenka1 + ocenka2 + ocenka3 / 3 jest błąd priorytetu. Znajdź i napraw go.

Challenge
Śledzenie wzoru

Weź formułę obliczania łącznej kwoty zamówienia z uwzględnieniem rabatu i dostawy z powyższego przykładu i dodaj do niej śledzenie z czytelnymi nazwami zmiennych pośrednich.

Praktyka: Obliczania debugowania
interaktywny laptop bezpośrednio w przeglądarce – Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →