2012-11-21 9 views
25

Hier ist die Schleife I auf die map Funktion zu nutzen versuchen:Mit map() Funktion mit Schlüsselwort-Argumente

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

Gibt es eine Möglichkeit kann ich dies tun? Es wäre trivial, wenn es nicht für den Parameter ip wäre, aber ich bin mir nicht sicher, wie ich damit umgehen soll.

Antwort

55

Verwendung functools.partial():

from functools import partial 

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

partial() erstellt ein neues aufrufbar, das wird alle Argumente gelten (einschließlich Keyword-Argumente) an die eingewickelt Funktion zusätzlich zu was auch immer zu diesem neuen aufrufbar geben wird.

+1

sehr cool, danke! –

9

Dies ist eine Lambda-Ansatz (nicht besser, nur anders)

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

Partials sind schneller, lambdas Unterstützung außerhalb der Reihenfolge Argumente –

0

Wie wäre das?

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

Dies ist drei Zeilen Code statt einer --- es drei Linien klar und offensichtlich Code statt einige Sonderfall Helfer aus dem Modul so und so zu importieren. Dieses Argument ist wahrscheinlich eine Frage des Geschmacks, aber es hat eine Menge Gewicht, je nachdem, mit wem Sie sprechen.

+0

Das Problem ist, dass wir die for-Schleife vermeiden wollen – mleger45

+0

Warum? Weil es klarer ist? Oder wegen eines Missverständnisses wie "For-Schleifen sind langsam in Python"? –

+0

Ja, ich würde sagen, in der Tat ist klarer, mehr Pythonish, und Kartenfunktion soll die faulste Iteration möglich durchführen. Außerdem brauchen wir eine Liste zurück, so würde map es besser für uns ausführen, als mehr Zeilen zu schreiben, die eine for-Schleife codieren – mleger45

4

Dies kann problemlos mit einem Listenverständnis durchgeführt werden.

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

Die Argumente zu my_function im Verständnis sind rückwärts. Es sollte my_function (i, ip = ip) sein –

Verwandte Themen