2011-05-18 43 views
1

考虑下面的代码,它只是调用列表中的每个成员的一个方法:避免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是否有相同的?

+0

gnibbler提出,它不符合Python只使用地图副作用的地步。假设make_change没有副作用,而是返回一些我想要收集的列表。 – jhourback 2011-05-19 03:06:44

回答

5

这不是很Python的使用地图只是副作用

那么为什么不

for item in foo: 
    item.make_change() 

这将运行速度比使用地图

可以把它如果你坚持要在一条线上,但我不会

for item in foo:item.make_change() 
2
operator.methodcaller('make_change') 
0

我与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! 
0

什么发生器语法?

>>> [x.make_change() for x in foo] 
[None, None, None] 

(其中None小号来自于事实,有当然的示例类没有返回值。)