Python3 在 lambda 表示中不支持将迭代返回的 tuple 对象拆包为对应的参数吗?

2017-04-04 15:02:13 +08:00
 zungmou

例如:

map(lambda: i, x: (i + 1, x), enumerate(sys.argv))

上面这段代码在 Python3 中是错误的,必须改为

map(lambda: x: (x[0] + 1, x[1]), enumerate(sys.argv))

不可以将 tuple 或 list 对象可以自动拆包了,还是有别的方法呢?

3561 次点击
所在节点    Python
14 条回复
guyskk
2017-04-04 15:34:54 +08:00
lambda 后面多了个 :
billlee
2017-04-04 15:35:27 +08:00
等效语法:
((i + 1, x) for i, x in enumerate(sys.argv))

map 已经不推荐用了
zungmou
2017-04-04 15:45:37 +08:00
@guyskk 嗯,手写的代码。
@billlee map 不能用了,那么 filter 怎么办呢?
hareandlion
2017-04-04 16:36:44 +08:00
直接用 list comprehension ?
hareandlion
2017-04-04 16:38:31 +08:00
[(x[0] + 1, x[1]) for x in enumerate(sys.argv)]这样?
czheo
2017-04-04 16:46:44 +08:00
from itertools import startmap
starmap(lambda i, x: (i + 1, x), enumerate(sys.argv))
czheo
2017-04-04 16:47:56 +08:00
typo: startmap -> starmap
zungmou
2017-04-04 18:05:16 +08:00
@czheo Thank you, itertools.startmap 的确进行了拆包。
guyskk
2017-04-04 19:09:28 +08:00
@hareandlion #5 就是 2L 那样, 2L 的结果是一个 Generator ,最外面的圆括号换成方括号结果就是列表。
SakuraSa
2017-04-04 23:37:45 +08:00
似乎可以这样:
map(lambda: i, x: (i + 1, x), *zip(enumerate(sys.argv)))
SakuraSa
2017-04-04 23:56:05 +08:00
不好意思打错了
map(lambda i, x: (i + 1, x), *zip(*enumerate(sys.argv)))
Valyrian
2017-04-05 00:36:00 +08:00
Lambda i, x 这样是接受两个 argument , tuple 是一个,可以用星号*展开成两个
也可以这样定义 lambda (i, x),这样就是接受一个 tuple
weyou
2017-04-05 09:16:53 +08:00
就算是普通函数也不能自动拆包啊,而要用*显式展开。因为函数根本不知道需不需要拆包,假如你就是想传入一个类型是 tuple 的参数呢。
yeyuexia
2017-04-05 10:28:14 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/352442

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX