21 Question: Python a-t-il un opérateur conditionnel ternaire?

question créée à Sat, Mar 23, 2019 12:00 AM

Si Python n’a pas d’opérateur conditionnel ternaire, est-il possible de le simuler avec d’autres constructions de langage?

    
5269
  1. Bien que les Pythons antérieurs à la 2.5 soient en train de dériver lentement vers l'historique, voici une liste d'anciens trucs d'opérateur ternaire antérieurs à la 2.5: " Idiomes Python ", recherchez le texte" Expression conditionnelle ". Wikipedia est également très utile: -)
    2011-05-26 00: 48: 06Z
  2. Dans la documentation officielle de Python 3.0 référencée dans un commentaire ci-dessus, cela est appelé "expression conditionnelle" et est très cryptiquement défini. Cette documentation n'incluant même pas le terme "ternaire", vous auriez du mal à le trouver via Google à moins de savoir exactement ce qu'il faut rechercher. La la documentation de la version 2 est un peu plus utile et comprend un lien. "PEP 308" , qui inclut de nombreux contextes historiques intéressants liés à à cette question.
    2013-01-10 05: 57: 30Z
  3. "ternaire" (ayant trois entrées) est une propriété conséquentielle de cette impelmentation, pas une propriété de définition du concept. Exemple: SQL a case [...] { when ... then ...} [ else ... ] end pour un effet similaire mais pas du tout ternaire.
    2014-12-15 21: 14: 24Z
  4. également la section 6.5.15 de la norme ISO /CEI 9899 (norme de langage de programmation C) l'appelle "l'opérateur conditionnel"
    2014-12-15 21: 20: 22Z
  5. Wikipedia couvre cela de manière approfondie dans l'article " ?: ".
    2016-06-09 08: 11: 03Z
21 réponses                              21                         

Oui, c’était ajouté dans la version 2.5. La syntaxe de l'expression est la suivante:

 
a if condition else b

condition est d'abord évalué, puis l'un des a ou b est évalué et renvoyé en fonction du Boolean " valeur condition. Si condition est évalué à True, alors a est évalué et renvoyé, mais b est ignoré ou sinon, lorsque b est évalué et renvoyé mais que a est ignoré.

Cela permet de court-circuiter car lorsque condition est vrai, a seulement est évalué et b n'est pas du tout évalué, mais lorsque condition est faux, seul b est évalué et a n'est pas du tout évalué.

Par exemple:

 
>>> 'true' if True else 'false'
'true'
>>> 'true' if False else 'false'
'false'

Notez que les conditions sont une expression et non une instruction . Cela signifie que vous ne pouvez pas utiliser d'instructions d'affectation, ni pass ni d'autres instructions dans une expression conditionnelle :

.  
>>> pass if False else x = 3
  File "<stdin>", line 1
    pass if False else x = 3
          ^
SyntaxError: invalid syntax

Vous pouvez cependant utiliser des expressions conditionnelles pour affecter une variable comme suit:

 
x = a if True else b

Pensez à l'expression conditionnelle comme à la commutation entre deux valeurs. C'est très utile lorsque vous êtes dans une situation de «valeur ou autre», cela ne fait pas grand chose d'autre.

Si vous devez utiliser des instructions, vous devez utiliser une instruction if normale au lieu d'une expression conditionnelle .

N'oubliez pas que certains pythonistes la désapprouvent pour plusieurs raisons:

  • L'ordre des arguments est différent de celui de l'opérateur ternaire classique condition ? a : b de nombreuses autres langues (telles queC, C ++, Go, Perl, Ruby, Java, Javascript, etc.), ce qui peut entraîner des erreurs lorsque des personnes non familiarisées avec le comportement "surprenant" de Python l’utilisent (elles peuvent inverser l’ordre des arguments).
  • Certains le trouvent "lourd", car cela va à l’encontre du flot normal de pensées (penser à la condition d’abord, puis aux effets).
  • Raisons stylistiques. (Bien que le 'inline if' puisse être vraiment utile et rendre votre script plus concis, cela complique vraiment votre code)

Si vous ne parvenez pas à vous rappeler l'ordre, souvenez-vous qu'en lisant à haute voix, vous dites (presque) ce que vous voulez dire. Par exemple, x = 4 if b > 8 else 9 est lu à haute voix sous la forme x will be 4 if b is greater than 8 otherwise 9.

Documentation officielle:

6227
2019-05-18 10: 26: 57Z
  1. Cet ordre peut sembler étrange aux développeurs mais f(x) = |x| = x if x > 0 else -x semble très naturel aux mathématiciens. Vous pouvez aussi le comprendre comme faire A dans la plupart des cas, sauf quand C devrait faire B à la place ...
    2016-01-25 15: 07: 08Z
  2. Soyez prudent avec l'ordre des opérations lorsque vous l'utilisez. Par exemple, la ligne z = 3 + x if x < y else y. Si vous avez x=2 et y=1, vous pouvez vous attendre à ce que cela donne 4, mais vous obtiendrez en fait 1. z = 3 + (x if x > y else y) est l’utilisation correcte.
    2016-03-06 09: 23: 11Z
  3. Si vous souhaitez effectuer des évaluations supplémentaires après , le conditionnel est évalué. Par exemple, si vous ajoutez une valeur au résultat, besoin d'ajouter l'expression supplémentaire des deux côtés (z = 3 + x if x < y else 3 + y) ou de grouper le conditionnel (z = 3 + (x if x < y else y) ou z = (x if x < y else y) + 3)
    2016-04-15 00: 36: 05Z
  4. et s'il y a plusieurs conditions?
    2017-05-26 15: 31: 44Z
  5. @ MrGeek, je vois ce que vous voulez dire, donc vous imbriqueriez les opérations: `" foo "si Bool else (" bar "si Bool sinon" foobar " ) `
    2017-08-11 00: 04: 32Z

Vous pouvez indexer dans un tuple:

 
(falseValue, trueValue)[test]

test doit renvoyer Vrai ou Faux .
Il pourrait être plus sûr de toujours le mettre en œuvre de la manière suivante:

 
(falseValue, trueValue)[test == True]

ou vous pouvez utiliser le bool() pour assurer une valeur Boolean :

 
(falseValue, trueValue)[bool(<expression>)]
    
689
2015-10-17 07: 35: 10Z
  1. Notez que celui-ci évalue toujours tout, alors que la construction if /else n'évalue que l'expression gagnante.
    2011-02-04 02: 25: 24Z
  2. (lambda: print("a"), lambda: print("b"))[test==true]()
    2012-03-08 19: 31: 48Z
  3. Il convient de noter que le contenu des [] peut être une expression arbitraire. De plus, par sécurité, vous pouvez tester explicitement la véracité en écrivant [bool(<expression>)]. La fonction bool() existe depuis la v2.2.1.
    2012-05-31 18: 20: 15Z
  4. C'est excellent pour le code-golf, pas tellement pour le code réel. Bien que je me sois tellement habitué que je l'utilise parfoismes pour la concision lorsque vous faites quelque chose d’évident, comme choisir entre deux constantes de chaîne.
    2014-12-05 17: 52: 12Z
  5. J'ai fait la même chose - une ou deux fois, mais je l'ai fait - en indexant dans un dictionnaire avec les clés True et False: {True:trueValue, False:falseValue}[test] I don Je ne sais pas si cela est moins efficace, mais cela évite au moins tout le débat "élégant" ou "laid". Il n'y a aucune ambiguïté sur le fait que vous avez affaire à un booléen plutôt qu'à un int.
    2016-03-01 18: 43: 37Z

Pour les versions antérieures à la version 2.5, l'astuce est la suivante:

 
[expression] and [on_true] or [on_false]

Cela peut donner de mauvais résultats quand on_true  a une fausse valeur booléenne. 1
Bien qu’il ait l’avantage d’évaluer les expressions de gauche à droite, ce qui est plus clair à mon avis.

1. Y at-il un équivalent de C's ”?:” Opérateur ternaire?

    
289
2014-01-13 07: 16: 48Z
  1. Le remède consiste à utiliser (test et [true_value] ou [false_value]) [0], ce qui permet d'éviter ce piège.
    2009-10-21 15: 33: 59Z
  2. L'opérateur ternaire s'exécute généralement plus rapidement (parfois de 10 à 25%).
    2014-01-13 07: 52: 08Z
  3. @ volcan Avez-vous une source pour moi?
    2014-08-05 12: 30: 33Z
  4. 2018-03-19 20: 59: 54Z

<expression 1> if <condition> else <expression 2>

 
a = 1
b = 2

1 if a > b else -1 
# Output is -1

1 if a > b else -1 if a < b else 0
# Output is -1
    
200
2019-05-15 15: 03: 41Z
  1. Quelle est la différence entre cette réponse et la première réponse?
    2010-05-27 07: 59: 27Z
  2. Celui-ci souligne l'intention principale de l'opérateur ternaire: la sélection de valeur. Cela montre également que plusieurs ternaires peuvent être enchaînés en une seule expression.
    2010-10-04 21: 14: 21Z
  3. @ Craig, je suis d'accord, mais il est également utile de savoir ce qui se passera s'il n'y a pas de parenthèses. Dans le code réel, j'aurais aussi tendance à insérer des parenthèses explicites.
    2014-12-01 21: 30: 51Z
  4. En quelque sorte, je suis capable de comprendre cela mieux que la réponse précédente.
    2018-03-23 ​​05: 46: 05Z

De la la documentation :

  

Les expressions conditionnelles (parfois appelées «opérateurs ternaires») ont la priorité la plus basse de toutes les opérations Python.

     

L'expression x if C else y évalue d'abord la condition, C ( pas x ); si C est vrai, x est évalué et son vl'alue est rendue; sinon, y est évalué et sa valeur est renvoyée.

     

Voir PEP 308 pour plus de détails sur les expressions conditionnelles.

Nouveau depuis la version 2.5.

    
125
2015-10-17 07: 43: 53Z

Un opérateur pour une expression conditionnelle en Python a été ajouté en 2006 dans le cadre de Amélioration Python Proposition 308 . Sa forme est différente de celle de l’opérateur ?: et c’est:

 
<expression1> if <condition> else <expression2>

qui équivaut à:

 
if <condition>: <expression1> else: <expression2>

Voici un exemple:

 
result = x if a > b else y

Autre syntaxe utilisable (compatible avec les versions antérieures à la version 2.5):

 
result = (lambda:y, lambda:x)[a > b]()

où les opérandes sont paresseux évalués .

Une autre méthode consiste à indexer un tuple (ce qui ne correspond pas à l'opérateur conditionnel de la plupart des autres langues):

 
result = (y, x)[a > b]

ou dictionnaire explicitement construit:

 
result = {True: x, False: y}[a > b]

Une autre méthode (moins fiable), mais plus simple, consiste à utiliser les opérateurs and et or:

 
result = (a > b) and x or y

Cependant, cela ne fonctionnera pas si x était False.

Une solution possible consiste à créer des listes ou des nuplets x et y comme suit:

 
result = ((a > b) and [x] or [y])[0]

ou:

 
result = ((a > b) and (x,) or (y,))[0]

Si vous utilisez des dictionnaires, au lieu d'utiliser un conditionnel ternaire, vous pouvez tirer parti de get(key, default) , par exemple:

 
shell = os.environ.get('SHELL', "/bin/sh")

Source: ?: en Python sur Wikipedia

    
95
2017-08-07 14: 22: 32Z
  1. result = {1: x, 0: y}[a > b] est une autre variante possible (True et False sont en fait des entiers avec les valeurs 1 et 0)
    2019-02-09 18: 07: 40Z

Malheureusement, le

 
(falseValue, trueValue)[test]

la solution n’a pas de comportement de court-circuit; ainsi, les deux falseValue et trueValue sont évalués indépendamment de la condition. Cela peut être sous-optimal ou même compliqué (c’est-à-dire que trueValue et falseValue pourraient être des méthodes et avoir des effets secondaires).

Une solution à ce problème serait

 
(lambda: falseValue, lambda: trueValue)[test]()

(exécution différée jusqu'à ce que le gagnant soit connu;)), mais introduit une incohérence entre les objets appelables et non appelables. De plus, cela ne résout pas le problème lorsque vous utilisez des propriétés.

Et ainsi va l'histoire - choisir entre les 3 solutions mentionnées est un compromis entre avoir la fonctionnalité de court-circuit, utiliser au moins Зython 2.5 (IMHO n'est plus un problème) et ne pas être sujet à "trueValue -évalue-à -false "erreurs.

    
86
2019-05-09 09: 45: 33Z
  1. Bien que le tour du tuple de lambdas fonctionne, il faut environ 3 fois plus longtemps que l'opérateur ternaire. Ce ne sera probablement une idée raisonnable que si elle peut remplacer une longue chaîne de if else if.
    2018-10-11 17: 34: 51Z

Opérateur ternaire dans différents langages de programmation

Ici, je tente simplement de montrer une différence importante dans ternary operator entre quelques langages de programmation.

  

Opérateur ternaire en Javascript

 
var a = true ? 1 : 0;
# 1
var b = false ? 1 : 0;
# 0
  

Opérateur ternaire en Ruby

 
a = true ? 1 : 0
# 1
b = false ? 1 : 0
# 0
  

Opérateur ternaire en Scala

 
val a = true ? 1 | 0
# 1
val b = false ? 1 | 0
# 0
  

Opérateur ternaire en programmation R

 
a <- if (TRUE) 1 else 0
# 1
b <- if (FALSE) 1 else 0
# 0
  

Opérateur ternaire en Python

 
a = 1 if True else 0
# 1
b = 1 if False else 0
# 0
    
56
2019-01-26 14: 05: 18Z
  1. 2017-02-15 23: 08: 50Z
  2. Ruby fonctionne aussi avec a = true ? 1 : 0
    2017-05-15 17: 50: 10Z
  3. "Vous pouvez maintenant voir la beauté du langage python. Il est hautement lisible et maintenable." Je ne vois pas la pertinence de cette phrase, ni comment la syntaxe de l'opérateur ternaire le démontre.
    2017-12-08 15: 38: 17Z
  4. Cela peut sembler discutable; mais ce qu’il indique essentiellement, c’est que la syntaxe Python est susceptible d’être comprise par une personne qui n’a jamais vu d’opérateur ternaire, alors que très peu de gens comprendront la syntaxe plus habituelle à moins d’avoir été informé au préalable de sa signification.
    2018-01-10 17: 12: 28Z
  5. Algol68: a = .if. .vrai. .puis. 1 .el 0 .fi. Ceci peut également être exprimé a = (. True. | 1 | 0) Comme d’habitude, Algol68 est une amélioration par rapport à ses successeurs.
    2018-06-17 12: 55: 29Z

Pour Python 2.5 et les versions plus récentes, il existe une syntaxe spécifique:

 
[on_true] if [cond] else [on_false]

Dans les anciens Pythons, un opérateur ternaire n’était pas implémenté, mais il était possible de le simuler.

 
cond and on_true or on_false

Cependant, il existe un problème potentiel: si cond est évalué à True et on_true à False, on_false est renvoyé au lieu de on_true. Si vous voulez que ce comportement la méthode soit OK, sinon utilisez ceci:

 
{True: on_true, False: on_false}[cond is True] # is True, not == True

qui peut être enveloppé par:

 
def q(cond, on_true, on_false)
    return {True: on_true, False: on_false}[cond is True]

et utilisé de cette façon:

 
q(cond, on_true, on_false)

Il est compatible avec toutes les versions de Python.

    
55
2012-04-25 12: 02: 06Z
  1. Le comportement n'est pas identique: q("blob", on_true, on_false) renvoie on_false, tandis que on_true if cond else on_false renvoie on_true. Une solution de contournement consiste à remplacer cond par cond is not None dans ces cas, bien que ce ne soit pas une solution parfaite.
    2012-09-26 09: 09: 29Z
  2. Pourquoi pas bool(cond) au lieu de cond is True? Le premier vérifie la véracité de cond, le second vérifie l'égalité du pointeur avec l'objet True. Comme l'a souligné @AndrewCecil, "blob" est la vérité, mais c'est is not True.
    2013-11-11 16: 11: 06Z
  3. Wow, ça a vraiment l'air hacky! :) Techniquement, vous pouvez même écrire [on_false, on_True][cond is True] pour que l'expression devienne plus courte.
    2014-02-24 11: 51: 08Z
  4. Il n'y a pas de court-circuit dans cette réponse. Si on_true et on_false coûtent cher, c’est une mauvaise réponse.
    2019-03-28 14: 08: 20Z

Vous pouvez souvent trouver

 
cond and on_true or on_false

mais cela pose problème quand on_true == 0

 
>>> x = 0
>>> print x == 0 and 0 or 1 
1
>>> x = 1
>>> print x == 0 and 0 or 1 
1

ce à quoi vous vous attendez pour un opérateur ternaire normal

 
>>> x = 0
>>> print 0 if x == 0 else 1 
0
>>> x = 1
>>> print 0 if x == 0 else 1 
1
    
35
2013-01-14 15: 56: 09Z
  

Python a-t-il un opérateur conditionnel ternaire?

Oui. De la fichier de grammaire :

 
test: or_test ['if' or_test 'else' test] | lambdef

La partie intéressante est:

 
or_test ['if' or_test 'else' test]

Ainsi, une opération conditionnelle ternaire est de la forme:

 
expression1 if expression2 else expression3

expression3 sera évalué paresseusement (c’est-à-dire qu’il n’est évalué que si expression2 est faux dans un contexte booléen). Et à cause de la définition récursive, vous pouvez les enchaîner indéfiniment (bien que cela puisse être considéré comme un mauvais style.)

 
expression1 if expression2 else expression3 if expression4 else expression5 # and so on

Une note sur l'utilisation:

Notez que tous les if doivent être suivis d’un else. Les personnes apprenant la compréhension des listes et les expressions génératrices peuvent trouver cette leçon difficile à apprendre. Ce qui suit ne fonctionnera pas, car Python attend une troisième expression pour une autre:

 
[expression1 if expression2 for element in iterable]
#                          ^-- need an else here

qui soulève un SyntaxError: invalid syntax. Ce qui précède est donc soit un élément de logique incomplet (peut-être l'utilisateur s'attend-il à une non-opération dans la condition fausse) ou bien peut-être est-il prévu d'utiliser expression2 comme filtre - remarque que ce qui suit est légal Python:

 
[expression1 for element in iterable if expression2]

expression2 fonctionne comme un filtre pour la compréhension de la liste et n'est pas un opérateur conditionnel ternaire.

Syntaxe alternative pour un cas plus étroit:

Il est peut-être pénible d'écrire ce qui suit:

 
expression1 if expression1 else expression2

expression1 devra être évalué deux fois avec l’utilisation ci-dessus. Cela peut limiter la redondance s'il s'agit simplement d'une variable locale. Cependant, un idiome Pythonic commun et performant pour ce cas d’utilisation consiste à utiliser le comportement de raccourci de or:

 
expression1 or expression2

qui est équivalent en sémantique. Notez que certains guides de style peuvent limiter cette utilisation pour des raisons de clarté. Il contient beaucoup de signification dans très peu de syntaxe.

    
28
2016-08-08 18: 56: 31Z
  1. expression1 or expression2 étant similaire et présentant les mêmes inconvénients /positifs que expression1 || expression2 en javascript
    2016-02-18 13: 05: 59Z
  2. Merci, @selurvedu - cela peut être déroutant tant que vous ne l'avez pas bien compris. J'ai appris à la dure, alors ton chemin pourrait ne pas être aussi difficile. ;) L'utilisation de if sans le reste, à la fin d'une expression ou de la compréhension de liste générera le filtre de l'itérable. Au premier plan, il s’agit d’une opération conditionnelle ternaire, qui demande le reste. A la vôtre !!
    2016-05-27 04: 37: 39Z
  3. @ AaronHall Bien que l'utilisation de Metasyntactic expressionN pour toutes les instances soit cohérente, il pourrait être plus facile de comprendre en nommant qui distingue l'expression de test conditionnelle des deux expressions de résultat; par exemple, result1 if condition else result2. Cela est particulièrement évident lors de l’imbrication (chaînage): result1 if condition1 else result2 if condition2 else result3. Voyez-vous combien mieux cela se lit de cette façon?
    2019-01-26 14: 12: 47Z
  4. @ tchrist, merci pour votre commentaire - si vous consultez l'historique des révisions, cet article comporte actuellement deux révisions. La plupart de mes autres réponses, surtout les plus importantes, ont été revisitées encore et encore. Cette réponse n'obtient jamais mon attention car le statut de wiki de la communauté ne me donne aucun crédit pour le contenu et je ne vois donc aucun vote à ce sujet. Comme je n’ai pas vraiment le temps de faire un montage pour le moment, grenouille sait quand elle me reviendra à l’avenir. Je peux voir que vous avez modifié la réponse en haut, alors n'hésitez pas à emprunter /citer le contenu de ce message dans celui-ci (et à me citer si cela est à propos!)
    2019-01-26 18: 24: 21Z

