gpt4 book ai didi

python - 在对象列表 Python 3 中的所有对象上调用方法的惯用方式

转载 作者:太空宇宙 更新时间:2023-11-03 12:53:41 26 4
gpt4 key购买 nike

我有一个对象列表,它们有一个名为 process 的方法。在 Python 2 中可以做到这一点

map(lambda x: x.process, my_object_list)

在 Python 3 中,这将不起作用,因为 map 在遍历可迭代对象之前不会调用该函数。可以这样做:

list(map(lambda x: x.process(), my_object_list))

但是你会用一次性列表浪费内存(如果列表很大,就会出现问题)。我还可以使用 2 行显式循环。但这种模式对我来说太常见了,我不想,或者认为我应该需要,每次都写一个循环。

在 Python 3 中是否有更惯用的方法来做到这一点?

最佳答案

不要在简单的 for 循环中使用 map 或列表理解:

for x in list_of_objs:
x.process()

它并不比您可能用来抽象它的任何函数长很多,但明显更清晰。

当然,如果 process 返回一个有用的值,那么一定要使用列表理解。

results = [x.process() for x in list_of_objs]

map :

results = list(map(lambda x: x.process(), list_of_objs))

有一个函数可以使 map 不那么笨拙,特别是如果你要重用调用者的话:

from operator import methodcaller
processor = methodcaller('process')
results = list(map(processor, list_of_objs))
more_results = list(map(processor, another_list_of_objs))

如果您正在为函数寻找一个好名字来包装循环,Haskell 有一个很好的约定:以下划线结尾的函数名称会丢弃其“返回值”。 (实际上,它丢弃了单子(monad) Action 的结果,但为了这个答案的目的,我宁愿忽略这种区别。)

def map_(f, *args):
for f_args in zip(*args):
f(*f_args)

# Compare:
map(f, [1,2,3]) # -- return value of [f(1), f(2), f(3)] is ignored
map_(f, [1,2,3]) # list of return values is never built

关于python - 在对象列表 Python 3 中的所有对象上调用方法的惯用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51519696/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com