Comment écrire en ligne si une déclaration à imprimer?


378

J'ai besoin d'imprimer certaines choses uniquement lorsqu'une variable booléenne est définie sur True. Donc, après avoir regardé cela , j'ai essayé avec un exemple simple:

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

Même chose si j'écris print a if b==True.

Qu'est-ce que j'oublie ici?



2
Bonne question, réponses complexes ... une réponse directe serait "l'autre partie est obligatoire".
mn

Réponses:


739

Python n'a pas d' if instruction de fin .

Il existe deux types de ifPython:

  1. if déclaration:

    if condition: statement
    if condition:
        block
    
  2. if expression (introduite dans Python 2.5)

    expression_if_true if condition else expression_if_false

Et notez que les deux print aet b = asont des déclarations. Seule la apartie est une expression. Donc, si vous écrivez

print a if b else 0

ça veut dire

print (a if b else 0)

et de même lorsque vous écrivez

x = a if b else 0

ça veut dire

x = (a if b else 0)

Maintenant, qu'est-ce qu'il imprimerait / assignerait s'il n'y avait pas de elseclause? L'impression / affectation est toujours là .

Et notez que si vous ne voulez pas qu'elle soit là, vous pouvez toujours écrire l' ifinstruction régulière sur une seule ligne, bien qu'elle soit moins lisible et qu'il n'y ait vraiment aucune raison d'éviter la variante à deux lignes.


Je pense que if condition: statementcela ne fonctionne pas en cas de déclarations multilignes.
Val

Oui, mais vous n'avez pas besoin d'utiliser si, utilisez simplement la logique booléenne comme je le montre ci-dessous dans mes exemples.
Eduardo

1
@JanHudec Si Python n'a pas de fin if, alors pourquoi cela fonctionne- print [i for i in range(10) if i%2]t-il :? J'aimerais qu'ils le permettent en dehors des compréhensions ...
mbomb007

3
@ mbomb007, ce n'est pas non plus une instruction if de fin . Il fait simplement partie de la compréhension de la liste (ou du générateur). Notez que la chose avant l'if n'est pas une instruction, c'est deux expressions forentre elles.
Jan Hudec

2
@AlexandervonWernherr, oui, cela semble raisonnable.
Jan Hudec

93

L' EXPRESSION if-else en ligne doit toujours contenir une clause else, par exemple:

a = 1 if b else 0

Si vous souhaitez laisser inchangée la valeur de votre variable «a» - en affectant l'ancienne valeur «a» (sinon, la syntaxe l'exige):

a = 1 if b else a

Ce morceau de code laisse un inchangé lorsque b se révèle être faux.


1
Oh. Mais que faire si je ne veux pas que quelque chose se passe dans la branche else? J'ai besoin de quelque chose comme:print a if b
Ricky Robinson

2
else aserait mieux alorselse 0
anéroïde

13
if b: print aJuste besoin d'un simple si dans ce cas
jamylak

4
Correction de la réponse, car c'est presque bien si ce n'était le mot «déclaration» qui le rendait totalement mauvais. L'essentiel de la question est que ce n'est pas une déclaration.
Jan Hudec

