doctest example from the official python documentation https docs python orglibrarydoctest html return the factorial of n an exact integer 0 factorialn for n in range6 1 1 2 6 24 120 factorial30 doctest ellipsis 265252859812191058636308480000000 factorial1 traceback most recent call last valueerror n must be 0 factorials of floats are ok but the float must be an exact integer factorial30 1 traceback most recent call last valueerror n must be exact integer factorial30 0 doctest ellipsis 265252859812191058636308480000000 it must also not be ridiculously large factorial1e100 traceback most recent call last overflowerror n too large return the factorial of n an exact integer 0 factorial n for n in range 6 1 1 2 6 24 120 factorial 30 doctest ellipsis 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 doctest ellipsis 265252859812191058636308480000000 it must also not be ridiculously large factorial 1e100 traceback most recent call last overflowerror n too large catch a value like 1e300
def factorial(n):
    

    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:  
        raise OverflowError("n too large")
    result = 1
    factor = 2
    while factor <= n:
        result *= factor
        factor += 1
    return result