Licence CC BY-SA

Retour sur les conditions

Instructions et expressions

Dans le cours j’ai plusieurs fois utilisé le terme d’« expression ». Une expression est un élément de syntaxe Python qui possède une valeur quand il est évalué.
'foo', 3 * 5 + 2 ou encore max(range(10)) sont des expressions.

Si je dis ça maintenant, c’est parce qu’il n’y a pas uniquement des expressions en Python. Plus généralement, on trouve des instructions. L’instruction c’est la définition au sens large d’un élément de syntaxe, pour résumer on pourrait dire que c’est une ligne de code.

Ainsi, les expressions sont des instructions, mais toutes les instructions ne sont pas des expressions. Une expression c’est ce qu’on peut utiliser partout où une valeur est attendue : en argument à une fonction, dans une assignation de variable, dans une condition, etc.

>>> len('foo')
3
>>> x = 3 * 5 + 2
>>> if max(range(10)):
...     print('ok')
... 
ok

Dit autrement, une expression c’est ce que l’on peut mettre entre parenthèses.

>>> ('foo')
'foo'
>>> (3 * 5 + 2)
17
>>> (max(range(10)))
9

Et par exemple une assignation de variable n’est pas une expression, elle ne possède aucune valeur, pas même None. Si l’on cherche à placer une assignation entre parenthèses on obtient une erreur de syntaxe.

>>> (foo = 'bar')
  File "<stdin>", line 1
    (foo = 'bar')
         ^
SyntaxError: invalid syntax

De la même manière, les conditions ne sont pas des expressions, il s’agit de blocs de code.

>>> (if True: print('ok'))
  File "<stdin>", line 1
    (if True: print('ok'))
     ^
SyntaxError: invalid syntax

Pourtant il serait pratique de pouvoir utiliser directement une condition dans un argument de fonction ou une assignation…

Expressions conditionnelles

Et c’est heureusement possible grâce aux expressions conditionnelles. Comme leur nom l’indique, ce sont des conditions sous forme d’expressions.

Elles reprennent les mêmes mots-clés if et else mais sans construire de bloc, leur syntaxe est la suivante :

valeur if condition else autre_valeur

Cette expression vaut valeur si condition est vraie et autre_valeur sinon.

>>> 'good' if 5 + 3 == 8 else 'bad'
'good'
>>> 'good' if 5 + 3 == 7 else 'bad'
'bad'

Étant une expression, elle doit toujours avoir une valeur, c’est pourquoi le else est obligatoire dans tous les cas.

Les expressions conditionnelles permettent d’avoir un code plus concis lorsque les conditions à traiter sont simples.

>>> x = 3
>>> y = 5
>>> z = (2 * x if x < 10 else x) / (y if y else 1)

Sans elles, il nous aurait fallu écrire le code suivant :

>>> if x < 10:
...     tmp1 = 2 * x
... else:
...     tmp1 = x
... 
>>> if y:
...     tmp2 = y
... else:
...     tmp2 = 1
... 
>>> z = tmp1 / tmp2

Elles sont souvent utilisées aussi lors d’appels de fonctions ou méthodes.

>>> sep = None
>>> 'a,b,c'.split(sep if sep is not None else ',')
['a', 'b', 'c']

On parle aussi de « conditions ternaires » pour qualifier les expressions conditionnelles, car c’est un opérateur à 3 opérandes (op1 if op2 else op3).