如何在一个保持不变的情况下对映射函数执行多个参数

新手上路,请多包涵

假设我们有一个函数 add 如下

def add(x, y):
    return x + y

我们想为数组应用 map 函数

map(add, [1, 2, 3], 2)

语义是我想将 2 添加到数组的每个元素。但是 map 函数在第三个参数中也需要一个列表。

注意: 为了简单起见,我将 add 作为示例。我原来的功能要复杂得多。当然,在 add 函数中设置默认值 y 的选项是不可能的,因为它会在每次调用时更改。

原文由 Shan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 200
2 个回答

一种选择是列表理解:

 [add(x, 2) for x in [1, 2, 3]]

更多的选择:

 a = [1, 2, 3]

import functools
map(functools.partial(add, y=2), a)

import itertools
map(add, a, itertools.repeat(2, len(a)))

原文由 Sven Marnach 发布,翻译遵循 CC BY-SA 3.0 许可协议

文档明确建议这是 itertools.repeat 的主要用途:

制作一个反复返回对象的迭代器。除非指定 times 参数,否则无限期运行。用作 map() 的参数,用于被调用函数的不变参数。也与 zip() 一起使用以创建元组记录的不变部分。

并且没有理由通过 len([1,2,3]) 作为 times 参数; map 在第一个迭代器被消耗后立即停止,因此无限迭代器非常好:

 >>> from operator import add
>>> from itertools import repeat
>>> list(map(add, [1,2,3], repeat(4)))
[5, 6, 7]

事实上,这相当于文档中 repeat 的示例:

 >>> list(map(pow, range(10), repeat(2)))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

这形成了一个很好的惰性函数式语言 y 解决方案,它在 Python 迭代器术语中也非常可读。

原文由 abarnert 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题