Come scrivere in linea se l'istruzione per la stampa?


378

Devo stampare alcune cose solo quando è impostata una variabile booleana True. Quindi, dopo aver visto questo , ho provato con un semplice esempio:

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

Stessa cosa se scrivo print a if b==True.

Cosa mi sto perdendo qui?



2
Buona domanda, risposte complesse ... una diretta sarebbe "l'altra parte è obbligatoria".
Min

Risposte:


739

Python non ha if un'istruzione finale .

Esistono due tipi di ifin Python:

  1. if dichiarazione:

    if condition: statement
    if condition:
        block
  2. if espressione (introdotta in Python 2.5)

    expression_if_true if condition else expression_if_false

E nota che entrambi print ae b = asono dichiarazioni. Solo la aparte è un'espressione. Quindi se scrivi

print a if b else 0

significa

print (a if b else 0)

e similmente quando scrivi

x = a if b else 0

significa

x = (a if b else 0)

Ora cosa sarebbe stampare / assegnare se non ci fosse else clausola? La stampa / assegnazione è ancora lì .

E nota che se non vuoi che sia lì, puoi sempre scrivere l' ifistruzione normale su una sola riga, anche se è meno leggibile e non c'è davvero motivo di evitare la variante a due righe.


Penso che if condition: statementnon funzioni in caso di dichiarazioni multilinea.
Val

Sì, ma non è necessario utilizzare if, utilizzare semplicemente la logica booleana come mostrato di seguito nei miei esempi.
Eduardo,

1
@JanHudec Se Python non ha un finale if, allora perché fa questo lavoro: print [i for i in range(10) if i%2]? Vorrei che lo permettessero al di fuori delle comprensioni ...
mbomb007,

3
@ mbomb007, che non è neanche un'istruzione if finale . Fa semplicemente parte della comprensione dell'elenco (o del generatore). Nota che la cosa che precede if non è un'istruzione, sono due espressioni fortra di loro.
Jan Hudec,

2
@AlexandervonWernherr, sì, sembra ragionevole.
Jan Hudec,

93

L' ESPRESSIONE if-else in linea deve sempre contenere la clausola else, ad esempio:

a = 1 if b else 0

Se si desidera lasciare invariato il valore della variabile "a", valutando il valore "a" precedente (altrimenti è ancora richiesto dalle richieste di sintassi):

a = 1 if b else a

Questo pezzo di codice lascia un invariata quando B risulta essere falso.


1
Oh. Ma cosa succede se non voglio che accada nulla nel ramo else? Ho bisogno di qualcosa del tipo:print a if b
Ricky Robinson,

2
else asarebbe meglio alloraelse 0
aneroide

13
if b: print aHo solo bisogno di un semplice se in quel caso
jamylak

4
Risolvere la risposta, perché è quasi buono se non fosse per la parola "dichiarazione" che l'ha resa totalmente cattiva. Il nocciolo della questione è che è non è una dichiarazione.
Jan Hudec,

1
+ 1-1: buono per sottolineare che l'espressione else è obbligatoria, ma non va bene per non fornire la risposta al caso in questione: stampare "niente" (qualcosa lungo le righe di ""o None, vedere i dettagli in altre risposte).
sancho.s ReinstateMonicaCellio il

18

La dichiarazione "else" è obbligatoria. Puoi fare cose come questa:

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

MODIFICARE:

Oppure, a seconda delle tue esigenze, puoi provare:

>>> if b: print(a)

15

Se non vuoi from __future__ import print_function, puoi fare quanto segue:

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

Che stampa:

100 see no new line

Se non sei avverso from __future__ import print_functiono stai usando Python 3 o versioni successive:

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

L'aggiunta dell'altro è l'unica modifica che è necessario apportare per rendere sintatticamente corretto il codice, è necessario l'altro per l'espressione condizionale ("in linea se altri blocchi")

Il motivo per cui non ho usato Noneo 0come altri nel thread hanno usato, è perché l'uso None/0causerebbe il programma print Noneo print 0nei casi in cui si btrova False.

Se vuoi leggere su questo argomento ho incluso un link alle note di rilascio per la patch che questa funzionalità è stata aggiunta a Python.

Il 'modello' sopra è molto simile al modello mostrato in PEP 308:

Questa sintassi può sembrare strana e arretrata; perché la condizione va nel mezzo dell'espressione, e non in primo piano come in C's c? x: y? La decisione è stata verificata applicando la nuova sintassi ai moduli nella libreria standard e vedendo come viene letto il codice risultante. In molti casi in cui viene utilizzata un'espressione condizionale, un valore sembra essere il "caso comune" e un valore è un "caso eccezionale", utilizzato solo in occasioni più rare quando la condizione non è soddisfatta. La sintassi condizionale rende questo modello un po 'più ovvio:

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

Quindi, nel complesso, penso che questo sia un modo ragionevole di approvarlo, ma non puoi discutere con la semplicità di:

if logging: print data

Grazie. La cosa qui è che print ""stamperà ancora qualcosa: una riga vuota.
Ricky Robinson,

Grazie. L' endargumnt printappare solo in Python 3.x, giusto?
Ricky Robinson,

1
sì, sono più un uomo di 2.7 da qui il from __future__ import print_function
Noelkd


8

Puoi usare:

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

Allo stesso modo puoi andare avanti come:

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

Esempio nel mondo reale:

>>> 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.

7

Questo può essere fatto con la formattazione delle stringhe . Funziona con la notazione% così come .format () e f-string (da nuovo a 3.6)

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

o

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

o

print(f'{a if b else ""}')

Questo non ha nulla a che fare con la formattazione; potresti semplicemente fare print a if b else "". È esattamente ciò che fa la risposta di Noelkd.
melpomene,

@melpomene ma "" stampa annunci una nuova riga, che può essere evitata usando print "",(due punti) per Python2 e usando print("", end="")per Python3.
m3nda,

5

Per il tuo caso funziona:

a = b or 0

Modifica: come funziona?

Nella domanda

b = True

Così valutando

b or 0

risultati in

True

a cui è assegnato a.

Se b == False?, b or 0valuterebbe al secondo operando a 0cui verrebbe assegnato a.


3
La bruttezza e la propensione all'errore di questa espressione sono il motivo per cui in primo luogo abbiamo un'espressione condizionale.
Jan Hudec,


4

Sei semplicemente troppo complicato.

if b:
   print a

1
Naturalmente questa è l'opzione più semplice. Penso che all'epoca (agosto 2012) volevo fare qualcosa del tipo:if DEBUG: print something
Ricky Robinson,

Risposta duplicata? Vedi quello di SkariaArun e anche un commento.
sancho.s ReinstateMonicaCellio il

2

Hai sempre bisogno di un elsein-line se:

a = 1 if b else 0

Ma un modo più semplice per farlo sarebbe a = int(b).


3
-1: più facile. E totalmente illeggibile. E non quello che voleva comunque il richiedente.
Jan Hudec,

ITYM a = int(bool(b)).
glglgl,

1

Bene, perché non scrivi semplicemente:

if b:
    print a
else:
    print 'b is false'

1

hmmm, puoi farlo con una comprensione della lista . Questo avrebbe senso solo se tu avessi una portata reale .. ma fa il lavoro:

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

o usando solo quelle due variabili:

print([a for a in range(a,a+1) if b])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.