webentwicklung-frage-antwort-db.com.de

Python Ternary Operator Ohne sonst

Kann man dies in einer Zeile in Python machen?

if <condition>:
    myList.append('myString')

Ich habe den ternären Operator ausprobiert:

myList.append('myString' if <condition>)

aber meine IDE ( MyEclipse ) mochte es nicht ohne else.

52
JCB

Ja, das kannst du machen:

<condition> and myList.append('myString')

Wenn <condition> falsch ist, tritt ein Kurzschluss ein und die rechte Seite wird nicht ausgewertet. Wenn <condition> wahr ist, wird die rechte Seite ausgewertet und das Element angehängt.

Ich möchte nur darauf hinweisen, dass die oben genannten Schritte nicht für Pythonic sind, und es wäre wahrscheinlich am besten, dies zu schreiben, unabhängig von

if <condition>: myList.append('myString')

Demonstration:

>>> myList = []
>>> False and myList.append('myString')
False
>>> myList
[]
>>> True and myList.append('myString')
>>> myList
['myString']
74
Claudiu

Der Grund, aus dem die Sprache die Syntax nicht zulässt

variable = "something" if a_condition

ohne else ist das, falls a_condition == False plötzlich variable unbekannt ist. Möglicherweise könnte dies standardmäßig None sein, aber Python erfordert, dass alle Variablenzuweisungen tatsächlich zu expliziten Zuweisungen führen. Dies gilt auch für Fälle wie Ihren Funktionsaufruf, da der an die Funktion übergebene Wert genauso wie der RHS einer Zuweisungsanweisung ausgewertet wird.

Ebenso müssen alle returns tatsächlich zurückkehren, auch wenn sie bedingte returns sind. Z.B:

return variable if a_condition

ist nicht erlaubt, aber 

return variable if a_condition else None

ist erlaubt, da garantiert wird, dass das zweite Beispiel explizit etwas zurückgibt.

28
if <condition>: myList.append('myString')

Ansonsten nein. Warum die Notwendigkeit, es auf eine Zeile zu setzen?

Beachten Sie, dass der "ternäre Operator" ein Operator ist. Wie jeder Operator muss etwas zurückgeben. Wie können Sie also einen ternären Operator ohne die Klausel else haben? Was soll es zurückgeben, wenn die Bedingung nicht wahr ist?

11
mgilson

Sie fragen im Grunde nach dem Konstrukt do_thing() if <condition> else pass (das SyntaxError wirft, wenn es ausgeführt wird). Wie ich während der Recherche für (etwas) herausgefunden habe, ist ähnliche Fragedo_thing() if condition else None so nah wie möglich (was nur eine andere Möglichkeit ist, <condition> and do_thing() zu tun). Um diese Idee und andere Antworten zusammenzufassen, haben Sie folgende Möglichkeiten:

  • if <condition>: myList.append('myString') - scheint der am wenigsten "hackige" (und somit bevorzugte) Weg zu sein
  • <condition> and myList.append('myString')
  • myList.append('myString') if <condition> else None
6
Filipp W.

myList.extend(['myString'] if condition else []) würde auch funktionieren, obwohl es mehr Arbeit als die anderen Lösungen ist.

3
Jake Biesinger

Sie können so etwas tun:

myList.append('myString') if <condition> else False

oder

myList.append('myString') if <condition> else 0
0