有时候,我只想为一个条目列表执行一个函数 - 例如:
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)
您可以使用内置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 语句的函数。
每个表达式都会评估某些内容,因此无论您采用哪种方式,都可以获得结果.任何这样的返回对象(就像你的列表一样)之后都会被丢弃,因为它不再被引用了.
澄清一下:python中的很少东西都是不返回任何内容的语句.甚至像函数调用一样
doSomething()
Run Code Online (Sandbox Code Playgroud)
仍然返回一个值,即使它立即被丢弃.在python中没有Pascal的函数/过程区别.
你可以试试这个:
filter(lambda x: installWow(x, 'installed by me') and False, wowList)
Run Code Online (Sandbox Code Playgroud)
这样,无论如何,返回结果都是空列表.
或者你可以放弃,and False如果你可以强制installWow()总是返回False(或0或None或另一个评估为false的表达式).
| 归档时间: |
|
| 查看次数: |
11067 次 |
| 最近记录: |