2016-08-13 9 views
1

Gibt es eine MöglichkeitPython - Liste der Zuordnungen

statements = [statement1, statement2, statement3, ...] 

in Python haben?

ich tun möchte in der Lage sein:

run statements[i] 

oder:

f = statements[j] (wobei f eine Funktion)

P. S. Ich möchte eine Liste von Zuweisungsanweisungen haben (Lambda würde nicht funktionieren) und ich möchte keine Funktionen erstellen. Zum Beispiel:

switch = [output = input, output = 2 * input, output = input ** 2] 

Gibt es eine andere Möglichkeit, als eine Funktion für jeden Eintrag zu definieren?

Vielen Dank an alle, die meine Frage beantwortet haben.

+0

Sehen als Funktionen Objekte sind, ja, das ist möglich ... Was haben Sie versucht? –

+0

Beachten Sie, dass Sie 'statement1 ... statementn' im Voraus definieren müssen (' def statement1(): ... 'oder lambdas verwenden. – Perkins

Antwort

0

Ich möchte in der Lage zu tun: run statements[i]

gut, können Sie tun, indem exec:

statements = ["result=max(1,2)","print(result)"] 
for idx in range(len(statements)): 
    exec(statements[idx]) 
print(result) 

Ich hoffe es hilft!

+0

Diese Antwort ist am ehesten zu der, die ich gefragt habe, die sie nicht benötigt Funktionen definieren, aber gibt es jetzt eine Möglichkeit für mich, f = statement zu machen, um eine Funktion zu erstellen? – pooya13

0

Das ist völlig in Ordnung:

def addbla(item): 
    return item + ' bla' 

items = ['Trump', 'Donald', 'tax declaration'] 
new_items = [addbla(item) for item in items] 
print(new_items) 

Es fügt eine politische Aussage zu jedem Punkt in items :)

0

Wenn Sie einen Block von Anweisungen ausgeführt werden sollen, eine Funktion verwenden.

def run_statements(): 
    func() 
    for i in range(3): 
     if i > 1: 
      break 
    extra_func() 

run_statements() 

Wenn Sie spezifische Anweisungen aus einer Liste wählen möchten, wickeln jedes in einer Funktion:

def looper(): 
    for i in range(3): 
     if i>1: 
      break 

def func(): 
    print('hello') 

statements = [looper, func] 
statements[-1]() 

Wenn Ihre Aussagen sind einfach Anrufe funktionieren, können Sie sie direkt in eine Liste setzen, ohne die Schaffung Wrapper-Funktionen.

4

Ja. Funktionen sind First-Class-Bürger in Python: d.h. Sie könnten sie als Parameter übergeben oder sogar in einem Array speichern.

Es ist nicht ungewöhnlich, dass eine Liste von Funktionen zu haben:

#!/usr/bin/env python 

processing_pipeline = [] 

def step(function): 
    processing_pipeline.append(function); 
    return function 

@step 
def step_1(data): 
    print("processing step1") 

@step 
def step_2(data): 
    print("processing step2") 

@step 
def step_3(data): 
    print("processing step3") 

def main(): 
    data = {} 
    for process in processing_pipeline: 
     process(data) 

if __name__ == '__main__': 
    main() 

Hier die processing_pipeline sind nur eine Liste mit Funktionen: Sie könnten eine einfache Registrierung in Python wie diese bauen. step ist eine so genannte Dekorateur-Funktion, die wie ein Verschluss funktioniert. Der Python-Interpreter fügt beim Analysieren der Datei jede dekorierte @step zur Pipeline hinzu.

Und Sie können auf die Funktion mit einem Iterator zugreifen, oder über processing_pipeline[i]: versuchen Sie processing_pipeline[2](data) hinzufügen.

0

können Sie tun:

funcs = [min, max, sum] 
f = funcs[0] 
funcs[1](1,2,3) # out 3 
funcs[2]([1,2,3]) # out 6 
0

Da wir jede andere Art und Weise gehabt haben, ich dachte, dass ich dieses heraus werfen würde:

def a(input): 
    return pow(input, 3) 

def b(input): 
    return abs(input) 

def c(input): 
    return "I have {0} chickens".format(str(input)) 

#make an array of functions 
foo = [a,b,c] 

#make a list comprehension of the list of functions 
dop = [x(3) for x in foo] 
print dop