Simulation de l'opérateur ternaire python.

Par exemple

 
a, b, x, y = 1, 2, 'a greather than b', 'b greater than a'
result = (lambda:y, lambda:x)[a > b]()

sortie:

 
'b greater than a'
    
17
2013-11-20 10: 44: 12Z
  1. Pourquoi pas simplement result = (y, x)[a < b] Pourquoi utilisez-vous la fonction lambda ?
    2013-12-27 05: 50: 06Z
  2. @ GrijeshChauhan Parce que sur les expressions "compliquées", e. g. impliquant un appel de fonction, etc., cela serait exécuté dans les deux cas. Cela pourrait ne pas être voulu.
    2014-02-13 08:14: 33Z

vous pouvez faire ceci: -

[condition] and [expression_1] or [expression_2] ;

Exemple: -

print(number%2 and "odd" or "even")

Ceci afficherait "impair" si le nombre est impair ou "pair" si le nombre est pair.

Résultat: - si la condition est vraie, exp_1 est exécuté. exp_2 est exécuté.

Remarque: - : 0, None, False, emptylist, emptyString est évalué par False. Et toutes les données autres que 0 sont considérées comme vraies.

Voici comment cela fonctionne:

si la condition [condition] devient "True", expression_1 sera évaluée mais pas expression_2. Si nous "et" quelque chose avec 0 (zéro), le résultat sera toujours fasle .Alors dans la déclaration ci-dessous,

 
0 and exp

L'expression exp ne sera pas du tout évaluée car "et" avec 0 seront toujours évalués à zéro et il n'est pas nécessaire d'évaluer l'expression. Voici comment le compilateur lui-même fonctionne, dans toutes les langues.

Dans

 
1 or exp

l'expression exp ne sera pas du tout évaluée puisque "ou" avec 1 sera toujours égal à 1. Donc, il ne sera pas inutile d'évaluer l'expression exp puisque le résultat sera de toute façon 1. (méthodes d'optimisation du compilateur).

Mais en cas de

 
True and exp1 or exp2

La deuxième expression exp2 ne sera pas évaluée car True and exp1 serait Vrai si exp1 n'était pas faux.

De même dans

 
False and exp1 or exp2

L'expression exp1 ne sera pas évaluée car False équivaut à écrire 0 et faire "et" avec 0 serait lui-même 0 mais après exp1 puisque "or" est utilisé, il évaluera l'expression exp2 après "ou".

Remarque: - Ce type de ramification utilisant "ou" et "et" ne peut être utilisé que lorsque expression_1 ne possède pas la valeur Vérité de False (ou 0 ou Aucun ou liste vide [].] ou emptystring ''.) puisque si expression_1 devient False, l'expression_2 sera évaluée en raison de la présence de "ou" entre exp_1 et exp_2.

Si vous souhaitez toujours que cela fonctionne dans tous les cas, quelles que soient les valeurs de vérité exp_1 et exp_2, procédez comme suit: -

[condition] and ([expression_1] or 1) or [expression_2] ;

    
15
2017-08-20 07: 48: 54Z
  1. Si vous voulez utiliser cela dans le contexte de x = [condition] and ([expression_1] or 1) or [expression_2] et que expression_1 est défini sur false, x sera 1 et non expression_1. Utilisez la réponse acceptée.
    2017-10-20 06: 37: 01Z

