web-dev-qa-db-fra.com

Comment écrire inline if statement for print?

J'ai besoin d'imprimer certaines choses uniquement lorsqu'une variable booléenne est définie sur True. Donc, après avoir regardé this , 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?

326
Ricky Robinson

Python a pas a une fin ifinstruction.

Il existe deux types de if en Python:

  1. Déclaration if:

    if condition: statement
    if condition:
        block
    
  2. ifexpression (introduit dans Python 2.5)

    expression_if_true if condition else expression_if_false
    

Et notez que print a et b = a sont tous deux des instructions. Seule la partie a est une expression. Donc si vous écrivez

print a if b else 0

ça veut dire

print (a if b else 0)

et pareillement quand vous écrivez

x = a if b else 0

ça veut dire

x = (a if b else 0)

Maintenant, qu'est-ce que cela imprimerait/assignerait s'il n'y avait pas de clause else? L'impression/assignation est toujours là.

Et notez que si vous ne voulez pas qu'elle soit présente, vous pouvez toujours écrire l'instruction if normale sur une seule ligne, même si elle est moins lisible et qu'il n'y a vraiment aucune raison d'éviter la variante à deux lignes.

642
Jan Hudec

Inline if-else EXPRESSION doit toujours contenir une clause else, par exemple:

a = 1 if b else 0

Si vous souhaitez laisser votre valeur de variable 'a' inchangée - en utilisant l'ancienne valeur 'a' (sinon, les exigences de syntaxe l'exigent):

a = 1 if b else a

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

81
Rostyslav Dzinko

La déclaration 'else' est obligatoire. Vous pouvez faire des choses comme ça:

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

EDIT:

Ou, selon vos besoins, vous pouvez essayer:

>>> if b: print(a)
16
Alexis Huet

Si vous ne voulez pas utiliser from __future__ import print_function, vous pouvez procéder comme suit:

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

Quelles impressions:

100 see no new line

Si vous n'êtes pas aversé par from __future__ import print_function ou 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 à apporter pour que votre code soit syntaxiquement correct, vous avez besoin de else pour l'expression conditionnelle (le "in line if else blocks")

La raison pour laquelle je n'ai pas utilisé None ou 0 comme l'ont déjà utilisé d'autres threads, c'est parce que l'utilisation de None/0 ferait que le programme soit print None ou print 0 dans les cas où b est 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 présenté dans PEP 308:

Cette syntaxe peut sembler étrange et en arrière; pourquoi la condition va-t-elle au centre de l'expression et non à l'avant comme dans C's 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 observant la lecture du code résultant. 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é uniquement dans des cas plus rares où la condition n'est pas remplie. La syntaxe conditionnelle rend ce modèle un peu plus évident:

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

Donc, je pense que dans l’ensemble, c’est une façon raisonnable de s’en approcher mais vous ne pouvez pas discuter avec la simplicité de:

if logging: print data
15
Noelkd

Depuis la version 2.5, vous pouvez utiliser équivalent de C? ”?:”opérateur conditionnel ternaire et la syntaxe est la suivante:

[on_true] if [expression] else [on_false]

Donc, votre exemple est correct, mais vous devez simplement ajouter else, comme:

print a if b else ''
11
kenorb

Vous pouvez utiliser:

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

Vous pouvez aussi continuer comme ceci:

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

Cela peut être fait avec formatage de chaîne . Cela fonctionne avec la notation% ainsi que . Format () et chaînes f (nouvelle version 3.6)

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

ou

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

ou

print(f'{a if b else ""}')
6
Eric Ed Lohmar

Essaye ça . Ça pourrait t'aider

a=100
b=True

if b:
   print a
5
SkariaArun

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 assigné à a.

Si b == False?, b or 0 serait considéré comme le deuxième opérande 0 auquel on attribuerait a.

4
user647772

Vous êtes tout simplement trop compliquer.

if b:
   print a
3
Nande

Vous avez toujours besoin d'un else dans un inline si:

a = 1 if b else 0

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

2
Daniel Roseman

Eh bien, pourquoi ne pas simplement écrire:

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

hmmm, vous pouvez le faire avec un 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 simplement ces deux variables:

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