避免unncessary使用拉姆达为调用对象的方法
问题描述:
考虑下面的代码,它只是调用列表中的每个成员的一个方法:避免unncessary使用拉姆达为调用对象的方法
class Demo:
def make_change(self):
pass
foo = [Demo(), Demo(), Demo()]
map(lambda x: x.make_change(), foo)
有没有办法做到这一点不啰嗦lambda
句法?例如,在Scala中,类似于map(_.make_change(), foo)
的工作。 Python是否有相同的?
答
这不是很Python的使用地图只是副作用
那么为什么不
for item in foo:
item.make_change()
这将运行速度比使用地图
你可以把它如果你坚持要在一条线上,但我不会
for item in foo:item.make_change()
答
operator.methodcaller('make_change')
答
我与pyhonicity gnibbler。除此之外,这也是可能的:
map(Demo.make_change, foo)
它有问题,虽然:
class Demo(object):
def __init__(self):
self.x = 1
self.y = 2
def make_change(self):
self.x = 5
class SubDemo(Demo):
def make_change(self):
self.y = 7
d = Demo()
s = SubDemo()
map(Demo.make_change, [d, s])
assert d.x == 5 and s.y == 7 # oops!
答
什么发生器语法?
>>> [x.make_change() for x in foo]
[None, None, None]
(其中None
小号来自于事实,有当然的示例类没有返回值。)
gnibbler提出,它不符合Python只使用地图副作用的地步。假设make_change没有副作用,而是返回一些我想要收集的列表。 – jhourback 2011-05-19 03:06:44