在Python中有没有没有结果的map?
有时候,我就是想对一系列的条目执行一个函数,比如:
for x in wowList:
installWow(x, 'installed by me')
有时候我需要这些东西来初始化模块,所以我不想在全局命名空间里留下像x这样的痕迹。一个解决办法就是用map和lambda一起使用:
map(lambda x: installWow(x, 'installed by me'), wowList)
但这样做当然会生成一个漂亮的列表 [None, None, ...],所以我想问有没有类似的函数,不返回列表——因为我根本不需要这个列表。
(当然我也可以用_x,这样就不会留下明显的痕迹——但map的解决方案看起来真的很整洁……)
16 个回答
14
这样怎么样?
for x in wowList:
installWow(x, 'installed by me')
del x
30
你可以自己写一个“each”函数:
def each(fn, items):
for item in items:
fn(item)
# called thus
each(lambda x: installWow(x, 'installed by me'), wowList)
其实这个函数跟“map”很像,只不过它不会返回结果。通过使用一个函数,你可以确保“item”这个变量不会影响到当前的作用范围。
18
你可以使用内置的 any
函数来对生成器返回的每个项目应用一个没有返回值的函数,而不需要创建一个列表。可以这样实现:
any(installWow(x, 'installed by me') for x in wowList)
我发现这是实现你想要的功能最简洁的方法。
实际上,installWow
函数确实返回 None
,在逻辑运算中,这个值会被当作 False
。any
函数基本上是对生成器返回的所有项目进行一个 or
操作,而这些项目当然都是 None
,所以它必须遍历生成器返回的所有项目。最后,它确实返回 False
,但这并不需要让你担心。好处是:不会产生额外的列表。
请注意,这种方法只有在你的函数返回的值能被视为 False
时才有效,比如 None
或 0。如果在某个时候它返回了一个能被视为 True
的值,比如 1
,那么它就不会应用于迭代器中的其他元素。为了安全起见,最好将这种方法主要用于没有返回值的函数。