Jak napisać instrukcję inline if do wydruku?

376

Muszę wydrukować niektóre rzeczy tylko wtedy, gdy zmienna boolowska jest ustawiona na True. Po przyjrzeniu się temu spróbowałem na prostym przykładzie:

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

To samo, jeśli napiszę print a if b==True.

Czego tu brakuje?

Ricky Robinson
źródło
2
Dobre pytanie, złożone odpowiedzi ... proste byłoby „druga część jest obowiązkowa”.
min.

Odpowiedzi:

737

Python nie ma końcowej if instrukcji .

W ifPythonie istnieją dwa rodzaje :

  1. if komunikat:

    if condition: statement
    if condition:
        block
  2. if wyrażenie (wprowadzone w Pythonie 2.5)

    expression_if_true if condition else expression_if_false

I uwaga, że zarówno print ai b = asą oświadczenia. Tylko aczęść jest wyrażeniem. Więc jeśli napiszesz

print a if b else 0

to znaczy

print (a if b else 0)

i podobnie podczas pisania

x = a if b else 0

to znaczy

x = (a if b else 0)

Co by to wydrukowało / przypisało, gdyby nie było elseklauzuli? Wydruk / przypisanie nadal tam jest .

I zauważ, że jeśli nie chcesz, żeby tam była, zawsze możesz napisać zwykłą ifinstrukcję w jednym wierszu, chociaż jest ona mniej czytelna i naprawdę nie ma powodu, aby unikać wariantu dwuwierszowego.

Jan Hudec
źródło
Myślę, że if condition: statementto nie działa w przypadku oświadczeń wielowierszowych.
Val
Tak, ale nie musisz go używać, jeśli po prostu użyj logiki logicznej, tak jak pokazałem poniżej w moich przykładach.
Eduardo,
1
@JanHudec Jeśli Python nie posiada końcowego znaku if, to dlaczego to działa: print [i for i in range(10) if i%2]? Chciałbym, żeby pozwolili na to poza zrozumieniem ...
mbomb007
3
@ mbomb007, to też nie jest instrukcja if if . Jest to po prostu część zrozumienia listy (lub generatora). Zauważ, że rzecz przed if nie jest instrukcją, są to dwa wyrażenia formiędzy nimi.
Jan Hudec
2
@AlexandervonWernherr, tak, to brzmi rozsądnie.
Jan Hudec
93

Inline if-else EXPRESSION zawsze musi zawierać klauzulę innego, np:

a = 1 if b else 0

Jeśli chcesz pozostawić niezmienioną wartość zmiennej „a” - przyjmując starą wartość „a” (inaczej jest to nadal wymagane przez wymagania dotyczące składni):

a = 1 if b else a

Ten fragment kodu pozostawia niezmienione, gdy obroty b być fałszywe.

Rostyslav Dzinko
źródło
1
O. Ale co, jeśli nie chcę, aby coś się wydarzyło w gałęzi else? Potrzebuję czegoś takiego:print a if b
Ricky Robinson,
2
else abyłoby lepiejelse 0
aneroid
13
if b: print aWystarczy prosty, jeśli w takim przypadku
jamylak
4
Naprawianie odpowiedzi, ponieważ jest prawie dobre, gdyby nie słowo „oświadczenie”, które czyniło ją całkowicie złym. Istota pytania polega na tym, że nie jest to stwierdzenie.
Jan Hudec,
1
+ 1-1: Dobrze, jeśli chodzi o wskazanie, że wyrażenie else jest obowiązkowe, ale nie jest ok, ponieważ nie zawiera odpowiedzi na daną sprawę: wypisz „nic” (coś podobnego do ""lub None, zobacz szczegóły w innych odpowiedziach).
sancho.s ReinstateMonicaCellio
18

Oświadczenie „else” jest obowiązkowe. Możesz robić takie rzeczy:

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

EDYTOWAĆ:

Lub, w zależności od potrzeb, możesz spróbować:

>>> if b: print(a)
Alexis Huet
źródło
15

Jeśli nie chcesz from __future__ import print_function, możesz wykonać następujące czynności:

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

Które wydruki:

100 see no new line

Jeśli nie jesteś uśpiony from __future__ import print_functionlub używasz Pythona 3 lub nowszego:

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

Dodanie else jest jedyną zmianą, którą musisz wprowadzić, aby kod był poprawny pod względem składniowym, potrzebujesz else dla wyrażenia warunkowego („w linii, jeśli inaczej blokuje”)

