为什么我的生成器函数变成了一个不可迭代的浮点对象?

Why does my generator function turned into a non-iterable float object?

大家好希望你们今天过得愉快。我想测量我的系统使用我自己构建的 performance 装饰器 num 作为序列索引的 运行 一个 Fibonacci sequence 生成器所花费的时间。我的问题是,我仍然不明白我的 fib 生成器函数如何以及为何看似转换为浮点数。我怎样才能使这项工作?我附上了我的代码、我的输出和我的预期输出。这是我的第一个 Whosebug 问题,如果我没有正确地做到这一点,请原谅我。

先谢谢了。

代码:

from time import time
    
def performance(func):
    def wrapper(*args, **kwargs):
        t1 = time()
        func(*args, **kwargs)
        t2 = time()
        result = t2-t1
        print(f'It took {t2-t1} s')
        return result
    return wrapper

@performance
def fib(number):
    a = 0
    b = 1
    for item in range(number):
        yield a
        temp = a
        a = b
        b = temp + a

for item in fib(20):
    print(item)

输出:

    for item in fib(20):
TypeError: 'float' object is not iterable

预期输出:

0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
It took xxx s.

这个成功了。我意识到,我应该在装饰器中返回 func 而不是 t2-t1,它是一个浮点数(归功于 @Tim Peters)。

我还意识到要使用 performance 装饰器测量持续时间,我可以创建一个新函数 printfib 专门用于打印斐波那契数列。不知何故,在 fib 生成器上使用装饰器不起作用。也许是因为生成器 returns 或 yield 每次迭代都是一个数字,我想我想知道的是整个循环进行了多长时间,而不仅仅是一次迭代。 谢谢大家。

from time import time

def performance(func):
    def wrapper(*args, **kwargs):
        t1 = time()
        result = func(*args, **kwargs)
        t2 = time()
        print(f'It took {t2-t1} s')
        return result
    return wrapper


def fib(number):
    a = 0
    b = 1
    for item in range(number):
        yield a
        temp = a
        a = b
        b = temp + a

@performance
def printfib(num):
    for item in fib(num):
        print(item)
    return ('Done printing Fibbonaci numbers.')

print(printfib(20))