必须有办法做到这一点map()
这个:
for inst in list_of_instances:
inst.run()
可以这样做:
map(operator.methodcaller('run'), list_of_instances)
如何做到这一点map()
?
for inst in list_of_instances:
inst.some_setting = True
您可以使用setattr
:
map(lambda inst: setattr(inst, 'some_setting', True), list_of_instances)
或使用列表理解:
[setattr(inst, 'some_setting', True) for inst in list_of_instances]
顺便说一句,我认为简单for
的循环比map
因为
for
循环更容易阅读。map
, 列表理解版本生成临时列表 ( [None, None, None, ..., None]
)你可以,但这不是一个好主意。
map
设计为仅适用于纯(不可变)操作,即返回新对象的函数。缺少itemsetter
功能反映了这种想法。由于您的代码就地修改了对象,因此您应该改用for
循环。
这很重要,因为在 Python 3 中,map
不返回 list。它返回一个迭代器对象,它按需调用您的函数。所以在 Python 3 下,你的代码根本不会运行。
map
vs的for
区别并不是 Python 独有的。在 JavaScript 中,你map
有forEach
; 在 Haskell 中,你有map
和traverse
。区分这两个根本不同的东西很重要。