Powodem, dla którego nie użyłem Nonelub nie 0lubiłem innych w tym wątku, jest to, że użycie None/0spowoduje, że program się pojawi print Nonelub print 0w przypadkach, w których bjest False.

Jeśli chcesz przeczytać o tym temacie, zamieściłem link do informacji o wersji łatki, że ta funkcja została dodana do Pythona.

„Wzór” powyżej jest bardzo podobny do wzoru pokazanego w PEP 308:

Ta składnia może wydawać się dziwna i wstecz; dlaczego warunek jest w środku wyrażenia, a nie z przodu, jak w C? x: y? Decyzja została sprawdzona przez zastosowanie nowej składni do modułów w bibliotece standardowej i sprawdzenie, jak odczytany jest wynikowy kod. W wielu przypadkach, w których stosuje się wyrażenie warunkowe, jedna wartość wydaje się być „zwykłym przypadkiem”, a jedna wartość jest „wyjątkowym przypadkiem”, używanym tylko w rzadszych przypadkach, gdy warunek nie jest spełniony. Składnia warunkowa czyni ten wzorzec nieco bardziej oczywistym:

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

Myślę więc, że ogólnie jest to rozsądny sposób na zbliżenie, ale nie można kłócić się z prostotą:

if logging: print data
Noelkd
źródło
Dzięki. Chodzi o to, że print ""nadal coś wydrukuje: pusta linia.
Ricky Robinson
Dzięki. endArgumnt w printpojawia się tylko w Pythonie 3.x, prawda?
Ricky Robinson
1
tak, jestem bardziej człowiekiem o 2,7, stąd from __future__ import print_function
Noelkd
11

Od wersji 2.5 można użyć równoważnika trójskładnikowego operatora warunkowego „?:” , A składnia jest następująca:

[on_true] if [expression] else [on_false]

Twój przykład jest w porządku, ale musisz po prostu dodać else, na przykład:

print a if b else ''
kenorb
źródło
2
Zauważ, że print ''nadal będzie drukować nowy wiersz, czego unika Noelkd w odpowiedzi.
yoniLavi,
8

Możesz użyć:

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

Równie dobrze możesz kontynuować:

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

Przykład ze świata rzeczywistego:

>>> 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
źródło
7

Można to zrobić za pomocą formatowania łańcucha . Działa z notacją% oraz ciągami .format () i f (nowymi od 3.6)

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

lub

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

lub

print(f'{a if b else ""}')
Eric Ed Lohmar
źródło
Nie ma to nic wspólnego z formatowaniem; możesz po prostu zrobić print a if b else "". To właśnie robi odpowiedź Noelkda.
melpomene
@melpomene, ale drukuje reklamy „” w nowym wierszu, którego można uniknąć za pomocą print "",(dwukropka) dla Python2 i używania print("", end="")dla Python3.
m3nda
5

W twoim przypadku działa to:

a = b or 0

Edycja: Jak to działa?

W pytaniu

b = True

Tak oceniam

b or 0

prowadzi do

True

który jest przypisany do a.

Jeśli b == False?, b or 0ocenia na drugi operand, do 0którego zostanie przypisany a.


źródło
3
Brzydota i błędność tego wyrażenia jest powodem, dla którego mamy przede wszystkim wyrażenie warunkowe.
Jan Hudec,
5

Spróbuj tego . To może ci pomóc

a=100
b=True

if b:
   print a
SkariaArun
źródło
4

Po prostu nadmiernie komplikujesz.

if b:
   print a
Nande
źródło
1
Oczywiście to najłatwiejsza opcja. Myślę, że w tym czasie (sierpień 2012) chciałem zrobić coś takiego:if DEBUG: print something
Ricky Robinson
Zduplikowana odpowiedź? Zobacz to przez SkariaArun, a także komentarz.
sancho.s ReinstateMonicaCellio
2

Zawsze potrzebujesz elsein-line, jeśli:

a = 1 if b else 0

Ale byłoby to łatwiejsze a = int(b).

Daniel Roseman
źródło
3
-1: łatwiejsze. I całkowicie nieczytelne. W każdym razie nie to, czego chciał pytający.
Jan Hudec,
ITYM a = int(bool(b)).
glglgl
1

Dlaczego po prostu nie napiszesz:

if b:
    print a
else:
    print 'b is false'
IcyFlame
źródło
1

hmmm, możesz to zrobić ze zrozumieniem listy . Miałoby to sens tylko, gdybyś miał prawdziwy zasięg ... ale spełnia swoje zadanie:

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

lub używając tylko tych dwóch zmiennych:

print([a for a in range(a,a+1) if b])
George Mohylewski
źródło