L'opérateur conditionnel ternaire permet simplement de tester une condition sur une seule ligne en remplaçant le multiligne si-autrement rendant le code compact.

Syntaxe:

  

[on_true] si [expression] else [on_false]

1- Méthode simple d'utilisation de l'opérateur ternaire:

 
# Program to demonstrate conditional operator
a, b = 10, 20
# Copy value of a in min if a < b else copy b
min = a if a < b else b
print(min)  # Output: 10

2- Méthode directe d'utilisation des n-uplets, du dictionnaire et du lambda:

 
# Python program to demonstrate ternary operator
a, b = 10, 20
# Use tuple for selecting an item
print( (b, a) [a < b] )
# Use Dictionary for selecting an item
print({True: a, False: b} [a < b])
# lamda is more efficient than above two methods
# because in lambda  we are assure that
# only one expression will be evaluated unlike in
# tuple and Dictionary
print((lambda: b, lambda: a)[a < b]()) # in output you should see three 10

3- L'opérateur ternaire peut être écrit imbriqué si-sinon:

 
# Python program to demonstrate nested ternary operator
a, b = 10, 20
print ("Both a and b are equal" if a == b else "a is greater than b"
        if a > b else "b is greater than a")

L’approche ci-dessus peut s’écrire comme suit:

 
# Python program to demonstrate nested ternary operator
a, b = 10, 20
if a != b:
    if a > b:
        print("a is greater than b")
    else:
        print("b is greater than a")
else:
    print("Both a and b are equal") 
# Output: b is greater than a
    
14
2018-04-04 14: 02: 17Z
  1. Notez que l'opérateur ternaire est plus petit (en mémoire) et plus rapide que le if imbriqué. En outre, votre if-else imbriqué n'est pas en réalité une réécriture de l'opérateur ternaire et produira une sortie différente pour les valeurs sélectionnées de a et b (en particulier s'il s'agit d'un type qui implémente une méthode __ne__ étrange).
    2018-10-11 17: 28: 46Z

Plus un conseil qu'une réponse (vous n'avez pas besoin de répéter l'évidence pour la centaine de fois), mais je l'utilise parfois comme raccourci rapide dans de telles constructions:

 
if conditionX:
    print('yes')
else:
    print('nah')

, devient:

 
print('yes') if conditionX else print('nah')

Certains (beaucoup :) peuvent le considérer comme non rythmique (même ruby-ish :), mais je le trouve personnellement plus naturel - c’est-à-dire comment vous l’exprimeriez normalement, plus un peu plus attrayant visuellement dans de grands blocs de code.

    
12
2016-05-23 19:16:26Z
  1. Je préfère print( 'yes' if conditionX else 'nah' ) à votre réponse. : -)
    2017-08-20 06: 07: 17Z
  2. Si vous voulez print() dans les deux cas - et ça a l'air un peu plus pythonique, je dois l'avouer :) Mais que se passe-t-il si les expressions /fonctions ne sont pas les mêmes comme - comme print('yes') if conditionX else True - pour obtenir le print() seulement en vérité conditionX
    2017-10-26 11: 40: 17Z
  3. Pour ajouter à la remarque de Frederick99, une autre raison d'éviter print('yes') if conditionX else print('nah') est qu'elle génère une syntaxe dans une erreur Python2.
    2018-10-21 21: 51: 29Z
  4. La seule raison pour laquelle une erreur de syntaxe est fournie est que, dans Python 2, print est une instruction - print "yes", alors que dans Python 3, il s'agit d'une fonction - print("yes"). Cela peut être résolu en l’utilisant comme déclaration ou mieux - from future import print_function.
    2018-10-22 04: 09: 00Z
 
a if condition else b

Mémorisez cette pyramide si vous avez du mal à vous souvenir:

 
     condition
  if           else
a                   b 
    
9
2018-12-06 14: 45: 27Z

OUI, python a un opérateur ternaire, voici la syntaxe et un exemple de code pour le démontrer:)

 
#[On true] if [expression] else[On false]
# if the expression evaluates to true then it will pass On true otherwise On false


a= input("Enter the First Number ")
b= input("Enter the Second Number ")

print("A is Bigger") if a>b else print("B is Bigger")
    
