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