简体   繁体   English

yield + class 中的 python 中的生成器

[英]yield + generator in python in class

I am very new in Python and I wanna create a generator object that yields two lists for Fibonacci sequence.我是 Python 的新手,我想创建一个生成器 object 来生成两个斐波那契数列列表。 First list of number and second list of fibonacci.第一个数字列表和第二个斐波那契列表。 The function define in the class. Before it I define fibonacci function as below: function定义在class中。在它之前我定义斐波那契function如下:

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

I need to define def fib_seq(self, _n): function with yield and use gen() together.我需要定义def fib_seq(self, _n): function 和 yield 并一起使用 gen() 。

I did it:我做的:

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])

but I got below error in test part:但是我在测试部分遇到了以下错误:

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

I'm not sure what the gen function you are using is, but you don't need to use it.我不确定您使用的gen function 是什么,但您不需要使用它。 You could do (removing self in this example to have standalone functions):您可以这样做(在此示例中删除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])

Note that the for loop in fib_seq is a bit superfluous as it stands.请注意,就目前而言, fib_seq中的for循环有点多余。 You could move the yield to within the loop, eg,您可以将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)

which would give:这会给:

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])

or, if you only want one output, have:或者,如果您只想要一个 output,请使用:

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

which would give:这会给:

for k in fib_seq(4):
    print(k)

([0, 1, 2, 3, 4], [0, 1, 1, 2, 3])

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM