Python,如何定义一个接受函数和两个数组作为参数的函数?
为了学习,我想用Python写一个函数,这个函数接收另一个函数和两个数组作为参数,然后在每个数组的每个索引上调用这个函数参数。也就是说,它应该像这样调用:a1[0] 和 a2[0],a1[1] 和 a2[1],依此类推。但是我得到的只是一个生成器对象。这是怎么回事呢?
def add(a,b):
yield a + b
def generator(add,a1,a2):
for i in range(len(a1)):
yield add(a1[i],a2[i])
g = generator(add,a1,a2)
print g.next()
我还尝试把上面yield的部分换成
yield map(add,a1[i],a2[i])
但这样效果更差。我得到了这个错误:
TypeError: argument 2 to map() must support iteration
4 个回答
2
我正在尝试用Python写一个函数,这个函数接收另一个函数和两个数组作为参数,并在每个数组的每个索引上调用这个函数。
def my_function(func, array_1, array_2):
for e_1,e_2 in zip(array_1, array_2):
yield func(e_1,e_2)
举个例子:
def add(a, b):
return a + b
for result in my_function(add, [1, 2, 3], [9, 8, 7]):
print(result)
将会打印:
10
10
10
现在,有几点需要注意:
add
函数可以在operator
模块中找到。- 你会看到我使用了
zip
,可以看看它的文档。
虽然你实际上需要的是izip()
,但zip()
下的生成器表达式基本上不会返回一个列表,而是返回每个值的迭代器。 my_function
几乎就像map()
,唯一的区别是my_function
是一个生成器,而map()
给你的是一个列表。再次强调,标准库中在itertools
模块中提供了map
的生成器版本:imap()
举个例子,my_function
就像imap
:
from operator import add
from itertools import imap
for result in imap(add, [1, 2, 3], [9, 8, 7]):
print(result)
#10
#10
#10
我显然假设add
函数只是一个快速示例,否则可以查看内置的sum
。
4
你得到一个生成器是因为你的 add
函数本身就是一个生成器。其实它应该只是简单地写成 return a + b
。
6
你定义的 add()
函数至少有点奇怪(我更倾向于说它是“错误的”)。你应该用 return
返回结果,而不是用 yield
。
def add(a, b):
return a + b
不过,现在你的 generator()
函数可以正常工作了。
map(add, a1, a2)
其实有一种更简单、更快的方法可以做到(几乎)相同的事情。如果你想要一个迭代器而不是列表,可以用 itertools.imap()
代替 map()
。