Created
September 20, 2023 03:58
-
-
Save ApexExpress/795f6387401af30bcd32e151f703a4fa to your computer and use it in GitHub Desktop.
The doctest module searches for pieces of text that look like interactive Python sessions, and then executes those sessions to verify that they work exactly as shown
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
This is the "example" module. | |
The example module supplies one function, factorial(). For example, | |
>>> factorial(5) | |
120 | |
""" | |
def factorial(n): | |
"""Return the factorial of n, an exact integer >= 0. | |
>>> [factorial(n) for n in range(6)] | |
[1, 1, 2, 6, 24, 120] | |
>>> factorial(30) | |
265252859812191058636308480000000 | |
>>> factorial(-1) | |
Traceback (most recent call last): | |
... | |
ValueError: n must be >= 0 | |
Factorials of floats are OK, but the float must be an exact integer: | |
>>> factorial(30.1) | |
Traceback (most recent call last): | |
... | |
ValueError: n must be exact integer | |
>>> factorial(30.0) | |
265252859812191058636308480000000 | |
It must also not be ridiculously large: | |
>>> factorial(1e100) | |
Traceback (most recent call last): | |
... | |
OverflowError: n too large | |
""" | |
import math | |
if not n >= 0: | |
raise ValueError("n must be >= 0") | |
if math.floor(n) != n: | |
raise ValueError("n must be exact integer") | |
if n+1 == n: # catch a value like 1e300 | |
raise OverflowError("n too large") | |
result = 1 | |
factor = 2 | |
while factor <= n: | |
result *= factor | |
factor += 1 | |
return result | |
if __name__ == "__main__": | |
import doctest | |
doctest.testmod() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment