这是我尝试使用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
参数,这将是微不足道的,但我不确定如何处理。
使用 functools.partial()
:
from functools import partial
mapfunc = partial(my_function, ip=ip)
map(mapfunc, volume_ids)
partial()
创建一个新的可调用对象,除了传递给该新可调用对象的任何参数外,它还会将任何参数(包括关键字参数)应用于包装的函数。
这是一个lambda方法(不是更好,只是不同)
volume_ids = [1,2,3,4,5]
ip = '172.12.13.122'
map(lambda ids: my_function(ids, ip), volume_ids);
这可以通过列表理解轻松完成。
volume_ids = [1,2,3,4,5]
ip = '172.12.13.122'
results = [my_function(i,ip=ip) for i in volume_ids]
函数包装在解压缩字典的东西中,然后将字典的可迭代对象传递给 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))
这是简洁的,不依赖于任何进口。另一种可能性是将迭代工具中的产品和星图结合起来:
from itertools import product, starmap
ips = [ip]
starmap(my_function, product(volume_ids, ips))
这可以很好地推广到具有多个 ip 地址或两个以上变量的设置。
这个怎么样?
results = []
for volume_id in volume_ids:
results.append(my_function(volume_id, ip=ip))
这是三行代码而不是一行代码---它是三行清晰明了的代码,而不是从模块某某导入一些特殊情况的助手。 这个论点可能是一个品味问题,但它有很大的分量,这取决于你和谁说话。