为什么我的生成器函数变成了一个不可迭代的浮点对象?
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))
大家好希望你们今天过得愉快。我想测量我的系统使用我自己构建的 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))