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

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
if-then-else_monoligne [2008/06/13 17:32]
tyrtamos
if-then-else_monoligne [2008/06/15 07:04]
tyrtamos
Ligne 3: Ligne 3:
 ===== Problématique ===== ===== 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.+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) Il s'agit en fait de simuler ce qui existe dans certains langages comme (cond ? si_oui : si_non)
Ligne 9: Ligne 9:
 ===== Solution avant la version 2.5 de Python ===== ===== Solution avant la version 2.5 de Python =====
  
-Prenons d'​abord une solution simple: (cond and x or y) avec un exemple:+Prenons d'​abord une solution simple: ​ 
 + 
 +<code python>​ 
 +(cond and x or y) 
 +</​code>​ 
 + 
 +Et prenons ​un exemple:
  
 <code python> <code python>
Ligne 18: Ligne 24:
 </​code>​ </​code>​
  
-and et or ayant le même niveau de priorité seront exécutés successivement de gauche à droite+le "and" sera exécuté avant le "​or"​
  
-Par ailleurs, si (cond and x) vaut True, le 'or' ​ne sera jamais exécuté.+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é. 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:+Cela semble bien fonctionner,​ mais dans cette forme simplifiée,​ si x=0, ça ne marche plus:
  
 <code python> <code python>
Ligne 34: Ligne 40:
 En effet, pour que ça marche, il ne faut pas que x puisse être évalué à False (donc ni à 0, ni à "",​ ni à [], ni à (), ni à {}).  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!).+On utilise une astuceune liste qui, si elle n'est pas vide, sera toujours True (essayez: même [False] est évalué à True!).
  
 La solution est donc: La solution est donc:
Ligne 51: Ligne 57:
 </​code>​ </​code>​
  
-Avec l'​exemple ci-dessus x=0 et y=3:+Exemple:
  
 <code python> <code python>
 +x=0
 +y=3
 print (x<y and [x] or [y])[0] ​ # affiche 0 print (x<y and [x] or [y])[0] ​ # affiche 0
 print (x>y and [x] or [y])[0] ​ # affiche 3 print (x>y and [x] or [y])[0] ​ # affiche 3
Ligne 87: Ligne 95:
 </​code>​ </​code>​
  
 +Cette solution est également utilisable dans une fonction lambda alors qu'un "​if"​ serait interdit:
  
 +<code python>
 +toto = lambda x,y: (x if x<y else y)
 +toto(2,​3) ​ # affiche: 2
 +toto(2,​1) ​ # affiche: 1
 +</​code>​
  
 Voir aussi la pep 308: [[http://​www.python.org/​dev/​peps/​pep-0308/​]] Voir aussi la pep 308: [[http://​www.python.org/​dev/​peps/​pep-0308/​]]
if-then-else_monoligne.txt · Dernière modification: 2008/06/15 07:04 par tyrtamos