Python 使用带有关键字参数的map()函数
下面是我试图在其上使用Python 使用带有关键字参数的map()函数,python,arguments,map-function,Python,Arguments,Map Function,下面是我试图在其上使用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参数,这将是微不足道的,但我不知道如何处理它。使用: partial() 这个怎么样 results = [] for volume_id in volume_ids: results.appen
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
参数,这将是微不足道的,但我不知道如何处理它。使用:
partial()
这个怎么样
results = []
for volume_id in volume_ids:
results.append(my_function(volume_id, ip=ip))
这是三行代码,而不是一行——这是三行清晰明了的代码,而不是从某某模块导入一些特殊的案例助手。这个论点可能是一个品味的问题,但它有很大的分量,这取决于你与谁交谈。这可以通过列表理解轻松完成
volume_ids = [1,2,3,4,5]
ip = '172.12.13.122'
results = [my_function(i,ip=ip) for i in volume_ids]
通常,可以使用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地址或两个以上变量的设置。部分更快,lambdas支持无序参数问题是我们想要避免for循环为什么?因为它更清晰?或者是因为一些误解,比如“for循环在Python中很慢”?是的,我想说的是,它确实更清晰、更Pythonish,而map函数是为了执行最慢的迭代。此外,我们需要返回一个列表,所以map对我们来说比写更多的行来编码循环更好,因为这有副作用。您正在分配一组可能不需要的内存(OP没有指定)。
map(my_function, volume_ids, [ip]*len(volume_ids))
from itertools import product, starmap
ips = [ip]
starmap(my_function, product(volume_ids, ips))