¿Cómo escribir la instrucción if en línea para imprimir?


Necesito imprimir algunas cosas solo cuando una variable booleana se establece en True. Así que, después de mirar esto , intenté 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.

¿Qué me estoy perdiendo aquí?

Author: Community, 2012-08-09

13 answers

Python no tiene un final if declaración .

Hay dos tipos de if en Python:

  1. if declaración:

    if condition: statement
    if condition:
        block
    
  2. if expression (introducido en Python 2.5)

    expression_if_true if condition else expression_if_false
    

Y nota, que ambos print a y b = a son declaraciones. Solo la parte a es una expresión. Así que si escribes

print a if b else 0

Significa

print (a if b else 0)

Y de manera similar cuando escribir

x = a if b else 0

Significa

x = (a if b else 0)

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

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

 518
Author: Jan Hudec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-12 09:26:03

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

a = 1 if b else 0

Si desea dejar el valor de su variable 'a' sin cambios, añadiendo el antiguo valor' a ' (else sigue siendo requerido por las demandas de sintaxis):

a = 1 if b else a

Este fragmento de código deja a sin cambios cuando b se convierte en False.

 66
Author: Rostyslav Dzinko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-09 09:50:02

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, dependiendo de sus necesidades, puede intentar:

>>> if b: print(a)
 15
Author: Alexis Huet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-09 09:42:55

Si no quieres from __future__ import print_function puedes 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 tienes aversión a from __future__ import print_function o 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 "in line if else blocks")

La razón por la que no usé None o 0 como otros en el hilo han usado, es porque usar None/0 causaría el programa a print None o print 0 en los casos en que b es False.

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

El 'patrón' de arriba es muy similar al patrón mostrado 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 C's c ? x : y? La decisión fue se comprueba mediante la aplicación de la nueva sintaxis a la módulos en la biblioteca estándar y ver cómo el código resultante Leer. 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', se usa solo en ocasiones más raras cuando no se cumple la condición. El la sintaxis condicional hace que este patrón sea un poco más obvio:

Contents = ((doc + '\n') if doc else")

Así que creo que en general esto es un razonable pero no se puede discutir con la simplicidad de:

if logging: print data
 12
Author: Noelkd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-14 13:48:00

Desde 2.5 se puede utilizar equivalente de C "?:" operador condicional ternario y la sintaxis es:

[on_true] if [expression] else [on_false]

Así que tu ejemplo está bien, pero simplemente tienes que agregar else, como:

print a if b else ''
 10
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:24

Puedes usar:

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

Igual de bien 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.
 7
Author: Eduardo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-19 17:10:35

Prueba esto . Podría ayudarte

a=100
b=True

if b:
   print a
 5
Author: SkariaArun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-09 10:27:06

Para su caso esto funciona:

a = b or 0

Editar: ¿Cómo funciona esto?

En la pregunta

b = True

Así que evaluar

b or 0

Resultados en

True

Que se asigna a a.

Si b == False?, b or 0 evaluaría al segundo operando 0 que sería asignado a a.

 4
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-09 09:34:20

Simplemente estás complicando demasiado.

if b:
   print a
 3
Author: Nande,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-01 00:55:46

Esto se puede hacer con formato de cadena. Funciona con la notación % así como .format () and f-strings (new to 3.6)

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

O

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

O

print(f'{a if b else ""}')
 3
Author: Eric Ed Lohmar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:36

Siempre necesitas un else en un inline si:

a = 1 if b else 0

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

 2
Author: Daniel Roseman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-09 09:33:41

Bueno, ¿por qué no simplemente escribes:

if b:
    print a
else:
    print 'b is false'
 1
Author: IcyFlame,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-27 08:13:16

Hmmm, puedes hacerlo con una comprensión de lista . Esto solo tendría sentido si tuvieras 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])
 0
Author: George Mogilevsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-12 17:02:28