【发布时间】:2015-09-16 19:05:05
【问题描述】:
我在存档中找不到这样的问题。
使用for 可以解包迭代对:
>>> for i, x in enumerate([5,10,15]): print('x[%d]=%d' % (i, x))
x[0]=5
x[1]=10
x[2]=15
或者也可以不 解压它们:
>>> for x in enumerate([5,10,15]): print(x)
(0, 5)
(1, 10)
(2, 15)
然而,当使用map()时,这个解包是不可能的:
>>> list(map(lambda i, x: x**i, enumerate([5,10,15])))
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: <lambda>() missing 1 required positional argument: 'x'
这是为什么?设计选择?为什么?
我想有人可以实现这样的包装器:
def map1(func, *iterables):
from inspect import signature
params = signature(func).parameters
if len(params) == 1:
yield from map(func, *iterables)
else:
yield from map(lambda x: func(*x), *iterables)
(适用于任何情况)
或另一个盲目地解包参数:
def map2(func, *iterables):
yield from map(lambda x: func(*x), *iterables)
(我猜后者会造成一些麻烦)
是否有(好的)理由不这样做?
【问题讨论】:
-
您正在寻找
itertools.starmap。 -
enumerate的情况可以使用list(map(lambda i, x: x**i, itertools.count(), [5,10,15]))
标签: python python-3.x lambda iterable enumerate