使用生成器的Python中的因子程序

时间:2018-02-23 14:28:15

标签: python function generator factorial

#function
def fact(x):
    a = 1
    b = 1
    if x == 0:
        a = 1
    if x < 0:
        print('enter valid whole number!')
    if x > 0:
        while b < x:
            a = a * b
            b += 1
    yield a
#main
z = input('Enter a number')
g = (fact(n) for n in range (0,int(z)))
print(next(g))

当我运行上面的程序时,输出显示某个块的生成器对象,如下所示:

Enter a number4
<generator object fact at 0x03DF6930>

5 个答案:

答案 0 :(得分:4)

g是一个调用fact并生成结果的生成器。但fact也是一个发电机。你有两个发电机,所以你需要两个next电话。

z = 3
g = (fact(n) for n in range (0,int(z)))
print(next(next(g)))

结果:

1

或者,将fact转换为常规的旧非生成函数,因为如果您只需要从可调用函数中检索单个值,那么使用yield并不重要。

def fact(x):
    a = 1
    b = 1
    if x == 0:
        a = 1
    if x < 0:
        print('enter valid whole number!')
    if x > 0:
        while b < x:
            a = a * b
            b += 1
    return a
#main
z = 3
g = (fact(n) for n in range (0,int(z)))
print(next(g))

结果:

1

也许你正在思考&#34;但我真正想做的是在O(N)时间内计算前N个因子值(假设任意大整数的乘法是O(1)),并且将我的函数更改为使用return意味着我将不得不重新计算旧值。有人告诉我,yield可能会提高性能,但我的第一次尝试没有起作用,所以我该怎么做?&#34;。也许他们想要你写下这样的东西:

def factorials_up_to(x):
    a = 1
    for i in range(1, x+1):
        a *= i
        yield a

for x in factorials_up_to(6):
    print(x)

结果:

1
2
6
24
120
720

答案 1 :(得分:1)

有很多方法可以解决这个问题。但是,我个人的偏好是创建一个无限对象,其中每个元素仅在需要时才加载。用户 warnabas 建议使用 itertools 库执行此操作,但可以(且更简单)避免这种情况。

def fac(n, t):
    '''This creates a generator for the sequence of factorial
    numbers.'''

    yield t
    yield from fac(n+1, n*t)

f = fac(1,1)

然后我们可以随意使用这个生成器。例如代码

z = int(input('Enter a number: ')) +1
for i in range(z):
    print(next(f))

提示用户输入一个数字,然后打印直到并包括 z! 的阶乘序列。

答案 2 :(得分:0)

import itertools


def factorial_generator():
    i, fac = 1, 1
    while True:
        yield fac
        fac *= i
        i += 1

def factorial(n):
    return next(itertools.islice(factorial_generator(), n, None))

实际上,您应该构建无限序列以生成真正的生成器。

答案 3 :(得分:0)

# factorial function, recursively compute factorial
def fact(n):
    if n==1:
        # base case
        return 1
    else:
        # recursive case
        return n*fact(n-1)

# upto desired number computer the factorial function
def upto(n):
    for i in range(1,n+1):
        yield fact(i)

# call function
f=upto(3)
# print (it will print object not its contents)
print(f)
# to print use __next__ method to show each value
print(f.__next__())
print(f.__next__())
print(f.__next__())

答案 4 :(得分:-3)

这是在Python中实现阶乘函数最常用的方法之一:

def factorial(n):
   return n * factorial(n-1) if n > 0 else 1