Wie schreibe ich eine Inline-if-Anweisung für den Druck?

377

Ich muss einige Dinge nur drucken, wenn eine boolesche Variable auf gesetzt ist True. Also, nachdem sie bei der Suche das habe ich versucht , mit einem einfachen Beispiel:

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

Das Gleiche, wenn ich schreibe print a if b==True.

Was fehlt mir hier?

Ricky Robinson
quelle
1
Mögliches Duplikat von Hat Python einen ternären bedingten Operator?
Kenorb
2
Gute Frage, komplexe Antworten ... eine klare Frage wäre "der andere Teil ist obligatorisch".
Minuten

Antworten:

738

Python hat keine abschließende if Anweisung .

ifIn Python gibt es zwei Arten von :

  1. if Aussage:

    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 aund b = aAussagen sind. Nur der aTeil ist ein Ausdruck. Also wenn du schreibst

print a if b else 0

es bedeutet

print (a if b else 0)

und ähnlich, wenn Sie schreiben

x = a if b else 0

es bedeutet

x = (a if b else 0)

Was würde es nun drucken / zuweisen, wenn es keine elseKlausel gäbe ? Der Druck / die Zuordnung ist noch da .

Und beachten Sie, dass Sie die reguläre ifAnweisung immer in eine einzelne Zeile schreiben können, wenn Sie nicht möchten, dass sie vorhanden ist , obwohl sie weniger lesbar ist und es keinen Grund gibt, die zweizeilige Variante zu vermeiden.

Jan Hudec
quelle
Ich denke, if condition: statementdas funktioniert bei mehrzeiligen Anweisungen nicht.
Val
Ja, aber Sie müssen if nicht verwenden. Verwenden Sie einfach die boolesche Logik, wie ich unten in meinen Beispielen zeige.
Eduardo
1
@JanHudec Wenn Python kein Trailing hat if, warum funktioniert das dann : print [i for i in range(10) if i%2]? Ich wünschte, sie würden es außerhalb des Verständnisses zulassen ...
mbomb007
3
@ mbomb007, das ist auch keine nachgestellte if- Anweisung . Es ist einfach Teil des Listen- (oder Generator-) Verständnisses. Beachten Sie, dass das Ding vor dem if keine Anweisung ist, sondern zwei Ausdrücke forzwischen ihnen.
Jan Hudec
2
@AlexandervonWernherr, ja, das klingt vernünftig.
Jan Hudec
93

Inline if-else EXPRESSION muss immer eine else-Klausel enthalten, z.

a = 1 if b else 0

Wenn Sie Ihren Variablenwert 'a' unverändert lassen möchten, indem Sie den alten Wert 'a' angeben (andernfalls wird dies weiterhin von Syntaxanforderungen verlangt):

a = 1 if b else a

Dieser Code lässt a unverändert, wenn b zu False wird.

Rostyslav Dzinko
quelle
1
Oh. Aber was ist, wenn ich nicht möchte, dass im Zweig else etwas passiert? Ich brauche so etwas wie:print a if b
Ricky Robinson
2
else awäre dann besserelse 0
Aneroid
13
if b: print a
Benötigen Sie
4
Die Antwort korrigieren, denn es ist fast gut, wenn nicht das Wort "Aussage" wäre, das es total schlecht gemacht hätte. Der Kern der Frage ist, dass es keine Aussage ist.
Jan Hudec
1
+ 1-1: Gut, um darauf hinzuweisen, dass der else-Ausdruck obligatorisch ist, aber nicht in Ordnung, wenn die Antwort für den betreffenden Fall nicht angegeben wird: Drucken Sie "nichts" (etwas in der Art von ""oder None, siehe Details in anderen Antworten).
sancho.s ReinstateMonicaCellio
18

Die 'else'-Anweisung ist obligatorisch. Sie können solche Dinge tun:

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

BEARBEITEN:

Abhängig von Ihren Anforderungen können Sie auch Folgendes versuchen:

>>> if b: print(a)
Alexis Huet
quelle
15

Wenn Sie nicht möchten, from __future__ import print_functionkönnen Sie Folgendes tun:

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 from __future__ import print_functionPython 3 oder höher nicht ablehnen oder 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 benötigen das else für den bedingten Ausdruck (das "in line if else-Block").

Der Grund, warum ich andere im Thread nicht verwendet habe Noneoder 0mag, ist, dass die Verwendung None/0das Programm zu print Noneoder print 0in den Fällen veranlassen würde, in denen dies der Fall bist False.

Wenn Sie zu diesem Thema lesen möchten, habe ich einen Link zu den Versionshinweisen für den Patch eingefügt, mit dem diese Funktion zu Python hinzugefügt wurde.

Das obige 'Muster' ist dem in PEP 308 gezeigten Muster sehr ähnlich:

