¿Cómo escribir en línea si la declaración para imprimir?

378

Necesito imprimir algunas cosas solo cuando una variable booleana está configurada en True. Entonces, después de ver esto , probé con un ejemplo simple:

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

Lo mismo si escribo print a if b==True.

¿Que me estoy perdiendo aqui?

Ricky Robinson
fuente
2
Buena pregunta, respuestas complejas ... una directa sería "la otra parte es obligatoria".
minutos

Respuestas:

739

Python no tiene una if declaración final .

Hay dos tipos de ifen Python:

  1. if declaración:

    if condition: statement
    if condition:
        block
  2. if expresión (introducida en Python 2.5)

    expression_if_true if condition else expression_if_false

Y tenga en cuenta que ambas print ay b = ason declaraciones. Solo la aparte es una expresión. Entonces si escribes

print a if b else 0

significa

print (a if b else 0)

y de manera similar cuando escribes

x = a if b else 0

significa

x = (a if b else 0)

Ahora, ¿qué imprimiría / asignaría si no hubiera una elsecláusula? La impresión / asignación todavía está allí .

Y tenga en cuenta que si no desea que esté allí, siempre puede escribir la ifdeclaración regular en una sola línea, aunque es menos legible y realmente no hay razón para evitar la variante de dos líneas.

Jan Hudec
fuente
Creo que eso if condition: statementno funciona en caso de declaraciones multilínea.
Val
Sí, pero no necesita usar if, simplemente use la lógica booleana como se muestra a continuación en mis ejemplos.
Eduardo
1
@ JanHudec Si Python no tiene un final if, entonces ¿por qué funciona esto print [i for i in range(10) if i%2]? Me gustaría que lo permitan las afueras de comprensiones ...
mbomb007
3
@ mbomb007, esa tampoco es una declaración if final . Es simplemente parte de la comprensión de la lista (o generador). Tenga en cuenta que lo que está antes del if no es una declaración, son dos expresiones forentre ellas.
Jan Hudec
2
@AlexandervonWernherr, sí, eso suena razonable.
Jan Hudec
93

Inline if-else EXPRESIÓN siempre debe contener cláusula else, por ejemplo:

a = 1 if b else 0

Si desea dejar su valor variable 'a' sin cambios, asignando el valor 'a' anterior (de lo contrario, las demandas de sintaxis todavía lo requieren):

a = 1 if b else a

Este fragmento de código deja un sin cambios cuando b se convierte en Falso.

Rostyslav Dzinko
fuente
1
Oh. Pero, ¿qué pasa si no quiero que pase nada en la sucursal de else? Necesito algo como:print a if b
Ricky Robinson
2
else asería mejor entonceselse 0
aneroide
13
if b: print aSolo necesito un simple si en ese caso
jamylak
44
Arreglando la respuesta, porque es casi bueno si no fuera por la palabra 'declaración' que lo hizo totalmente malo. El quid de la cuestión es que es no una declaración.
Jan Hudec
1
+ 1-1: Bueno para señalar que la expresión else es obligatoria, pero no está bien para no proporcionar la respuesta para el caso en cuestión: imprime "nada" (algo en la línea de ""o None, ver detalles en otras respuestas).
sancho.s ReinstateMonicaCellio
18

La declaración 'else' es obligatoria. Puedes hacer cosas como esta:

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

EDITAR:

O, según sus necesidades, puede intentar:

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

Si no quieres from __future__ import print_functionpuedes hacer lo siguiente:

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

Que imprime:

100 see no new line

Si no te molesta from __future__ import print_functiono estás usando Python 3 o posterior:

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

Agregar el else es el único cambio que necesita hacer para que su código sea sintácticamente correcto, necesita el else para la expresión condicional (el "en línea si otro bloquea")

La razón por la que no utilicé Noneo me 0gustaron otras personas en el hilo es porque el uso None/0causaría que el programa lo haga print Noneo print 0en los casos en que se bencuentre False.

