Błędy numeryczne i debugowanie
Dziewięć krótkich laboratoriów — od prawdziwych wyjątków po prawidłowe, ale nieoczekiwane wyniki liczbowe.
zebrałem dziewięć krótkich laboratoriów — niektóre z nich dotyczyły prawdziwych błędów z wyjątekm, część dotyczy ważnego, ale nieoczekiwanego wyniku numerycznego. Ważne jest, aby umieć rozróżnić te dwa Scenariusz.
ValueError
TypeError
print(10 / 2)
Obserwacja: wynik — 5.0, nie 5.
Wyjaśnienie: Operator / w Python ZAWSZE zwraca float (Rozdział 4.7), nawet gdy dzieli się całkowicie.
print(int(3.99))
Obserwacja: wynik — 3, nie 4.
Wyjaśnienie: int() odrzuca część ułamkową (obcinanie do zera), a nie zaokrągla (dział 4.16).
print(0.1 + 0.2 == 0.3)
Obserwacja: wynik — False.
Wyjaśnienie: float przechowuje przybliżenie (Rozdział 4.11) – zastosowanie math.isclose() zamiast ==.
from decimal import Decimal
print(Decimal(0.1))
Obserwacja: wynikiem jest długa, niekołowa frakcja, a nie 0.1.
Wyjaśnienie: argument jest float, co oznacza, że przybliżenie z sekcji 4.11 miało miejsce PRZED utworzeniem Decimal. Use Decimal("0.1").
print(7 // 3)
print(7 / 3)
Obserwacja: 2 przeciw 2.333....
Wyjaśnienie: // jest dzieleniem całkowitym (odrzuca część ułamkową wyniku), / — zwykłe dzielenie, zawsze float.
print(-7 // 3)
print(-7 % 3)
Obserwacja: -3 oraz 2 nie jest tym, czego wielu się spodziewa.
Wyjaśnienie: // zaokrągla do minus nieskończoności zamiast zera (Rozdział 4.7).
print(int("FF"))
Obserwacja: ValueError: invalid literal for int() with base 10: 'FF'
Wyjaśnienie: bez wskazania podstawy int() oczekuje zapisu dziesiętnego. Należy: int("FF", 16).
price = 100
quantity = 0
print(price / quantity)
Obserwacja: ZeroDivisionError: division by zero.
Wyjaśnienie: przed dzieleniem warto sprawdzić dzielnik pod kątem zera, jeśli może być zerowy — szczegółowe warunki będą w następnym rozdziale; tutaj wystarczy poznać sam typ błędu.
# Zadanie: oblicz dokładną kwotę czeku w rublach i kopiejkach
Obserwacja: float może dawać błąd w ułamkowych ilościach.
Wyjaśnienie: właściwy wybór pieniędzy — Decimal (Rozdział 4.14) zamiast float.