Diese Syntax mag seltsam und rückwärts erscheinen; Warum steht der Zustand in der Mitte des Ausdrucks und nicht vorne wie in Cs c? x: y? Die Entscheidung wurde überprüft, indem die neue Syntax auf die Module in der Standardbibliothek angewendet wurde und festgestellt wurde, wie der resultierende Code gelesen wurde. In vielen Fällen, in denen ein bedingter Ausdruck verwendet wird, scheint ein Wert der "allgemeine Fall" und ein Wert ein "Ausnahmefall" zu sein, der nur in selteneren Fällen verwendet wird, wenn die Bedingung nicht erfüllt ist. Die bedingte Syntax macht dieses Muster etwas offensichtlicher:

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

Insgesamt denke ich, dass dies ein vernünftiger Weg ist, dies zu erreichen, aber Sie können nicht mit der Einfachheit argumentieren:

if logging: print data
Noelkd
quelle
Vielen Dank. Die Sache hier ist, dass print ""immer noch etwas gedruckt wird: eine leere Zeile.
Ricky Robinson
Vielen Dank. Das endArgument in wird printnur in Python 3.x angezeigt, oder?
Ricky Robinson
1
Ja, ich bin eher ein 2,7-Mann, daher der from __future__ import print_function
Noelkd
11

Seit 2.5 können Sie das Äquivalent des ternären bedingten Operators "?:" Von C verwenden. Die Syntax lautet:

[on_true] if [expression] else [on_false]

Ihr Beispiel ist also in Ordnung, aber Sie müssen einfach hinzufügen else, wie:

print a if b else ''
Kenorb
quelle
2
Beachten Sie, dass print ''weiterhin eine neue Zeile gedruckt wird, was in der Antwort von Noelkd vermieden wird.
YoniLavi
8

Sie können verwenden:

print (1==2 and "only if condition true" or "in case condition is false")

Genauso gut können Sie weitermachen wie:

print 1==2 and "aa" or ((2==3) and "bb" or "cc")

Beispiel aus der realen Welt:

>>> print "%d item%s found." % (count, (count>1 and 's' or ''))
1 item found.
>>> count = 2
>>> print "%d item%s found." % (count, (count>1 and 's' or ''))
2 items found.
Eduardo
quelle
7

Dies kann mit der Formatierung von Zeichenfolgen erfolgen . Es funktioniert mit der% -Notation sowie mit .format () und f-Strings (neu in 3.6).

print '%s' % (a if b else "")

oder

print '{}'.format(a if b else "")

oder

print(f'{a if b else ""}')
Eric Ed Lohmar
quelle
Dies hat nichts mit Formatierung zu tun. du könntest es einfach tun print a if b else "". Genau das tut Noelkds Antwort.
Melpomene
@melpomene aber beim Drucken von "" wird eine neue Zeile print "",angezeigt, die mit (Doppelpunkt) für Python2 und print("", end="")Python3 vermieden werden kann.
m3nda
5

Für Ihren Fall funktioniert dies:

a = b or 0

Edit: Wie funktioniert das?

In der Frage

b = True

Also auswerten

b or 0

führt zu

True

welches zugeordnet ist a.

Wenn b == False?, b or 0würde den zweiten Operanden auswerten , 0die zugeordnet werden sollten würden a.


quelle
3
Hässlichkeit und Fehleranfälligkeit dieses Ausdrucks ist der Grund, warum wir überhaupt einen bedingten Ausdruck haben.
Jan Hudec
5

Versuche dies . Es könnte dir helfen

a=100
b=True

if b:
   print a
SkariaArun
quelle
4

Sie sind einfach zu kompliziert.

if b:
   print a
Nande
quelle
1
Das ist natürlich die einfachste Option. Ich denke, dass ich zu der Zeit (August 2012) etwas tun wollte wie:if DEBUG: print something
Ricky Robinson
Doppelte Antwort? Siehe das von SkariaArun und auch einen Kommentar.
sancho.s ReinstateMonicaCellio
2

Sie benötigen immer elseeine Inline, wenn:

a = 1 if b else 0

Aber ein einfacher Weg wäre es a = int(b).

Daniel Roseman
quelle
3
-1: Einfacher. Und völlig unlesbar. Und nicht das, was der Fragesteller wollte.
Jan Hudec
ITYM a = int(bool(b)).
glglgl
1

Warum schreibst du nicht einfach:

if b:
    print a
else:
    print 'b is false'
IcyFlame
quelle
1

hmmm, du kannst es mit einem Listenverständnis machen . Dies wäre nur dann sinnvoll, wenn Sie eine echte Reichweite hätten. Aber es macht den Job:

print([a for i in range(0,1) if b])

oder nur diese beiden Variablen verwenden:

print([a for a in range(a,a+1) if b])
George Mogilevsky
quelle