#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>
答案 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