如何在python中编写生成斐波那契

如何在python中编写生成斐波那契,python,generator,fibonacci,yield,function,Python,Generator,Fibonacci,Yield,Function,fib必须生成(使用收益率)广义Fibonacci 序列,a和b是第一和第二个元素。f是获得第三个元素的函数,而不是正常斐波那契序列中的a+b。使用take函数(如下所示)对其进行测试 我的代码在下面 def fib(a, b, f): 我不知道我的代码出了什么问题,当我尝试测试它时,它会显示出来 “TypeError:'generator'对象不可订阅” 测试用例是: def fib(a, b, f): x = a y = b yield x x, y = y

fib必须生成(使用收益率)广义Fibonacci 序列,a和b是第一和第二个元素。f是获得第三个元素的函数,而不是正常斐波那契序列中的a+b。使用take函数(如下所示)对其进行测试

我的代码在下面

def fib(a, b, f):
我不知道我的代码出了什么问题,当我尝试测试它时,它会显示出来
“TypeError:'generator'对象不可订阅”

测试用例是:

def fib(a, b, f):
    x = a
    y = b
    yield x
    x, y = y, f(x,y)
    fib(x,y,f)
它应该提出:

 take(5, fib(0, 1, lambda x, y: x - y))
我写的函数是:

[0, 1, -1, 2, -3]
def take(n,iterable):
x=[]

如果n消息意味着生成器不支持索引,那么
iterable[i]
将失败。相反,使用
next()
函数从迭代器中获取下一项

def take(n, iterable):
       x = []
    if n <= 0:
        return x
    else:
        for i in range (0,n):
            x.append(iterable[i])
        return x
另外,您的
fib()
函数将无法工作。您不应该在函数末尾递归;相反,编写一个循环,
在每次迭代中产生一个值

def take(n, iterable):
    x = []
    if n > 0
        itr = iter(iterable)     # Convert the iterable to an iterator
        for _ in range(n):       # Repeat n times
            x.append(next(itr))  # Append the next item from the iterator
    return x

您无法索引来自生成器函数(如
fib()
)的结果。下面通过将
zip()
range()
参数一起使用来避免这种情况
zip()
当它的一个参数到达then end时自动停止

def fib(a, b, f):
    x = a
    y = b
    while True:
        yield x
        x, y = y, f(x,y)

斐波那契最简单的方法你会遇到:

def fib(a, b, f):
    x, y = a, b
    while True:
        yield x
        x, y = y, f(x, y)

def take(n, iterable):
    return [] if n <= 0 else [v for _, v in zip(range(n), iterable)]

print( take(5, fib(0, 1, lambda x, y: x-y)) )

yield
返回生成器而不是迭代器。
take(…)
Python函数吗?更可能来自Haskell;)@Anzel这是OP自己定义的函数。@augurar,我知道,我只是有点讽刺;)我是python新手。你能告诉我如何修改take函数吗?
a , b =0 , 1

for n in range(100):#any number 
    print(a)
    a = a + b
    print (b)
    b = b + a