在Python中有没有没有结果的map?

35 投票
16 回答
24576 浏览
提问于 2025-04-15 12:40

有时候,我就是想对一系列的条目执行一个函数,比如:

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,在逻辑运算中,这个值会被当作 Falseany 函数基本上是对生成器返回的所有项目进行一个 or 操作,而这些项目当然都是 None,所以它必须遍历生成器返回的所有项目。最后,它确实返回 False,但这并不需要让你担心。好处是:不会产生额外的列表。

请注意,这种方法只有在你的函数返回的值能被视为 False 时才有效,比如 None 或 0。如果在某个时候它返回了一个能被视为 True 的值,比如 1,那么它就不会应用于迭代器中的其他元素。为了安全起见,最好将这种方法主要用于没有返回值的函数。

撰写回答