2009-03-13 7 views
7

Mögliche Duplizieren:
Ternary conditional operator in PythonWas ist der beste Weg, den ternären Operator in Python zu ersetzen?

Wenn ich einige Code wie haben:

x = foo ? 1 : 2 

Wie soll ich es auf Python übersetzen? Darf ich das machen?

if foo: 
    x = 1 
else: 
    x = 2 

Wird x immer noch außerhalb der if/then-Blöcke liegen? Oder muss ich so etwas tun?

x = None 
if foo: 
    x = 1 
else: 
    x = 2 
+0

Eine Möglichkeit, sie zu ersetzen, besteht darin, sie mit ihrem richtigen Namen aufzurufen. In Python ist es der "bedingte Ausdruck". In C ist es der "Bedingungsoperator". In Java ist es der "bedingte Operator". –

Antwort

26

Verwenden Sie den ternären Operator (formal conditional expression) in Python 2.5+.

x = 1 if foo else 2 
+0

Nur, bitte nennen Sie es den bedingten Ausdruck, denn das ist es. –

+0

@Adriano Varoli Piazza @ S.Lott hat das zur Antwort hinzugefügt. Vielen Dank! – phihag

0

könnten Sie so etwas wie:

val = float(raw_input("Age: ")) 
status = ("working","retired")[val>65] 
print "You should be",status 

obwohl es nicht sehr pythonic

(die anderen Optionen sind näher an C/PERL, aber das ist mehr Tupel Magie) ist

1

Duplizieren von this one.

Ich benutze diese (auch wenn ich für jemand warte auf downvote oder kommentieren, wenn es falsch ist):

x = foo and 1 or 2 
+0

Das funktioniert in diesem Fall, aber es kann allgemein gefährlich sein: x = foo und bar oder baz wird baz erzeugen, wenn foo wahr ist und bar ist falsch, was wahrscheinlich nicht das ist, was Sie wollen. – Khoth

+0

ah, hab es. Ich habe das eine Zeit lang benutzt und war mir nicht ganz sicher, warum es keine akzeptierte Methode war. Das kann ich jetzt sehen. – jonstjohn

+0

Dieser Code ist ziemlich spröde. – ncmathsadist

5

Der ternäre Operator mentioned von nur verfügbar ist, Python 2.5. Vom WeekeePeedeea:

Obwohl es mehr Jahren durch Meinungsverschiedenheiten über die Syntax, ein ternärer Operator für Python verzögert worden war, war als Python Enhancement Vorschlag 308 genehmigt und wurde auf die 2,5 Veröffentlichung im September 2006 aufgenommen .

Der ternäre Operator von Python unterscheidet sich von durch den gemeinsamen Operator?: In der Reihenfolge seine Operanden; Die allgemeine Form lautet op1 if condition else op2. Dieses Formular lädt op1 als normalen Wert und op2 als Ausnahmefall ein.

Vor 2.5 könnte man die hässliche Syntax (lambda x:op2,lambda x:op1)[condition]() verwenden, die auch Pflege nur Auswerten von Ausdrücken nimmt die um tatsächlich benötigt werden, um verhindern Nebenwirkungen.

-1

Ein schöner Python Trick wird mit diesem:

foo = ["ifFalse","ifTrue"][booleanCondition] 

Es hat eine 2-glied Liste erstellt und die boolean wird entweder 0 (falsch) oder 1 (true), die das richtige Mitglied nimmt. Nicht sehr gut lesbar, aber Pythonie :)

+0

Ich wäre weder lesbar, noch pythonisch, aber es ist immer noch etwas, das ich die ganze Zeit benutze ... Wenn du diesen Trick machst, tu es als Tupel: (trueFunc, falseFunc) [bool (condition)] –

+0

Das Python 2.5 Der bedingte Ausdruck wird nur EINEN der Ausdrücke trueFunc, falseFunc auswerten. Diese Formel wertet beide aus. –

+0

Verwenden Sie (booleanCondition und [trueFunc] oder [falseFunc]) [0]. – ThomasH

2

Ich benutze immer noch 2,4 in einem meiner Projekte und bin schon ein paar Mal darauf gestoßen. Die eleganteste Lösung, die ich für diese sehen habe, ist:

x = {True: 1, False: 2}[foo is not None] 

Ich mag dies, weil es einen klareren boolean Test als mit einer Liste mit den Indexwerten 0 und 1 für Ihren Rückgabewert zu erhalten.

+0

"nicht nicht foo" wäre besser - leere Listen, Nullen und whatnot sollten auch auf False ausgewertet werden. – Andreas

Verwandte Themen