【发布时间】:2013-12-17 23:45:07
【问题描述】:
Python 的map 可以采用多个可迭代对象,以便在可调用对象可以接受相同数量的输入参数时使用。如果输入迭代的长度相同,则其行为类似于传入压缩参数的列表推导,例如:
>>> iterables = 'spam', 'eggs'
>>> map(max, *iterables)
['s', 'p', 'g', 's']
>>> [max(*a) for a in zip(*iterables)]
['s', 'p', 'g', 's']
当输入参数的长度不同时,它会变得很奇怪 - Python 2 (docs) 使用 None 填充,但 Python 3 (docs) 会截断为最短的可迭代对象。
>>> map(max, 'spam', 'potato') # 2.x
['s', 'p', 't', 'm', 't', 'o']
>>> list(map(max, 'spam', 'potato')) # 3.x
['s', 'p', 't', 'm']
为什么存在此功能,需要或有用的典型案例是什么?我对函数式风格了解不多,我会错过与多个参数相关的map 的一些强大优势吗? 3.x 中 API 更改的基本原理是什么?
【问题讨论】:
-
Guido 实际上对
map有强烈的反感,并且确实计划将其从python 3 中删除。然而,由于流行的观点,他没有。 artima.com/weblogs/viewpost.jsp?thread=98196 -
lambdas 限制太多太慢是 Python 的错。否则map在列表理解变得更难阅读的某些情况下会很有用。 -
map早于理解。 -
@MihaiMaruseac
lambdas 没用。如果您想使用多个表达式,只需使用def并定义一个真正的函数。拥有更大的lambdas 将完全不可读。其他语言需要lambda表达式,因为它们不能定义内部函数,但python 确实 有它们,所以lambdas 只有在你需要一个简单的时候才有用-expr 函数作为参数。
标签: python dictionary functional-programming