在python中是否有没有结果的地图?

Jue*_*gen 27 python iteration

有时候,我只想为一个条目列表执行一个函数 - 例如:

for x in wowList:
   installWow(x, 'installed by me')
Run Code Online (Sandbox Code Playgroud)

有时我需要这些东西用于模块初始化,所以我不希望在全局命名空间中有像x这样的足迹.一种解决方案是将map与lambda一起使用:

map(lambda x: installWow(x, 'installed by me'), wowList)
Run Code Online (Sandbox Code Playgroud)

但这当然会创建一个很好的列表[无,无,...]所以我的问题是,如果有一个没有返回列表的类似函数 - 因为我只是不需要它.

(当然我也可以使用_x,因此不会留下可见的足迹 - 但地图解决方案看起来很整洁......)

Joh*_*ery 26

你可以创建自己的"每个"功能:


def each(fn, items):
    for item in items:
        fn(item)


# called thus
each(lambda x: installWow(x, 'installed by me'), wowList)

基本上它只是地图,但没有返回结果.通过使用函数,您将确保"item"变量不会泄漏到当前范围中.


Ric*_*dle 13

这个怎么样?

for x in wowList:
    installWow(x, 'installed by me')
del x
Run Code Online (Sandbox Code Playgroud)

  • @Juergen:del x比使用map()或reduce()等功能构造更优雅,因为它产生的副作用.如果函数应用程序是重要部分而不是返回的结果,那么使用循环来使其显式化. (6认同)
  • @RichieHindle:是的,我一直在寻找一种"优雅"和"快速"的解决方案.怎么样"优雅"?"del x"是可能的,但在我看来并不优雅.好吧,我不想这么说 - 这个解决方案很简单,我也在使用它,但在我看来并不优雅.而且我不想列出所有"不优雅"的解决方案.问题标题显然足以说明我的想法.很抱歉有任何不便之处! (2认同)

fxx*_*fxx 9

您可以使用内置any函数将不带 return 语句的函数应用于生成器返回的任何项目,而无需创建列表。这可以像这样实现:

any(installWow(x, 'installed by me') for x in wowList)
Run Code Online (Sandbox Code Playgroud)

我发现这是您想要实现的最简洁的习惯用法。

在内部,该installWow函数确实返回None,其False在逻辑运算中的计算结果为。any基本上or对生成器返回的所有项应用归约操作None,当然,所有这些项都是如此,因此它必须迭代生成器返回的所有项。最后它确实 return False,但这不需要打扰你。好处是:没有创建列表作为副作用。

请注意,这仅在您的函数返回计算结果为False,例如None或 0 的内容时才有效。如果它确实返回了True在某个时刻计算为 的内容,例如 ,1它将不会应用于迭代器中的任何剩余元素. 为了安全起见,这个习惯用法主要用于没有 return 语句的函数。

  • 这是危险的:如果 `installWow` 被修改,因此它有时确实返回“true”值,它不会应用于 `wowList` 中的所有项目。 (6认同)
  • OP 的问题是在将函数映射到条目列表时如何避免创建“[None, None, ...]”的结果列表。因此,这个函数没有 return 语句,在这种情况下应用这个 Idom 是*不容易*错误的。另一方面,难以阅读是个人品味的问题。 (4认同)
  • 对于如此简单的事情来说,这是一个非常容易出错且难以阅读的解决方案。你最好编写一个内部带有“for”循环的两行函数,如[这个答案](/sf/answers/75621031/)所示。 (3认同)

bal*_*pha 7

每个表达式都会评估某些内容,因此无论您采用哪种方式,都可以获得结果.任何这样的返回对象(就像你的列表一样)之后都会被丢弃,因为它不再被引用了.

澄清一下:python中的很少东西都是不返回任何内容的语句.甚至像函数调用一样

doSomething()
Run Code Online (Sandbox Code Playgroud)

仍然返回一个值,即使它立即被丢弃.在python中没有Pascal的函数/过程区别.

  • 那可能是对的.但这只是一个很大的区别,如果一个函数(也是一个内置函数)创建一个只是浪费的大的胖表,或者结果只是无.只是在列表中累积值会导致临时内存和CPU周期. (5认同)

Mar*_*off 6

你可以试试这个:

filter(lambda x: installWow(x, 'installed by me') and False, wowList)
Run Code Online (Sandbox Code Playgroud)

这样,无论如何,返回结果都是空列表.

或者你可以放弃,and False如果你可以强制installWow()总是返回False(或0或None或另一个评估为false的表达式).

  • @stephan,你的LC仍然用x(在Python 2.*中)污染了模块的命名空间,所以它与OP讨厌的普通循环没有任何优势! (5认同)
  • 与列表理解相同的是:[如果installWow(x,'由我安装'),则为wowList中的x为1且为假 (2认同)
  • @stephan:`[]`将`x`引入全局命名空间(如果它在模块级执行) (2认同)