Expressions complexes ou fonctions auxiliaires en Python ?

Un célèbre aphorisme de Larry Wall, créateur de Perl, affirme qu'un bon programmeur possède trois qualités : la paresse, l'impatience et l'orgueil. Dans le monde du développement, ces termes prennent un sens technique : la paresse pousse à écrire du code concis et réutilisable ; l'impatience conduit à optimiser les performances ; l'orgueil encourage à produire un code fiable et clair. Mais comment concilier concision et lisibilité ? Examinons un cas simple : trouver le maximum parmi trois nombres saisis par l'utilisateur.

Voici une approche naïve, parfaitement compréhensible :

val1 = int(input('Premier nombre : '))
val2 = int(input('Deuxième nombre : '))
val3 = int(input('Troisième nombre : '))

if val1 > val2:
    max_temp = val1
else:
    max_temp = val2

if val3 > max_temp:
    resultat = val3
else:
    resultat = max_temp

print('Le maximum est :', resultat)

Un programmeur « paresseux » préférera l'opérateur ternaire, introduit en Python 2.5 :

x = int(input('x = '))
y = int(input('y = '))
z = int(input('z = '))

max_xy = x if x > y else y
max_final = z if z > max_xy else max_xy
print('Valeur max :', max_final)

Avant cette version, certains simulaient le ternaire avec and et or, technique dangereuse car une valeur nulle (0 ou False) brise la logique :

# Exemple problématique
a = 0
b = -100
print(True and a or b)   # Affichera -100 au lieu de 0

Pour pousser la concision plus loin, on pourrait tout écrire en une seule ligne :

a = int(input('a = '))
b = int(input('b = '))
c = int(input('c = '))
print('Max :', (a if a > b else b) if (a if a > b else b) > c else c)

Mais cette expression est-elle réellement lisible ? Elle devient vite obscure. Une meilleure pratique consiste à extraire la logique de comparaison dans une fonction auxiliaire :

def max_deux(v1, v2):
    return v1 if v1 > v2 else v2

a = int(input('a = '))
b = int(input('b = '))
c = int(input('c = '))
print('Maximum :', max_deux(max_deux(a, b), c))

Cette fonction réutilisible améliore la clarté et permet la composition. Bien entendu, Python intègre déjà une fonction max acceptant un nombre variable d'arguments :

a = int(input('a = '))
b = int(input('b = '))
c = int(input('c = '))
print('Max :', max(a, b, c))

L'idée centrale reste : préférer des fonctions claires à des expressions alambiquées, même si la solution finale utilise une primitive du langage. La leçon vaut pour tout langage et toute situation où la complexité syntaxique nuit à la maintenabilité.

Étiquettes: Python fonctions lisibilité expressions ternaires bonnes pratiques

Publié le 17 juin à 23h49