Deprecated: Array and string offset access syntax with curly braces is deprecated in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/init.php on line 563
if-then-else_monoligne [Les recettes Python de Tyrtamos]

Outils pour utilisateurs

Outils du site


if-then-else_monoligne

Ceci est une ancienne révision du document !



Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/parser/handler.php on line 1458

Warning: preg_match(): Compilation failed: invalid range in character class at offset 3565 in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/parser/lexer.php on line 118
A PCRE internal error occured. This might be caused by a faulty plugin

====== Un "if-then-else" monoligne utilisable dans une expression et dans une fonction lambda ====== ===== Problématique ===== le "if", nécessaire pour restituer un résultat différent selon une condition, est une instruction et, en tant que tel, n'est pas permis dans une expression ni dans une fonction lambda. Il s'agit en fait de simuler ce qui existe dans certains langages comme (cond ? si_oui : si_non) ===== Solution avant la version 2.5 de Python ===== Prenons d'abord une solution simple: (cond and x or y) avec un exemple: <code python> x=2 y=3 print (x<y and x or y) # affiche 2 print (x>y and x or y) # affiche 3 </code> and et or ayant le même niveau de priorité seront exécutés successivement de gauche à droite. Par ailleurs, si (cond and x) vaut True, le 'or' ne sera jamais exécuté. donc, si cond est vrai ainsi que x, renvoi de x. Sinon, le or est exécuté et y est renvoyé. Mais dans cette forme simplifiée, si x=0, ça ne marche plus: <code python> x=0 y=3 print (x<y and x or y) # affiche 3 au lieu de 0 </code> En effet, pour que ça marche, il ne faut pas que x puisse être évalué à False (donc ni à 0, ni à "", ni à [], ni à (), ni à {}). D'où l'astuce de passer par une liste qui, si elle n'est pas vide, sera toujours True (essayez: même [False] est évalué à True!). La solution est donc: <code python> (cond and [x] or [y])[0] </code> qui donne le même résultat que: <code python> if cond: renvoi de x else: renvoi de y </code> Avec l'exemple ci-dessus x=0 et y=3: <code python> print (x<y and [x] or [y])[0] # affiche 0 print (x>y and [x] or [y])[0] # affiche 3 </code> Et, effectivement, cette forme astucieuse peut être utilisée dans une fonction lambda alors qu'un if serait interdit: <code python> est_pair = lambda x: ((x%2==0) and ['oui'] or ['non'])[0] print est_pair(10) # affiche 'oui' print est_pair(11) # affiche 'non' </code> Dans cet exemple, on pourrait éviter l'utilisation de la liste, mais n'oubliez pas: une chaîne vide est évaluée à False! ===== Solution intégrée dans la version 2.5 de Python ===== Avec Python 2.5, on a enfin un "if then else monoligne", même s'il n'est pas facile à trouver dans le manuel. La syntaxe retenue est: <code python> (x if cond else y) </code> Exemple: <code python> x=0 y=3 print (x if x<y else y) # affiche 0 print (x if x>y else y) # affiche 3 </code> Voir aussi la pep 308: [[http://www.python.org/dev/peps/pep-0308/]] <html> <head> <style type="text/css"> <!-- body {background-image:url(fondcorps.jpg);} --> </style> </head> <body> </body> </html>

if-then-else_monoligne.1213371125.txt.gz · Dernière modification: 2008/06/13 17:32 par tyrtamos

Outils de la page