yield + generator in python in class



我是一个Python新手,我想创建一个生成器对象,生成两个斐波那契序列列表。第一个数列和第二个斐波那契数列。函数定义在类中。在此之前,我定义fibonacci函数如下:

def fib(self, _n,) -> int:
if _n == 0:
return 0
if _n == 1:
return 1
return self.fib(_n-1) + self.fib(_n-2)

我需要用yield定义def fib_seq(self, _n):函数,并同时使用gen()。

我做到了:

def fib_seq(self, _n):
"""
- input: n=4
- output: generator object that produces:
([0, 1, 2, 3, 4],
[0, 1, 1, 2, 3])
"""
for i in range(_n):
nlist = gen(i)
flist = gen(self.fib(i))
yield ([nlist], [flist])

但是我在测试部分得到以下错误:

Traceback (most recent call last):
File --- line 161, in <module> # this part is in test section
n, fib = next(gen)      # trigger generator
^^^^^^^^^
File ---, line 53, in fib_seq # this part is my code
nlist = gen(i)
^^^^^^
TypeError: 'generator' object is not callable

我不确定你正在使用的gen函数是什么,但你不需要使用它。您可以这样做(在本例中删除self以具有独立功能):

def fib(_n):
if _n == 0:
return 0
if _n == 1:
return 1
return fib(_n-1) + fib(_n-2)
def fib_seq(n):
for i in range(n + 1):
nlist = list(range(i + 1))
flist = [fib(j) for j in range(i + 1)]
yield (nlist, flist)
# as fib_seq yields a generator you have to use it in, e.g., a for loop
for k in fib_seq(4):
print(k)
([0, 1, 2, 3, 4], [0, 1, 1, 2, 3])

注意,fib_seq中的for循环看起来有点多余。您可以将yield移动到循环内,例如

def fib_seq(n):
for i in range(n + 1):
nlist = list(range(i + 1))
flist = [fib(j) for j in range(i + 1)]
yield (nlist, flist)

将得到:

for k in fib_seq(4):
print(k)
([0], [0])
([0, 1], [0, 1])
([0, 1, 2], [0, 1, 1])
([0, 1, 2, 3], [0, 1, 1, 2])
([0, 1, 2, 3, 4], [0, 1, 1, 2, 3])

或者,如果你只想要一个输出,有:

def fib_seq(n):
nlist = list(range(n + 1))
flist = [fib(j) for j in range(n + 1)]
yield (nlist, flist)

将得到:

for k in fib_seq(4):
print(k)
([0, 1, 2, 3, 4], [0, 1, 1, 2, 3])

最新更新