1
+ 1-1: Bon pour souligner que l'expression else est obligatoire, mais pas correct pour ne pas fournir la réponse pour le cas en question: n'imprimez "rien" (quelque chose dans le sens de ""ou None, voir les détails dans d'autres réponses).
sancho.s ReinstateMonicaCellio

18

L'instruction «else» est obligatoire. Vous pouvez faire des trucs comme ça:

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

ÉDITER:

Ou, selon vos besoins, vous pouvez essayer:

>>> if b: print(a)

15

Si vous ne le souhaitez pas, from __future__ import print_functionvous pouvez procéder comme suit:

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

Qui imprime:

100 see no new line

Si vous n'êtes pas opposé à from __future__ import print_functionou utilisez python 3 ou version ultérieure:

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

L'ajout de else est la seule modification que vous devez apporter pour rendre votre code syntaxiquement correct, vous avez besoin de else pour l'expression conditionnelle (le "en ligne si else bloque")

La raison pour laquelle je ne l' ai pas utilisé Noneou 0comme d' autres dans le fil ont utilisé, parce que l' utilisation None/0causerait le programme print Noneou print 0dans les cas où best False.

Si vous souhaitez en savoir plus sur ce sujet, j'ai inclus un lien vers les notes de publication du correctif que cette fonctionnalité a été ajoutée à Python.

Le «motif» ci-dessus est très similaire au motif montré dans PEP 308:

Cette syntaxe peut sembler étrange et inversée; pourquoi la condition va-t-elle au milieu de l'expression, et non à l'avant comme dans le c de c? x: y? La décision a été vérifiée en appliquant la nouvelle syntaxe aux modules de la bibliothèque standard et en voyant comment le code résultant se lisait. Dans de nombreux cas où une expression conditionnelle est utilisée, une valeur semble être le «cas commun» et une valeur est un «cas exceptionnel», utilisée uniquement dans des cas plus rares lorsque la condition n'est pas remplie. La syntaxe conditionnelle rend ce modèle un peu plus évident:

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

Je pense donc que dans l'ensemble, c'est une façon raisonnable de l'approcher, mais vous ne pouvez pas contester la simplicité de:

if logging: print data

Merci. Le truc ici, c'est qu'il print ""imprimera toujours quelque chose: une ligne vierge.
Ricky Robinson

Merci. L' endargument dans printn'apparaît qu'en Python 3.x, non?
Ricky Robinson

1
oui, je suis plutôt un homme de 2,7 d'où le from __future__ import print_function
Noelkd


8

Vous pouvez utiliser:

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

Vous pouvez tout aussi bien continuer comme:

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

Exemple du monde réel:

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

Cela peut être fait avec un formatage de chaîne . Il fonctionne avec la notation% ainsi qu'avec .format () et f-strings (nouveau dans 3.6)

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

ou

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

ou

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

Cela n'a rien à voir avec le formatage; vous pourriez juste faire print a if b else "". C'est exactement ce que fait la réponse de Noelkd.
melpomene

@melpomene mais l'impression "" annonce une nouvelle ligne, qui peut être évitée en utilisant print "",(deux points) pour Python2 et print("", end="")pour Python3.
m3nda

5

Pour votre cas, cela fonctionne:

a = b or 0

Edit: Comment ça marche?

Dans la question

b = True

Donc, évaluer

b or 0

résulte en

True

qui est affecté à a.

Si b == False?, b or 0serait évalué au deuxième opérande 0qui serait affecté à a.


3
La laideur et le caractère erroné de cette expression sont la raison pour laquelle nous avons l'expression conditionnelle en premier lieu.
Jan Hudec

5

Essaye ça . Cela pourrait vous aider

a=100
b=True

if b:
   print a

4

Vous êtes simplement trop compliqué.

if b:
   print a

1
Bien sûr, c'est l'option la plus simple. Je pense qu'à l'époque (août 2012) je voulais faire quelque chose comme:if DEBUG: print something
Ricky Robinson

Réponse en double? Voir cela par SkariaArun, et aussi un commentaire.
sancho.s ReinstateMonicaCellio

2

Vous avez toujours besoin d'un elseen ligne si:

a = 1 if b else 0

Mais un moyen plus simple de le faire serait a = int(b).


3
-1: Plus facile. Et totalement illisible. Et pas ce que le demandeur voulait de toute façon.
Jan Hudec

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

1

Eh bien, pourquoi n'écrivez-vous pas simplement:

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

1

hmmm, vous pouvez le faire avec une compréhension de la liste . Cela n'aurait de sens que si vous aviez une vraie gamme .. mais cela fait le travail:

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

ou en utilisant seulement ces deux variables:

print([a for a in range(a,a+1) if b])
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.