簡體   English   中英

將map()函數與關鍵字參數一起使用

[英]Using map() function with keyword arguments

這是我嘗試在其中使用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來將關鍵字傳遞給函數,方法是將該函數包裝在可以解開字典的內容中,然后將可迭代的字典傳遞給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地址或兩個以上變量的設置。

這個怎么樣?

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

這是三行代碼,而不是一行---這是三行清晰明了的代碼,而不是從某某類模塊中導入一些特殊情況的幫助程序。 該論點可能只是一個品味問題,但取決於您與誰交談,它具有很大的分量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM