Ist eine Zuordnung in einem Zustand möglich?Können wir eine Zuweisung in einer Bedingung haben?
Für z.
if (a=some_func()):
# Use a
Ist eine Zuordnung in einem Zustand möglich?Können wir eine Zuweisung in einer Bedingung haben?
Für z.
if (a=some_func()):
# Use a
Warum nicht ausprobieren?
>>> def some_func():
... return 2
...
>>> a = 2
>>> if (a = some_func()):
File "<stdin>", line 1
if (a = some_func()):
^
SyntaxError: invalid syntax
>>>
Also, nein.
Dies ist absichtlich verboten, da Guido, wohlwollender Python-Diktator, sie unnötig und verwirrender als nützlich findet. Aus demselben Grund gibt es auch keine Post-Inkrement- oder Pre-Increment-Operatoren (++). –
er erlaubte das Hinzufügen von * augmented assigment * in 2.0, weil 'x = x + 1' zusätzliche Nachschlagezeit benötigt, während' x + = 1' etwas schneller war, aber ich bin mir sicher, dass er * das gar nicht mochte * viel. :-) – wescpy
Nein. Die Zuweisung in Python ist eine Anweisung, kein Ausdruck.
Und Guido hätte es nicht anders. –
@MarkRansom Alle Grüße Guido. * Richtig * .. Seufzer. – javadba
@javadba der Typ war viel öfter richtig als er falsch lag. Ich bin mir darüber im Klaren, dass eine einzige Person, die für die Vision verantwortlich ist, zu einer viel kohärenteren Strategie führt als das Design der Ausschüsse; Ich kann vergleichen und kontrastieren mit C++, das ist mein Hauptbrot und Butter. –
http://docs.python.org/tutorial/datastructures.html
Beachten Sie, dass in Python, im Gegensatz zu C, Zuordnung nicht innerhalb Ausdrücke auftreten können. C-Programmierer können darüber murren , aber es vermeidet eine gemeinsame Klasse von Problemen in C Programme: typing = in einem Ausdruck , wenn == war beabsichtigt.
siehe auch:
http://effbot.org/pyfaq/why-can-t-i-use-an-assignment-in-an-expression.htm
Nö, hat der BDFL nicht wie diese Funktion.
Von wo aus ich sitze, hat Guido van Rossum, "Wohltätiger Diktator für das Leben", hart dafür gekämpft, Python so einfach wie möglich zu halten. Wir können mit einigen der Entscheidungen, die er getroffen hat - ich hätte es vorgezogen Er sagte "Nein" öfter, aber die Tatsache, dass es kein Komitee gab, das Python entwarf, sondern ein vertrauenswürdiges "Beratungsgremium", das größtenteils auf Verdienst basierte und durch Sensibilität des Designers filterte, hat eine Hölle von a produziert nette Sprache, IMHO
Simple? Diese Funktion könnte einen Teil meines Codes vereinfachen, da er kompakter und damit besser lesbar wäre. Jetzt brauche ich zwei Zeilen, wo ich früher eine brauchte. Ich habe nie verstanden, warum Python viele andere Programmiersprachen für viele Jahre abgelehnt hat (und das oft aus einem sehr guten Grund). Besonders dieses Feature, über das wir hier sprechen, ist sehr, sehr nützlich. In –
Nicht direkt, per this old recipe of mine - aber wie das Rezept sagt, ist es einfach, das semantische Äquivalent zu erstellen, zB wenn Sie direkt von einem C-codierten Referenzalgorithmus transliterieren müssen (vor Refactoring zu mehr-idiomatischen Python, von cour se ;-). Dh:
class DataHolder(object):
def __init__(self, value=None): self.value = value
def set(self, value): self.value = value; return value
def get(self): return self.value
data = DataHolder()
while data.set(somefunc()):
a = data.get()
# use a
BTW, ein sehr idiomatisch Pythonic Form für Ihren speziellen Fall, wenn Sie genau wissen, was falsish Wert somefunc
zurückkehren kann, wenn er einen falsish Wert zurückgibt (zB 0
), ist
for a in iter(somefunc, 0):
# use a
Also in diesem speziellen Fall wäre das Refactoring ziemlich einfach ;-).
Wenn die Rückkehr könnte any Art der falsish Wert sein (0, None
, ''
, ...)), Eine Möglichkeit ist:
import itertools
for a in itertools.takewhile(lambda x: x, iter(somefunc, object())):
# use a
aber Sie könnten einen einfachen benutzerdefinierten Generator bevorzugen:
def getwhile(func, *a, **k):
while True:
x = func(*a, **k)
if not x: break
yield x
for a in getwhile(somefunc):
# use a
Einer der Gründe, warum Zuweisungen in Bedingungen illegal sind, ist, dass es einfacher ist, einen Fehler gemacht und zuweisen Getreu zu machen oder Falsch:
some_variable = 5
# This does not work
# if True = some_variable:
# do_something()
# This only works in Python 2.x
True = some_variable
print True # returns 5
In Python 3 True und False sind Schlüsselwörter, also kein Risiko mehr.
[161]: l_empty == [] Out [161]: Wahren In [162]: [] == [] Out [162]: Wahre Ich glaube nicht, dass ist der Grund, – volcano
Sie können eine Funktion definieren Sie die Zuordnung zu tun:
def assign(name, value):
import inspect
frame = inspect.currentframe()
try:
locals_ = frame.f_back.f_locals
finally:
del frame
locals_[name] = value
return value
if assign('test', 0):
print("first", test)
elif assign('xyz', 123):
print("second", xyz)
-1: Trivial selbst zu beantworten. Duplizieren: http://stackoverflow.com/questions/1663995/python-variable-assignment-and-if-statement –
@ S.Lott Nicht so trivial zu wissen, warum, wenn es für einige der Antworten, die das beschreiben, nicht wäre Hier. –