2011-05-18 30 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小號來自於事實,有當然的示例類沒有返回值。)