能否将列表推导式作为map()函数的可迭代对象?
能否将列表推导式作为map()函数的可迭代对象?
当然可以!你遇到的问题根本不是“列表推导式能不能当map的可迭代对象”,而是map()在Python里是惰性迭代器——它不会主动执行里面的函数操作,除非你主动去遍历它。
看你的代码:
def foo() -> list[int]: result: list = [] map(result.append, [x for x in range(10) if x % 2 == 0]) print(result)
你调用了map,但没有去迭代这个map对象,所以result.append根本没被执行过,结果自然是空列表。
要让这段代码达到你预期的[0,2,4,6,8],有两种简单的修改方式:
- 把map对象转成列表(强制迭代):
def foo() -> list[int]: result: list = [] list(map(result.append, [x for x in range(10) if x % 2 == 0])) print(result) - 手动遍历map对象:
def foo() -> list[int]: result: list = [] for _ in map(result.append, [x for x in range(10) if x % 2 == 0]): pass print(result)
其实换个思路,如果你只是想用map处理列表推导式的结果,完全可以更直接,比如不需要依赖append的副作用:
def foo() -> list[int]: result = list(map(lambda x: x, [x for x in range(10) if x % 2 == 0])) print(result)
当然这个例子里lambda有点多余,实际场景可以替换成你需要的处理逻辑。
总结一下:列表推导式完全可以作为map()的可迭代对象,你的问题只是没触发map的惰性求值而已。
备注:内容来源于stack exchange,提问作者Ouroboros
相关产品推荐
相关产品推荐

