Rozdział 4 · Python lubi liczby

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.

Co poszło nie tak?
Python przestał z wyjątekm
ZeroDivisionError
ValueError
TypeError
Przeczytaj traceback i napraw przyczynę
Kod wykonywany bez wyjątku
Ale efekt wygląda niespodziewanie
Sprawdzanie modelu matematycznego i reprezentacji liczb
Poprawiamy kod, oczekiwania lub wybór typu liczbowego
Laboratorium 1. Dlaczego 10/2 daje 5,0?
przewidzieć i uruchomić
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.

Laboratorium 2. Dlaczego int(3.99) jest równe 3?
przewidzieć i uruchomić
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).

Laboratorium 3. Dlaczego porównanie 0,1 + 0,2 == 0,3 nie działa?
przewidzieć i uruchomić
print(0.1 + 0.2 == 0.3)

Obserwacja: wynik — False.

Wyjaśnienie: float przechowuje przybliżenie (Rozdział 4.11) – zastosowanie math.isclose() zamiast ==.

Laboratorium 4. Dlaczego Decimal(0.1) wygląda dziwnie?
przewidzieć i uruchomić
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").

Laboratorium 5. Dlaczego 7 // 3 różni się od 7/3?
przewidzieć i uruchomić
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.

Laboratorium 6. Przewidź: -7 // 3 i -7 % 3
przewidzieć i uruchomić
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).

Laboratorium 7. Popraw: int(„FF”
przewidzieć i uruchomić
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).

Laboratorium 8. Napraw ZeroDivisionError
przewidzieć i uruchomić
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.

Laboratorium 9. Wybierz właściwy typ numeru
przewidzieć i uruchomić
# 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.

Praktyka: Debugowanie numerycznych numerów błędów
interaktywny laptop bezpośrednio w przeglądarce – znajdź i napraw typowe problemy numeryczne
Otwórz praktykę →