Si desea leer sobre este tema, he incluido un enlace a las notas de la versión del parche que esta característica se agregó a Python.

El 'patrón' anterior es muy similar al patrón que se muestra en PEP 308:

Esta sintaxis puede parecer extraña y al revés; ¿por qué la condición va en el medio de la expresión, y no en el frente como en la c de C? x: y? La decisión se verificó aplicando la nueva sintaxis a los módulos en la biblioteca estándar y viendo cómo se lee el código resultante. En muchos casos donde se usa una expresión condicional, un valor parece ser el 'caso común' y un valor es un 'caso excepcional', usado solo en ocasiones más raras cuando no se cumple la condición. La sintaxis condicional hace que este patrón sea un poco más obvio:

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

Así que, en general, esta es una forma razonable de abordarlo, pero no se puede discutir con la simplicidad de:

if logging: print data
Noelkd
fuente
Gracias. Lo que pasa aquí es que print ""todavía imprimirá algo: una línea en blanco.
Ricky Robinson
Gracias. El endargumento printsolo aparece en Python 3.x, ¿verdad?
Ricky Robinson
1
Sí, soy más un hombre 2.7 por lo tanto, el from __future__ import print_function
Noelkd
11

Desde 2.5 puede usar el equivalente del operador condicional ternario "?:" Y la sintaxis es:

[on_true] if [expression] else [on_false]

Entonces su ejemplo está bien, pero simplemente tiene que agregar else, como:

print a if b else ''
kenorb
fuente
2
Tenga en cuenta que print ''todavía imprimirá una nueva línea, lo que se evita en la respuesta de Noelkd.
yoniLavi
8

Puedes usar:

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

De la misma manera puedes seguir así:

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

Ejemplo del mundo real:

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

Esto se puede hacer con el formato de cadena . Funciona con la notación%, así como .format () y f-strings (nuevo en 3.6)

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

o

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

o

print(f'{a if b else ""}')
Eric Ed Lohmar
fuente
Esto no tiene nada que ver con el formateo; Podrías simplemente hacer print a if b else "". Que es exactamente lo que hace la respuesta de Noelkd.
melpomene
@melpomene pero "" imprime anuncios en una nueva línea, que se puede evitar usando print "",(dos puntos) para Python2 y print("", end="")Python3.
m3nda
5

Para su caso esto funciona:

a = b or 0

Editar: ¿Cómo funciona esto?

En la pregunta

b = True

Entonces evaluando

b or 0

resultados en

True

que se asigna a a.

Si b == False?, b or 0evaluaría el segundo operando al 0que se asignaría a.


fuente
3
La fealdad y la propensión a errores de esta expresión es la razón por la cual tenemos una expresión condicional en primer lugar.
Jan Hudec
5

Prueba esto . Podría ayudarte

a=100
b=True

if b:
   print a
SkariaArun
fuente
4

Simplemente eres demasiado complicado.

if b:
   print a
Nande
fuente
1
Por supuesto, esa es la opción más fácil. Creo que en ese momento (agosto de 2012) quería hacer algo como:if DEBUG: print something
Ricky Robinson
¿Respuesta duplicada? Vea eso por SkariaArun, y también un comentario.
sancho.s ReinstateMonicaCellio
2

Siempre necesita un elseen línea si:

a = 1 if b else 0

Pero sería una forma más fácil de hacerlo a = int(b).

Daniel Roseman
fuente
3
-1: más fácil. Y totalmente ilegible. Y no lo que el autor de la pregunta quería de todos modos.
Jan Hudec
ITYM a = int(bool(b)).
glglgl
1

Bueno, ¿por qué no simplemente escribes:

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

hmmm, puedes hacerlo con una lista de comprensión . Esto solo tendría sentido si tuviera un rango real ... pero hace el trabajo:

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

o usando solo esas dos variables:

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