Python Language
Conditionnels
Recherche…
Introduction
Les expressions conditionnelles, impliquant des mots-clés tels que if, elif et bien d'autres, permettent aux programmes Python d'effectuer différentes actions en fonction d'une condition booléenne: True ou False. Cette section traite de l'utilisation des conditions Python, de la logique booléenne et des instructions ternaires.
Syntaxe
- <expression> if <conditionnel> else <expression> # Opérateur ternaire
si elif et autre
En Python, vous pouvez définir une série de conditions en utilisant if
pour le premier, elif
pour le reste, jusqu'au final (optionnel) else
pour tout ce qui n'est pas pris par les autres conditionnelles.
number = 5
if number > 2:
print("Number is bigger than 2.")
elif number < 2: # Optional clause (you can have multiple elifs)
print("Number is smaller than 2.")
else: # Optional clause (you can only have one else)
print("Number is 2.")
Le Number is bigger than 2
sorties Number is bigger than 2
Utiliser else if
au lieu de elif
déclenchera une erreur de syntaxe et n'est pas autorisé.
Expression conditionnelle (ou "l'opérateur ternaire")
L'opérateur ternaire est utilisé pour les expressions conditionnelles en ligne. Il est préférable de l'utiliser dans des opérations simples et concises, faciles à lire.
- L'ordre des arguments est différent de beaucoup d'autres langages (tels que C, Ruby, Java, etc.), ce qui peut conduire à des bogues lorsque des personnes peu familiarisées avec le comportement "surprenant" de Python l'utilisent (elles peuvent inverser l'ordre).
- Certains le trouvent "peu maniable", car cela va à l'encontre du flux normal de la pensée (penser d'abord à la condition et ensuite aux effets).
n = 5
"Greater than 2" if n > 2 else "Smaller than or equal to 2"
# Out: 'Greater than 2'
Le résultat de cette expression sera tel qu'il est lu en anglais - si l'expression conditionnelle est True, alors elle sera évaluée à l'expression du côté gauche, sinon du côté droit.
Les opérations de tenaire peuvent également être imbriquées, comme ici:
n = 5
"Hello" if n > 10 else "Goodbye" if n > 5 else "Good day"
Ils fournissent également une méthode pour inclure des conditions dans les fonctions lambda .
Si déclaration
if condition:
body
Les instructions if
vérifient la condition. S'il est évalué à True
, il exécute le corps de l'instruction if
. S'il est évalué à False
, il saute le corps.
if True:
print "It is true!"
>> It is true!
if False:
print "This won't get printed.."
La condition peut être toute expression valide:
if 2 + 2 == 4:
print "I know math!"
>> I know math!
Autre déclaration
if condition:
body
else:
body
L'instruction else n'exécutera son corps que si les instructions conditionnelles précédentes valent toutes False.
if True:
print "It is true!"
else:
print "This won't get printed.."
# Output: It is true!
if False:
print "This won't get printed.."
else:
print "It is false!"
# Output: It is false!
Expressions booléennes
Les expressions logiques booléennes, en plus d'évaluer True
ou False
, renvoient la valeur interprétée comme True
ou False
. C'est une manière pythonique de représenter une logique qui pourrait autrement nécessiter un test if-else.
Et opérateur
L'opérateur and
évalue toutes les expressions et renvoie la dernière expression si toutes les expressions ont la valeur True
. Sinon, il renvoie la première valeur évaluée à False
:
>>> 1 and 2
2
>>> 1 and 0
0
>>> 1 and "Hello World"
"Hello World"
>>> "" and "Pancakes"
""
Ou opérateur
L'opérateur or
évalue les expressions de gauche à droite et retourne la première valeur qui a la valeur True
ou la dernière valeur (si aucune n'est True
).
>>> 1 or 2
1
>>> None or 1
1
>>> 0 or []
[]
Évaluation paresseuse
Lorsque vous utilisez cette approche, rappelez-vous que l'évaluation est paresseuse. Les expressions qui ne doivent pas être évaluées pour déterminer le résultat ne sont pas évaluées. Par exemple:
>>> def print_me():
print('I am here!')
>>> 0 and print_me()
0
Dans l'exemple ci-dessus, print_me
n'est jamais exécuté car Python peut déterminer que l'expression entière est False
lorsqu'elle rencontre le 0
( False
). Gardez cela à l'esprit si print_me
doit être exécuté pour servir la logique de votre programme.
Test pour plusieurs conditions
Une erreur courante lors de la vérification de plusieurs conditions consiste à appliquer la logique de manière incorrecte.
Cet exemple essaie de vérifier si deux variables sont chacune supérieures à 2. L'instruction est évaluée comme suit - if (a) and (b > 2)
. Cela produit un résultat inattendu car bool(a)
évalué comme True
lorsque a
n'est pas nul.
>>> a = 1
>>> b = 6
>>> if a and b > 2:
... print('yes')
... else:
... print('no')
yes
Chaque variable doit être comparée séparément.
>>> if a > 2 and b > 2:
... print('yes')
... else:
... print('no')
no
Une autre erreur, similaire, est commise lors de la vérification d'une variable parmi plusieurs. L'énoncé dans cet exemple est évalué comme - if (a == 3) or (4) or (6)
. Cela produit un résultat inattendu car bool(4)
et bool(6)
sont évalués à True
>>> a = 1
>>> if a == 3 or 4 or 6:
... print('yes')
... else:
... print('no')
yes
Encore une fois, chaque comparaison doit être faite séparément
>>> if a == 3 or a == 4 or a == 6:
... print('yes')
... else:
... print('no')
no
Utiliser l'opérateur in est la manière canonique d'écrire ceci.
>>> if a in (3, 4, 6):
... print('yes')
... else:
... print('no')
no
Valeurs de vérité
Les valeurs suivantes sont considérées comme fausses, en ce sens qu'elles sont évaluées à False
lorsqu'elles sont appliquées à un opérateur booléen.
- Aucun
- Faux
-
0
, ou toute valeur numérique équivalente à zéro, par exemple0L
,0.0
,0j
- Séquences vides:
''
,""
,()
,[]
- Mappages vides:
{}
- Types définis par l'utilisateur où les méthodes
__bool__
ou__len__
renvoient 0 ouFalse
Toutes les autres valeurs de Python sont évaluées à True
.
Remarque: une erreur courante consiste à vérifier simplement la fausseté d'une opération qui renvoie des valeurs Falsey différentes lorsque la différence est importante. Par exemple, utiliser if foo()
plutôt que le plus explicite if foo() is None
Utiliser la fonction cmp pour obtenir le résultat de la comparaison de deux objets
Python 2 inclut une fonction cmp
qui vous permet de déterminer si un objet est inférieur, égal ou supérieur à un autre objet. Cette fonction peut être utilisée pour choisir un choix parmi une liste en fonction de l’une de ces trois options.
Supposons que vous ayez besoin d'imprimer 'greater than'
si x > y
, 'less than'
si x < y
et 'equal'
si x == y
.
['equal', 'greater than', 'less than', ][cmp(x,y)]
# x,y = 1,1 output: 'equal'
# x,y = 1,2 output: 'less than'
# x,y = 2,1 output: 'greater than'
cmp(x,y)
renvoie les valeurs suivantes
Comparaison | Résultat |
---|---|
x <y | -1 |
x == y | 0 |
x> y | 1 |
Cette fonction est supprimée sur Python 3. Vous pouvez utiliser la cmp_to_key(func)
assistance cmp_to_key(func)
située dans functools
dans Python 3 pour convertir les anciennes fonctions de comparaison en fonctions clés.
Évaluation des expressions conditionnelles à l'aide de listes de compréhension
Python vous permet de pirater les listes de compréhension pour évaluer les expressions conditionnelles.
Par exemple,
[value_false, value_true][<conditional-test>]
Exemple:
>> n = 16
>> print [10, 20][n <= 15]
10
Ici n<=15
renvoie False
(ce qui équivaut à 0 en Python). Donc, ce que Python évalue est:
[10, 20][n <= 15]
==> [10, 20][False]
==> [10, 20][0] #False==0, True==1 (Check Boolean Equivalencies in Python)
==> 10
La méthode intégrée __cmp__
renvoyé 3 valeurs possibles: 0, 1, -1, où cmp (x, y) a renvoyé 0: si les deux objectifs étaient identiques 1: x> y -1: x <y
Cela pourrait être utilisé avec des listes compréhensibles pour renvoyer le premier élément (c'est-à-dire index 0), le deuxième élément (ie index 1) et le dernier élément (ie index -1) de la liste. Nous donner un conditionnel de ce type:
[value_equals, value_greater, value_less][<conditional-test>]
Enfin, dans tous les exemples ci-dessus, Python évalue les deux branches avant d'en choisir une. Pour évaluer uniquement la branche choisie:
[lambda: value_false, lambda: value_true][<test>]()
où l'ajout de ()
à la fin garantit que les fonctions lambda ne sont appelées / évaluées qu'à la fin. Ainsi, nous n'évaluons que la branche choisie.
Exemple:
count = [lambda:0, lambda:N+1][count==N]()
Tester si un objet est Aucun et l'attribuer
Vous voudrez souvent attribuer quelque chose à un objet s'il est None
, indiquant qu'il n'a pas été affecté. Nous utiliserons aDate
.
La méthode la plus simple consiste à utiliser le test is None
.
if aDate is None:
aDate=datetime.date.today()
(Notez qu'il est plus pythonique de dire que is None
au lieu de == None
.)
Mais cela peut être légèrement optimisé en exploitant la notion que not None
sera évalué à True
dans une expression booléenne. Le code suivant est équivalent:
if not aDate:
aDate=datetime.date.today()
Mais il y a une manière plus pythonique. Le code suivant est également équivalent:
aDate=aDate or datetime.date.today()
Cela fait une évaluation de court-circuit . Si aDate
est initialisé et n'est not None
, il se lui attribue sans effet net. S'il is None
, le datetime.date.today()
est assigné à aDate
.