2012-11-21 34 views
25

这里的功能是我试图使用map功能的环路:使用地图()的关键字参数

volume_ids = [1,2,3,4,5] 
ip = '172.12.13.122' 
for volume_id in volume_ids: 
    my_function(volume_id, ip=ip) 

有没有一种方法,我可以做到这一点?如果它不是ip参数,这将是微不足道的,但我不知道如何处理。

回答

55

使用functools.partial()

from functools import partial 

mapfunc = partial(my_function, ip=ip) 
map(mapfunc, volume_ids) 

partial()创建一个新的调用,那将适用任何参数(包括关键字参数)的包装的函数除了任何被传递到新的调用。

+1

非常酷,谢谢! –

9

这里是一个lambda方法(不是更好,只是不同)

volume_ids = [1,2,3,4,5] 
ip = '172.12.13.122' 
map(lambda ids: my_function(ids, ip), volume_ids); 
+2

泛音更快,lambda表达式支持乱序参数 –

0

这个怎么样?

results = [] 
for volume_id in volume_ids: 
    results.append(my_function(volume_id, ip=ip)) 

这是三行代码,而不是一个---它是不是从模块等,和进口等一些特殊情况的辅助三行明确而清晰的代码。这个说法可能是一个口味问题,但是它的重量取决于你与谁交谈。

+0

的问题是,我们要避免for循环 – mleger45

+0

为什么?因为它更清晰?或者因为像“for循环在Python中很慢”的一些误解? –

+0

是的,我会说的确是更清晰,更Pythonish和地图功能是为了执行最懒的迭代更多钞票。此外,我们需要一个列表回来,所以地图会比写多行编码一个for循环 – mleger45

4

这可以通过列表理解轻松完成。

volume_ids = [1,2,3,4,5] 
ip = '172.12.13.122' 
results = [my_function(i,ip=ip) for i in volume_ids] 
+1

在修真创建my_function的参数被向后更好地履行对我们来说。它应该是 my_function(i,ip = ip) –