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

Python 为什么我的生成器函数变成了一个不可迭代的浮点对象?,python,generator,python-decorators,Python,Generator,Python Decorators,大家好,祝你们今天过得愉快。我想使用我自己构建的performance装饰器,以num作为序列索引,测量系统运行生成器所需的时间。我的问题是,我仍然不明白我的fib生成器函数似乎是如何以及为什么转换成浮点数的。我怎样才能做到这一点?我附加了代码、输出和预期输出。这是我的第一个问题,请原谅我做得不好 先谢谢你 代码: 输出: for item in fib(20): TypeError: 'float' object is not iterable 预期产出: 0 1 1 2 3 5 8

大家好,祝你们今天过得愉快。我想使用我自己构建的
performance
装饰器,以
num
作为序列索引,测量系统运行生成器所需的时间。我的问题是,我仍然不明白我的
fib
生成器函数似乎是如何以及为什么转换成浮点数的。我怎样才能做到这一点?我附加了代码、输出和预期输出。这是我的第一个问题,请原谅我做得不好

先谢谢你

代码:

输出:

    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.

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

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

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

这是因为包装器函数返回
t2-t1
,这是一个浮点值。您希望返回调用
func()
的结果。这就是为什么您应该首先将代码缩减为一个值。作为一个新用户,请同时阅读。
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))