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ł”
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:
# itog = (a + b * c
#SyntaxError:'(' was never closed – Brakuje nawiasów końcowych
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:
| Przyczyna | Przykład | Gdzie to już widzieliśmy |
|---|---|---|
| zapomnianych nawiasów | 4 + 7 + 9 / 3 zamiast (4 + 7 + 9) / 3 | sekcja „Nawiasy i formuły" |
| nie ta zmienna | print(shirina + shirina) zamiast print(perimetr) | sekcja „Nawiasy i formuły" |
| Zdezorientowany priorytet | -2 ** 2 nie jest tym samym co (-2) ** 2 | sekcja „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:
# 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)
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:
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
== 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.
Nie uruchamiając kodu, określ wynik: итог = 2 + 3 * 4 ** 2 // 5. Potem się sprawdz.
W kodzie srednyaya_ocenka = ocenka1 + ocenka2 + ocenka3 / 3 jest błąd priorytetu. Znajdź i napraw go.
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.