2016-06-03 11 views
2

Betrachten Sie das Beispiel:Gibt es eine Abkürzung für die wiederholte Neuzuweisung einer Variablen?

x = 27 
x = sqr(x) 
x += 2 
x = x * 0.1 

Diese triviale Jetzt

x = 0.1 * (sqr(27) + 2) 

reduziert werden könnte, (x als OrderedDict)

x = {k: bubble_sort(v) for k, v in x.items()} 

x = {k: rename(k) for k, v in x.items()} 

x = {k: abs(k) for k, v in x.items()} 

Gibt es eine Abkürzung Trick zu vermeiden betrachten Wiederholung die variable Zuordnung? Zum Beispiel gibt es eine Funktion, so dass:

def pipeline(x, function_handles): 
    .... 
    for f in function_handles: 
     x.apply(f) #in place 
return x 

oder

def pipeline(x, expression): 
    .... 
    for ex in expression: 
     ex(x) #in place 
return x 
+1

'Karte (func, iterable)'? –

+0

Das funktionierendste, was ich mir vorstellen kann, ist die Tupel-Zuweisung, aber ich habe keine Garantie, dass man Sachen wie 'x, x, x = e, f (x), g (x)' machen kann, die 'e' sind Ausdruck und "f" und "g" willkürliche Funktionen. –

+5

Meinten Sie, dass 'my_ordered_dict.items()' durch 'x.items()' im Wörterbuch-Absatz ersetzt werden soll? –

Antwort

1

Im operator Modul gibt es die Funktion operator.methodcaller. Es funktioniert wie itemgetter, die die Sie am ehesten schon gesehen haben: gegeben Name, der Rückgabewert methodcaller ist Teilfunktion, die die benannte Methode des Arguments aufruft.

Das heißt, gegeben:

x = SomeObjectType() 
f = operator.methodcaller('amethod', 'arg1', arg2=100) 
f(x) 

die gleiche wie zu sagen:

x = SomeObjectType() 
x.amethod('arg1', arg2=100) 

Sie diese zusammen mit einfachen nutzen könnten lambda Ausdrücke und/oder functools.partial oder partial_method eine Liste von Funktionen zu konstruieren/anzuwendende Methoden Dann könnten Sie, wie @ cricket_007 vorgeschlagen hat, Code verwenden oder schreiben, um sie automatisch anzuwenden.

Ebenfalls zu beachten ist functools.reduce. Sie können eine Anruferfunktion schreiben oder konstruieren und dann reduce verwenden, um eine Liste mit Funktionen zum Aufrufen bereitzustellen.

Hier einige Code, um eine Liste von Funktionen, mit einer Liste von Daten zu reduzieren (py3, funktionieren aber in 2.7):

#!python3 
import functools 
import itertools 
import operator 

data = [8, 6, 7, 5, 3, 0, 9] 

def apply(val, fn): 
    print("F=",fn, "val=",val) 
    return fn(val) 


from functools import reduce 

fns = [sorted, 
     max, 
     str, 
    ] 

print(reduce(apply, fns, data)) 
Verwandte Themen