Wie kann eine Funktion einen dynamischen Wert zurückgeben, der von der Anzahl der Empfänger in Python abhängt?

StackOverflow https://stackoverflow.com/questions/8313705

Frage

Zum Beispiel:

a = f()  => a = None
a, b = f()  => a=b= None
(a, b) = f() => a=b= None
(a, b, c, d, e, f) = f()  => a=b=c=d=e=f= None

Ich denke, dies könnte über Generatorverständnis oder Iterator erfolgen, aber ich war blockiert, wie man die Reechs mehr erhält. Vielleicht war ich in der falschen Richtung. Würden Sie mir einige Tipps beraten?

Jede Hilft wird geschätzt.

Vielen Dank,

Tiezhen

War es hilfreich?

Lösung

Leider hat Python -Auspacks Tupel mit dem pythonischen "Es ist einfacher, Vergebung als Erlaubnis zu bitten" zurückgegeben. Das heißt, wenn Sie eine Erklärung haben:

a,b,c = f()

Hinter den Kulissen macht es etwas im Sinne von:

try:
    a = returned[0]
    b = returned[1]
    c = returned[2]
except IndexError:
    raise ValueError('need more than k values to unpack')

try:
    _ = returned[4]
except IndexError:
    pass
else:
    raise ValueError('too many values to unpack')

class VariableReturn(object):
    def __getitem__(self, index):
        return ...

In Python 3 können Sie irgendwie tun, was Sie fragen, aber die Belastung ist auf dem Anrufer, nicht die Funktion, die aufgerufen wird. Die Funktion sollte immer die gleiche Anzahl von Ergebnissen zurückgeben, aber wir werden die verbleibenden Ergebnisse verwenden Erweitertes Tupelpackung, wie gezeigt in Diese Stackoverflow -Frage.

a,*others = f()
a,b,*others = f()
a,b,c,*others = f()

Andere Tipps

Wenn es Ihnen nichts ausmacht, Python 3 zu verwenden, können Sie zum Beispiel ignorieren, was Sie nicht benötigen:

a, b, c, d, *_ = (x for x in range(100))

Versuche dies:

def f(n):
    return (None, ) * n

Zum Beispiel:

a, b, c = f(3)

... soweit Sie können, da es in Python keine Möglichkeit gibt, zu wissen, wie viele Variablen auf der linken Seite einer Aufgabe sind.

Kann nicht fertig sein.

Funktionen in Python geben nur einen Wert zurück. Während es manchmal nach mehr aussieht, ist es immer noch nur ein Wert: ein Tupel. Mehrere Zuordnung ist dann ein Prozess von Tupelpackung.

Wahrscheinlich ist das, was ich mir vorstellen kann, einen Generator zu verwenden und die gewünschte Anzahl von Elementen mit zu erhalten itertools.islice:

a = itertools.count()
x, y, z = itertools.islice(a, 3) # 0, 1, 2
u, v = itertools.islice(a, 2)    # 3, 4

Aber das ist ziemlich weit von dem, was gehofft wurde.

Ziemlich nicht nett, aber vielleicht hilft dir das:

def f(x):
    for i in x:
        globals()[i] = None

f(['a','b','c'])
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top