Python: fonctions et compréhensions#

Cette feuille donne des rappels de syntaxe Python tels que les compréhensions vues en introduction à l’informatique au semestre précédent.

De C++ à Python#

Vous trouverez ci-dessous quelques rappels à propos du langage de programmation Python en comparaison avec C++:

  • les instructions sont séparées par des sauts de ligne (pas de ;)

  • les blocs sont déterminés par l’indentation (et non les accolades {})

  • le type est attaché aux valeurs et non aux variables

  • déclaration optionnelle des variables

  • déclaration optionnelle du type des entrées et sorties des fonctions
    mais c’est possible et recommandé par annotations de types

Constantes et affectations:

x = 42
message = "Bonjour!"
pi = 3.14159

Dans une cellule Jupyter: seule la valeur de la dernière expression est affichée:

message
x + pi

Avec un ; la dernière expression est vide; il n’y a donc rien d’affiché:

message
x + pi;

Les chaînes de format f"..." permettre de construire aisément des chaînes de caractères avec des paramètres:

f"La somme de x et pi vaut: {x+pi}; cela vaut bien un message: {message}"

Un if en C++:

if ( x < 10 ) {
    cout << "x est strictement plus petit que 10" << endl;
} else {
    cout << "x est plus grand que 10" << endl;
}

Le même if en Python:

if x < 10:
    print("x est strictement plus petit que 10")
else:
    print("x est plus grand que 10")

Une boucle for en C++:

for (int i = 0; i < 10 ; i++) {
    cout << i << endl;
}

La même boucle for en Python:

for i in range(0, 10):
    print(i)

range permet de construire des séquences d’entiers:

list(range(5, 10))
list(range(5, 95, 10))
list(range(10, 5, -1))

Fonctions mathématiques usuelles#

from math import sin, cos, tan
sin(3.14)

Définir une fonction#

En C++:

int f(int x, int y, int r) {
    return x + y - r
}

En Python:

def f(x, y, r):
    return x + y - r

Exercice: Écrire une fonction aire_rectangle(l,h) qui renvoie l’aire d’un rectangle de longueur l et de hauteur h.

# VOTRE CODE ICI
raise NotImplementedError()
assert aire_rectangle(3, 7) == 21

Il est possible – et même recommandé – de rajouter de la documentation, ainsi que des annotations de type. Ici nous précisons que les entrées et les sorties sont des nombres à virgule:

def f(x: float, y: float, r: float) -> float:
    """
    Renvoie x plus y moins r
    
    Ici, des explications sur la fonction
    """
    return x + y - r

Vous pouvez ensuite accéder à la documentation de la fonction comme d’habitude avec:

f?

Rajoutez de la documentation et des annotations de types à votre fontion aire_rectangle pour indiquer que les entrées et les sorties sont des entiers.

# VOTRE CODE ICI
raise NotImplementedError()

À noter que les annotations de type ne sont pas vérifiées à l’exécution. Votre fonction acceptera quand même des arguments non entiers:

aire_rectangle(1.2, 1.3)

Ces annotations servent d’une part de documentation et d’autre part peuvent servir pour de l”analyse statique de code pour détecter automatiquement d’éventuelles incohérences.

Les compréhensions#

Les compréhensions sont un moyen confortable de construire des listes (ou autres collections) en décrivant tous les éléments, avec une syntaxe proche de la notation mathématiques pour l’ensemble des \(f(x)\) pour \(x\) dans \(X\) tels que \(c(x)\).

\[ \{ f(x) \mid x\in X, c(x) \}\]

En Python la syntaxe est:

      [ <expr> for <name> in <iterable> ]
      [ <expr> for <name> in <iterable> if <condition> ]

Voici par exemple la liste des \(i^2\)\(i\) est dans \(\{1, 3, 7\}\):

[ i**2 for i in [1, 3, 7] ]

La même où \(i\) parcoure l’intervale \([0, 10[\):

[ i**2 for i in range(0, 10) ]

La liste des \(i^2\) dans l’intervale \([0,10[\) tels que \(i\) n’est pas divisible par trois:

[ i**2 for i in range(0, 10) if i % 3 != 0]

Exercice: Écrire une fonction aire_rectangles(h) qui renvoie la liste des surfaces de tous les rectangles de hauteur h et de largeur entière dans l’intervale \([1, 5[\), en utilisant votre fonction aire_rectangle:

# VOTRE CODE ICI
raise NotImplementedError()
assert aire_rectangles(3) == [3, 6, 9, 12]

Conclusion#

Enregistrez les modifications de votre feuille (Ctrl + s ), déposez-la avec le tableau de bord puis passez à la feuille 3.