Python,如何定义一个接受函数和两个数组作为参数的函数?

3 投票
4 回答
766 浏览
提问于 2025-04-17 12:41

为了学习,我想用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()

撰写回答