En la primera parte , comenzamos a escribir una función factorial en el estilo basado en pruebas. Dependemos de la humilde declaración de "afirmación" para ejecutar nuestras pruebas y terminamos con esto:
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
Cuando encontramos un error, dado que estamos escribiendo pruebas primero, no comenzamos por corregir el error. En cambio, comenzamos escribiendo una prueba que expone el error.
Aquí, nos olvidamos de probar un "caso negativo". La "prueba negativa" es un concepto resbaladizo, pero más o menos significa probar errores.
Podríamos argumentar que nuestro código actual se está comportando correctamente: los factoriales de negativos no están bien definidos, por lo que es apropiado arrojar un error. Sin embargo, este error no es útil. Deberíamos lanzar un error más informativo, para que las personas que llaman puedan entender mejor qué hicieron mal.
Sin embargo, no podemos escribir esta afirmación como las demás: para probar que una función lanza una excepción, necesitamos capturar la excepción:
def factorial(n):
return n * factorial(n-1) if n else 1
...
try:
factorial(-1)
except:
pass
$ python fac.py
$
Necesitamos probar que, cuando nuestra función genera un error, genera el tipo de error que esperamos. ValueError es un tipo incorporado apropiado aquí, por lo que lo agregaremos a la línea de excepción.
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
Cuando realiza una solicitud a facebook.com, su computadora busca el nombre de dominio para traducir ese nombre de dominio en una dirección IP para que su computadora pueda hacer esa conexión.
Debe haber oído hablar de todos los complementos nuevos y potentes de ChatGPT, como el navegador, el intérprete de código, etc. Pero hay un problema, el acceso a los complementos está limitado a una lista de espera y, por lo tanto, muchos no tienen acceso a ellos.
En el mundo hiperconectado de hoy, los sistemas de medios juegan un papel fundamental en la formación de la opinión pública y, en consecuencia, en la toma de decisiones democrática. En su profundo análisis de la economía política de la comunicación, el académico Robert McChesney desafía la sabiduría convencional y presenta lo que él llama las “cinco verdades” sobre los medios.
La picazón en mi mano se extendió mientras negociaba con el librero local por otro libro. Este libro, como el resto que compré recientemente, encontraría su trono en mi pila de 'To Be Read' (TBR); y sin embargo, lo compré.
Por Alyson Lee, asesora de gestión de asuntos gubernamentales El proceso de asignaciones anuales del gobierno federal es fundamental para nuestros esfuerzos por financiar la eliminación de dióxido de carbono (CDR). Cada año, Carbon180 envía solicitudes a varias oficinas del Congreso para ayudar a guiar hacia dónde fluirán los dólares del próximo año.
Introducción: Bienvenidos, valientes lectores, a un viaje que nos llevará a las profundidades más oscuras de nuestro planeta. En este blog, profundizamos en el enigmático mundo de la Fosa de las Marianas, descubriendo sus secretos ocultos y descubriendo las verdades escalofriantes que se encuentran debajo de su superficie.