2016-12-21 11 views
0

Aufruf Nehmen Sie dieses Beispiel:eine Funktion aus einer Liste in Python

presets = [ 
    "eggs", 
    "bacon" 
    ] 

print(presets[0]) 
>>> eggs 

Warum kann ein nicht dasselbe tun, mit einer Liste von Elementen auszuführen? Nehmen Sie dieses Beispiel:

from animations import animation_2, animation_3, animation_4 
presets = [ 
    animation_2.iterate(animations_templates_path, thumbnails_final), 
    animation_3.iterate(animations_templates_path, thumbnails_final), 
    animation_4.iterate(animations_templates_path, thumbnails_final) 
    ] 

Wenn ich laufen diese (sowohl mit als auch ohne preset[n]) es alle drei Befehle in der Liste ausführt. Warum ist das? Ich hätte gerne eine Liste dieser Presets und rufe sie über eine Indexnummer an. Was mache ich falsch?

+1

Sie tun können ** genau die gleiche Sache **, * wenn * Sie die Callables speichern und nicht das Ergebnis von ihnen fordern. Einfach speichern, z.B. 'animation_2.iterate', dann übergeben Sie die Argumente, wenn Sie sie * aus * der Liste zurücknehmen. – jonrsharpe

+0

Speichern als 'presets = [animation_2.interate, ...]'. Dann rufen Sie an .............................................. 'Presets [0] (animations_templates_path, thumbnails_final)' – pylang

+0

Wenn Sie '[faktoriell (4), Fakultät (5)]' 'in einem Programm gesehen haben, denken Sie, das erste Element dieser Liste ist ein Befehl, den Sie später abrufen und ausführen können , oder würdest du denken, dass es das Faktorielle von 4 ist? Gleiches mit deinem Code. – user2357112

Antwort

1

Sie können die tatsächlichen Funktionsobjekte in einer Liste speichern

from animations import animation_1, animation_2, animation_3 
presets = [ 
    animation_2.iterate, 
    animation_3.iterate, 
    animation_4.iterate 
    ] 

Dann basierend auf seinen Index die gewünschte Funktion aufrufen. Auf diese Weise wird die Funktion nicht beim Erstellen der list ausgeführt, sondern nur ausgeführt, sobald Sie sie aufrufen.

presets[0](animations_templates_path, thumbnails_final) 
+0

Genau das habe ich gesucht. Vielen Dank! –

2

Es führt die Elemente aus, weil das ist, was Sie sagen, es zu tun. Ihr Code ist genau das gleiche wie folgt aus:

p1 = animation_2.iterate(animations_templates_path, thumbnails_final) 
p2 = animation_3.iterate(animations_templates_path, thumbnails_final) 
p3 = animation_4.iterate(animations_templates_path, thumbnails_final) 
presets = [p1, p2, p3] 

Python hat keine Möglichkeit zu wissen, dass Sie nicht diese Funktionen zu nennen gedenke.

Eine Lösung ist ein Tupel zu speichern:

presets = [ 
    (animation_2.iterate, animations_templates_path, thumbnails_final), 
    (animation_3.iterate, animations_templates_path, thumbnails_final), 
    (animation_4.iterate(animations_templates_path, thumbnails_final), 

]

, dass die Funktion und die Argumente speichert, ohne dass die Funktion aufrufen. Sie können zu einem späteren Zeitpunkt über die Liste iterieren und die Funktion ausführen.

+0

Dies ist sehr hilfreich, um mir zu verstehen, was ich mache. Allerdings werde ich die andere Antwort als Lösung markieren, weil es mir in meinem Anwendungsfall erlaubt, weniger Code zu schreiben und einfacher darüber zu iterieren. –

Verwandte Themen