45

这是我尝试使用该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参数,那将是微不足道的,但我不确定如何处理。

4

5 回答 5

89

使用functools.partial()

from functools import partial

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

partial()创建一个新的可调用对象,它会将任何参数(包括关键字参数)应用于包装函数,以及传递给该新可调用对象的任何内容。

于 2012-11-21T18:35:32.157 回答
16

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

volume_ids = [1,2,3,4,5]
ip = '172.12.13.122'
map(lambda ids: my_function(ids, ip), volume_ids);
于 2012-11-21T18:44:26.810 回答
8

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

volume_ids = [1,2,3,4,5]
ip = '172.12.13.122'
results = [my_function(i,ip=ip) for i in volume_ids]
于 2014-03-05T22:17:15.343 回答
2

通常,可以使用 map 将关键字传递给函数,方法是将函数包装在解包字典的东西中,然后将字典的可迭代传递给 map。例子:

from itertools import product

volume_ids = [1,2,3,4,5]
volume_ids = (("volume_id", volume_id) for volume_id in volume_ids)
ips = [("ip", '172.12.13.122')]
kwargs_iterable = map(dict, product(volume_ids, ips))

result = map(lambda kwargs: my_function(**kwargs), kwargs_iterable)

但是,对于您的特殊情况,更简单的解决方案是:

map(my_function, volume_ids, [ip]*len(volume_ids))

这是简洁的,不依赖于任何导入。另一种可能性是结合 itertools 中的产品和星图:

from itertools import product, starmap

ips = [ip]
starmap(my_function, product(volume_ids, ips))

这很好地概括了具有多个 IP 地址或两个以上变量的设置。

于 2018-06-02T01:53:11.870 回答
0

这个怎么样?

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

这是三行代码而不是一行 --- 它是三行清晰明了的代码,而不是从诸如此类的模块中导入一些特殊情况的帮助程序。这个论点可能是一个品味问题,但它有很大的分量,这取决于你和谁交谈。

于 2012-11-21T19:02:03.050 回答