Nella prima parte , abbiamo iniziato a scrivere una funzione fattoriale nello stile test-driven. Dipendiamo dall'umile dichiarazione "assert" per eseguire i nostri test e abbiamo concluso con questo:
def factorial(n):
return n * factorial(n-1) if n else 1
assert factorial(0) == 1
assert factorial(2) == 2
assert factorial(5) == 120
>>> factorial(-1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "fac9.py", line 24, in factorial
return n * factorial(n-1) if n else 1
File "fac9.py", line 24, in factorial
return n * factorial(n-1) if n else 1
File "fac9.py", line 24, in factorial
return n * factorial(n-1) if n else 1
[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded
Quando troviamo un bug, dal momento che stiamo scrivendo prima i test, non iniziamo risolvendo il bug. Iniziamo invece scrivendo un test che esponga il bug.
Qui, abbiamo dimenticato di testare un "caso negativo". "Test negativo" è un concetto scivoloso, ma più o meno significa testare gli errori.
Potremmo sostenere che il nostro codice attuale si sta comportando correttamente: i fattoriali dei negativi non sono ben definiti, quindi è appropriato lanciare un errore. Eppure questo errore non è utile. Dovremmo lanciare un errore più informativo, in modo che i chiamanti possano capire meglio cosa hanno sbagliato.
Tuttavia, non possiamo scrivere questa affermazione come le altre: per verificare che una funzione generi un'eccezione, dobbiamo catturare l'eccezione:
def factorial(n):
return n * factorial(n-1) if n else 1
...
try:
factorial(-1)
except:
pass
$ python fac.py
$
Dobbiamo verificare che, quando la nostra funzione genera un errore, solleva il tipo di errore che ci aspettiamo. ValueError è un tipo integrato appropriato qui, quindi lo aggiungeremo alla riga di eccezione.
def factorial(n):
return n * factorial(n-1) if n else 1
...
try:
factorial(-1)
except ValueError as e:
pass
$ python fac.py
Traceback (most recent call last):
File "fac.py", line 28, in <module>
factorial(-1)
File "fac.py", line 23, in factorial
return n * factorial(n-1) if n else 1
File "fac.py", line 23, in factorial
return n * factorial(n-1) if n else 1
File "fac.py", line 23, in factorial
return n * factorial(n-1) if n else 1
[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded
def factorial(n):
if n < 0: return
return n * factorial(n-1) if n else 1
...
try:
factorial(-1)
except ValueError as e:
pass
$ python fac.py
$
def factorial(n):
if n < 0: return
return n * factorial(n-1) if n else 1
...
try:
factorial(-1)
assert False, 'Factorial of < 0 should have raised an error'
except ValueError as e:
pass
$ python fac.py
Traceback (most recent call last):
...
AssertionError: factorial of < 0 should have raised an error
def factorial(n):
if n < 0:
raise ValueError()
return n * factorial(n-1) if n else 1
...
try:
factorial(-1)
assert False, 'Factorial of < 0 should have raised an error'
except ValueError as e:
pass
def factorial(n):
if n < 0:
raise ValueError()
return n * factorial(n-1) if n else 1
...
try:
factorial(-1)
assert False, 'Factorial of < 0 should have raised an error'
except ValueError as e:
assert str(e) == 'Factorial of negative is undefined'
$ python fac.py
...
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "fac.py", line 19, in <module>
assert str(e) == 'Factorial of negative is undefined'
AssertionError
Quando fai una richiesta a facebook.com, il tuo computer cerca il nome di dominio per tradurre quel nome di dominio in un indirizzo IP in modo che il tuo computer possa effettuare quella connessione.
Devi aver sentito parlare di tutti i nuovi potenti plug-in ChatGPT come Browser, Code Interpreter ecc. Ma c'è un problema, l'accesso ai plug-in è limitato a una lista di attesa e quindi molti non hanno accesso ad essa.
Quante volte vi è capitato di buttare via una bottiglia di plastica, un barattolo di vetro, una lattina di alluminio o una confezione di energia green senza pensarci due volte? Quante volte hai desiderato di poter ottenere qualcosa in cambio del loro riciclaggio? Se sei come la maggior parte delle persone, la risposta è probabilmente molte volte. Il riciclaggio è spesso visto come una seccatura, un lavoro di routine o un dovere che non porta alcun beneficio immediato o tangibile.
Era mezzanotte passata quando Hayden riportò Katie al dormitorio del college dopo la loro serata insieme. Aveva una lezione la mattina presto e non aveva un altro cambio di vestiti dopo essere stata con lui la sera prima.
Nel mondo iperconnesso di oggi, i sistemi dei media svolgono un ruolo fondamentale nel plasmare l'opinione pubblica e, di conseguenza, nel processo decisionale democratico. Nella sua profonda analisi dell'economia politica della comunicazione, lo studioso Robert McChesney sfida la saggezza convenzionale e presenta quelle che definisce le "cinque verità" sui media.
(Attenzione: questa è satira, destinata ad essere allegramente sovversiva, sicuramente non per bambini) Hai visto tua madre e tuo padre nascondersi in cucina e fumare quelle sigarette puzzolenti. Ti dicono.