Nawet możnaby było łatwo odczytać co jest źle (że to funkcja eval
) gdyby nie wstawiło się całego programu w try
. Instrukcja try służy do tego by ująć w niej wrażliwą linijkę, a nie cały program, bo w przeciwnym wypadku jak się coś wywali to nie wiadomo dlaczego gdyż żaden błąd nie zostanie pokazany (aktualnie masz: jeżeli coś się zdarzy złego to wyłącz - czyli nie dowiesz się co się stało złego i dlaczego). Dodatkowo wyjątki mają nazwy i należy ich używać. W Pythonie nie ma instrukcji “try-except”. Jest instrukcja “try-except nazwa” (patrz dokument PEP8 na stronie Pythona).
Poprawiony program (w sensie prawidłowego użycia try
) jest tutaj. Teraz ładnie widać, że @j4rooo ma rację i należy pozbyć się eval
gdyż program pokazuje, że coś jest nie tak w trzynastej linijce kodu, a dokładnie to, że Python ma wbudowane ograniczenie wykonywanych rekurencji - funkcja eval
liczy wszystko rekurencyjnie.
To ważne gdyż w Pythonie napiszemy bez problemu rekurencyjną funkcję silnii dającą poprawny wynik dla argumentu równego 100, ale wywali się przy liczeniu silnii z 999.
Maksymalna ilość kroków rekurencji to 1000
(praca domowa: przemyśleć dlaczego wywala się na silnii z 999, a nie 1000).
Uwaga: można zwiększyć “na jaką głębokość” zapuści się rekurencja jedną linijką i w ten sposób rozwiązać to zadanie. Jednak nie napiszę jak to zrobić gdyż to ekstremalnie poroniony pomysł (patrz: zużycie ramu).