548 Stimmen

Wie schreibt man eine inline if-Anweisung für den Druck?

Ich muss einige Dinge nur drucken, wenn eine boolesche Variable auf True . Nachdem ich mir also die diese Ich habe es mit einem einfachen Beispiel versucht:

>>> a = 100
>>> b = True
>>> print a if b
  File "<stdin>", line 1
    print a if b
             ^
SyntaxError: invalid syntax  

Dasselbe gilt, wenn ich schreibe print a if b==True .

Was übersehe ich hier?

1020voto

Jan Hudec Punkte 69126

Python tut no haben ein nachgestelltes if Anweisung .

Es gibt zwei Arten von if in Python:

  1. if Erklärung:

    if condition: statement
    if condition:
        block
  2. if Ausdruck (eingeführt in Python 2.5)

    expression_if_true if condition else expression_if_false

Und beachten Sie, dass beide print a y b = a sind Aussagen. Nur die a Teil ist ein Ausdruck. Wenn Sie also schreiben

print a if b else 0

es bedeutet

print (a if b else 0)

und in ähnlicher Weise, wenn Sie schreiben

x = a if b else 0

es bedeutet

x = (a if b else 0)

Was würde nun gedruckt/zugewiesen werden, wenn es keine else Klausel? Der Druck/die Zuweisung lautet noch da .

Und beachten Sie, dass Sie, wenn Sie nicht wollen, dass es dort ist, können Sie immer schreiben die regelmäßige if Anweisung in einer einzigen Zeile, obwohl sie weniger lesbar ist und es eigentlich keinen Grund gibt, die zweizeilige Variante zu vermeiden.

131voto

Rostyslav Dzinko Punkte 38696

Inline if-else AUSDRUCK muss immer eine else-Klausel enthalten, z. B:

a = 1 if b else 0

Wenn Sie den Wert der Variablen "a" unverändert lassen wollen, setzen Sie den alten Wert von "a" ein (sonst ist die Syntax weiterhin erforderlich):

a = 1 if b else a

Dieser Teil des Codes lässt a unverändert, wenn sich b als falsch erweist.

34voto

Alexis Huet Punkte 735

Die "else"-Anweisung ist obligatorisch. Sie können Dinge wie diese tun:

>>> b = True
>>> a = 1 if b else None
>>> a
1
>>> b = False
>>> a = 1 if b else None
>>> a
>>> 

EDITAR:

Oder, je nach Bedarf, können Sie es versuchen:

>>> if b: print(a)

23voto

Noelkd Punkte 7362

Wenn Sie nicht wollen, dass from __future__ import print_function können Sie wie folgt vorgehen:

a = 100
b = True
print a if b else "",  # Note the comma!
print "see no new line"

Welche Drucke:

100 see no new line

Wenn Sie keine Angst haben vor from __future__ import print_function oder Python 3 oder höher verwenden:

from __future__ import print_function
a = False
b = 100
print(b if a else "", end = "")

Das Hinzufügen des else ist die einzige Änderung, die Sie vornehmen müssen, um Ihren Code syntaktisch korrekt zu machen, Sie brauchen das else für den bedingten Ausdruck (die "in line if else blocks")

Der Grund, warum ich nicht None o 0 wie es andere in diesem Thread getan haben, ist, weil die None/0 würde dazu führen, dass das Programm print None o print 0 in den Fällen, in denen b es False .

Wenn Sie mehr über dieses Thema lesen möchten, habe ich eine enlace zu den Versionshinweisen für den Patch, dass diese Funktion zu Python hinzugefügt wurde.

Das obige "Muster" ist dem in PEP 308 dargestellten Muster sehr ähnlich:

Diese Syntax mag seltsam und rückständig erscheinen; w in der Mitte des Ausdrucks und nicht vorne, wie in C's c ? x : y? Die Entscheidung wurde überprüft, indem die neue Syntax auf die Module in der Standardbibliothek anwandte und sah, wie sich der resultierende Code lesen. In vielen Fällen, in denen ein bedingter Ausdruck verwendet wird, scheint ein Wert der "Normalfall" und ein Wert ein "Ausnahmefall" zu sein scheint, der nur in seltenen Fällen verwendet wird, wenn die Bedingung nicht erfüllt ist. Die bedingte Syntax macht dieses Muster etwas deutlicher:

Inhalt = ((doc + ' \n ') if doc else '')

Ich denke also, dass dies insgesamt eine vernünftige Herangehensweise ist, aber man kann nicht mit der Einfachheit von argumentieren:

if logging: print data

15voto

Mussa Charles Punkte 609

Sie können einen ternären Inline-Operator wie folgt schreiben:

sure = True

# inline operator
is_true = 'yes' if sure else 'no'

# print the outcome
print(is_true)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X