def fact(n):
    if n < 0:
        raise ValueError, "arg must be >= 0"
    elif n <= 1:
        return 1
    else:
        return n * fact(n - 1)

def factiter(n, accum=1L):
    if n < 0:
        raise ValueError, "arg must be >= 0"
    elif n <= 1:
        return accum
    else:
        return factiter(n - 1, n * accum)

def returntest(x):
    """This is a doc string("""
    return 2

def outer(x):
    def inner(y, x=x, z=2.2j):
        return y * x
    return inner

def varargs(x, *y):
    return x + y[0]

def kwargs(a, b, **kw):
    return (a + b) * kw.values()[0]

def test():
    print outer(2)(3)
    f = outer(3)
    print f(3)
    print f(4)
    print returntest(fact(factiter(4L)))

test()
