【发布时间】:2016-01-22 21:38:29
【问题描述】:
在David Beazley's talk on generators 中,他展示了如何从任何单参数函数创建生成器函数:
def generate(func):
def gen_func(s):
for item in s:
yield func(item)
return gen_func
并用math.sqrt说明:
gen_sqrt = generate(math.sqrt)
for x in gen_sqrt(xrange(100)):
print x
为什么会这样:
gen_sum = generate(sum)
for x in gen_sum([1,2,3,4,5]):
print x
生产:
TypeError Traceback (most recent call last)
<ipython-input-73-ef521f2bbfc8> in <module>()
1 gen_sum = generate(sum)
----> 2 for x in gen_sum(1):
3 print x
<ipython-input-50-3c0ba12c2429> in gen_func(s)
1 def generate(func):
2 def gen_func(s): # closure
----> 3 for item in s:
4 yield func(item)
5 return gen_func
TypeError: 'int' object is not iterable
是否更准确地说,作为单参数函数的函数是这种方法工作的必要但不充分条件?另一个必要条件是单个参数必须是单个项目(而不是序列)?
【问题讨论】:
-
a sum 需要两个参数......该函数必须是一个只需要一个参数的函数......您期望上面的实际作用是什么?
math.sqrt(25)vssum(25)我认为问题是什么已经很清楚了.. -
您显示回溯的异常似乎来自对
gen_sum的调用,而不是您在上面显示的调用(这也会引发带有相同消息的TypeError,但在代码的不同部分和不同的原因)。 -
它必须是一个单参数函数接受你传递的值的种类!
gen_sum([(1, 2), (3, 4, 5)])可以,例如. -
@Blckknght 很好看。但最终还是同样的错误。
-
@JoranBeasley
sum接受一个参数。在我上面的例子中,那个单一的参数是一个列表。
标签: python function generator yield