4
2018-10-21 20: 46: 34Z
  1. J'ai ajouté un exemple d'instruction sur une ligne pour vérifier le nombre le plus important pour le développer davantage
    2018-10-21 20: 45: 54Z
  2. print n’est vraiment pas un bon choix, car cela donnerait une SyntaxError en Python2.
    2018-10-21 21: 52: 56Z
  3. @ Thierry Lathuille ici, j’ai utilisé la fonction print () pas print, la fonction print est pour Python 3 alors que print est pour Python 2
    2018-10-21 21: 54: 21Z
  4. La question a déjà été posée sur SO, essayez-la simplement avec Python 2 et vous verrez par vous-même. 'print (' hello ') est une syntaxe parfaitement valide dans Python 2.7, mais la façon dont elle est analysée fait en sorte que votre code ci-dessus jette un SyntaxError.
    2018-10-21 21: 58: 23Z
  5. Quel est le bon message, merci de le dire
    2018-10-21 22: 00: 52Z

De nombreux langages de programmation dérivés de C utilisent généralement la syntaxe suivante pour l'opérateur conditionnel ternaire:

 
<condition> ? <expression1> : <expression2>
  

Au début, le B Python D dictateur F ou L ife (je veux dire Guido van Rossum , bien sûr) a rejeté (comme style non-Pythonic), car il est assez difficile à comprendre pour les personnes non habituées au langage C. De plus, le signe du côlon : a déjà de nombreuses utilisations dans Python. Après l'approbation de PEP 308 , Python a finalement reçu sa propre expression conditionnelle de raccourci (celle que nous utilisons maintenant):

 
<expression1> if <condition> else <expression2>

Donc, premièrement, il évalue la condition. S'il renvoie True, expression1 sera évalué pour obtenir le résultat, sinon expression2 sera évalué. En raison de la évaluation paresseuse , une seule expression sera exécutée.

Voici quelques exemples (les conditions seront évaluées à partir du fichierpied à droite):

 
pressure = 10
print('High' if pressure < 20 else 'Critical')

# Result is 'High'

Les opérateurs ternaires peuvent être chaînés en série:

 
pressure = 5
print('Normal' if pressure < 10 else 'High' if pressure < 20 else 'Critical')

# Result is 'Normal'

Le suivant est identique au précédent:

 
pressure = 5

if pressure < 20:
    if pressure < 10:
        print('Normal')
    else:
        print('High')
else:
    print('Critical')

# Result is 'Normal'

J'espère que cela vous aidera.

    
4
2019-01-04 22: 02: 14Z

L'une des alternatives à la expression conditionnelle de Python est la suivante:

 
{True:"yes", False:"no"}[boolean]

qui a la belle extension suivante:

 
{True:"yes", False:"no", None:"maybe"}[boolean_or_none]

La plus courte alternative reste:

 
("no", "yes")[boolean]

mais il n'y a pas d'alternative si vous souhaitez éviter l'évaluation de yes() et no() comme suit:

 
yes() if [condition] else no()
    
3
2019-02-09 18: 23: 18Z

Une façon élégante de chaîner plusieurs opérateurs:

 
f = lambda x,y: 'greater' if x > y else 'less' if y > x else 'equal'

array = [(0,0),(0,1),(1,0),(1,1)]

for a in array:
  x, y = a[0], a[1]
  print(f(x,y))

# Output is:
#   equal,
#   less,
#   greater,
#   equal

    
0
2019-05-12 13: 03: 48Z

si la variable est définie et que vous voulez vérifier si elle a une valeur, vous pouvez simplement a or b

 
def test(myvar=None):
    # shorter than: print myvar if myvar else "no Input"
    print myvar or "no Input"

test()
test([])
test(False)
test('hello')
test(['Hello'])
test(True)

affichera

 
no Input
no Input
no Input
hello
['Hello']
True
    
- 1
2018-04-26 16: 22: 58Z
  1. Bien qu'utile pour des problèmes similaires, il ne s'agit pas d'un conditionnel ternaire. Cela fonctionne pour remplacer x if x else y, mais pas x if z else y.
    2018-10-11 17: 13: 50Z
source placée ici