2016-07-01 9 views
3

Ich habe das Gefühl, dass es eine sehr einfache Möglichkeit geben sollte, auf bestimmte Elemente einer ausgewerteten Funktion zuzugreifen. Ein sehr einfaches Beispiel dafür, was ich zu erreichen versuche, istZugriff auf Objekte und Tupel von einer Funktion aus

def func(x): 
    a = 2*x 
    b = x*x 
    return 1, 10, 100, (a,b) 

ich einen Wert für x definieren und die Funktion gibt eine Reihe von Werten und ein Tupel. Ich möchte z. B. das erste Element und das Tupel abrufen. Code wie

hello, cello = func(2)[[0,3]] 

Gibt einen Fehler zurück. Jedoch kann ich auf diese Elemente einzeln zugreifen, zum Beispiel

.

Die Funktion, die ich verwende, braucht eine Weile, um zu bewerten, so dass es zweimal ausgeführt wird, ist keine wünschenswerte Option. Außerdem möchte ich, wenn möglich, keinen Haufen von Variablen für jedes einzelne Element des Tupels erstellen (enthält viele).

Im Wesentlichen würde ich eine Lösung wie die nach dem Vorbild der ist:

hello, cello = func(2)[[0,3]] 

Wo,

hello = 1 
cello = (4,4) 

Dank

+3

Entpacken und ignorieren Sie die Elemente, die Sie nicht brauchen: 'Hallo, _, _, cello = func (2)' – AChampion

+0

Ich kann nicht wirklich verstehen, was Sie fragen. Das hat nichts mit Funktionen zu tun; '[[0,3]]' ist einfach eine ungültige Syntax in Python. Wenn Sie die Funktion nicht verwenden und nur mit einem Tupel von '(1, 10, 100, (2, 3)) arbeiten, würde es auch nicht funktionieren. –

+0

Numpy Arrays erlauben die Indizierung wie 'x [[0,3]]', aber nicht Listen oder Tupel. – hpaulj

Antwort

3

So können Sie auspacken und ignorieren:

hello, _, _, cello = func(2) 

Aber wenn th e Ergebnis ist komplizierter Sie operator.itemgetter verwenden können:

from operator import itemgetter 
hello, cello, bello = itemgetter(0, 3, 15)(func(2)) 

Oder mehr verbosely: die Rückkehr in ein Wörterbuch und Verwendung

my_results = itemgetter(0, 3, 15) 
hello, cello, bello = my_results(func(2)) 
+0

Ich wusste nicht, 'itemgetter' kann' * args' nehmen. Und das sowohl mit einem Wörterbuch als auch mit Listen/Tupeln. Ich frage mich, dass es viel schneller ist als ein Listenverständnis. Ich habe die meisten meiner Pythons gelernt, bevor diese hinzugefügt wurden (und 'numpy' benötigt sie nicht). – hpaulj

+0

Ich überprüfte 'itemgetter'; es ist Python-Code. 'itemgetter ([1,2,3]) (foo())' ist äquivalent zu 'obj = foo(); Tupel ([obj [i] für i in [1,2,3]]) '. Möglicherweise praktisch, aber keine Geschwindigkeitsverbesserung. – hpaulj

0

Versuchen

hello, cello = [func(2)[i] for i in [0,3]] 
+0

, aber dies läuft 'func' für jede Iteration von' i'. – hpaulj

+0

'itemgetter' schreibt das so um, dass' func (2) 'nur einmal ausgewertet wird. – hpaulj

0

Die Standardlösung zu packen wäre das, um die Ergebnisse zu trennen.

Auf diese Weise können Sie sich das Zählen des _ und speichern Sie den Code ist besser lesbar

Rückkehr {Iteration: iter, Ergebnis: res ....}

Erg = func (... später

Erg [Iteration]

verwenden.)

Und.

Verwandte Themen