Les variables

Mémoire et affectation des variables

Lorsque nous réalisons un programme, certaines informations ou instructions devront être stockées dans la mémoire. Même si cela est un peu plus complexe, on peut imaginer la mémoire d'un ordinateur comme des cases, possédant chacune une adresse (adresse mémoire).
Mémorisation 0x - Réussite 0/0
Dans la Console Python, utiliser la fonction id(argument) pour obtenir les adresses mémoires de l'entier 2 et du booléen True.
La réponse donnée par la fonction id permet de déterminer si les objets sont les mêmes : ils occupent alors la même place en mémoire.
Il est possible d'apprendre à l'ordinateur ce que vaut une variable. On dit alors qu'on affecte une valeur à cette variable. Ainsi, si on écrit g = 2 on dit à l'ordinateur « g vaut 2 » ou plutôt « la valeur 2 est affectée à la variable g ».

Les types de variables

En informatique, toutes les variables ne sont pas des nombres (même si au final, elles seront toutes compilées en mots binaires). Il existe plusieurs types de variables et cela dépend du langage de programmation utilisé.

On distingue les types de base :
  • Les entiers (integer) comme 4 ;
  • les flottants ou décimaux (float) comme 5.2 ;
  • les chaînes de caractères (string) comme "ceci est une chaîne de caractère" ou simplement "bonjour" ;
  • les booléens (bool) qui peuvent prendre seulement deux valeurs : True ou False.
des types construits, c'est-à-dire qui sont constitués à partir des types de bases et qui seront traités dans le chapitre suivant.
  • les listes (list) qui sont des suites de variables comme ["bonjour", 4, True, 3] ;
  • les n-uplets (tuple) qui sont des suites de variables non-modifiable comme ("bonjour", 4, True, 3).
  • les dictionnaires, …

Enfin, une variable peut aussi pointer vers d'autres type d'objet : des fonctions, etc...

Dans la plupart des langages de programmation, il faut annoncer le type d'une variable avant de l'utiliser. Sous Python en revanche, c'est implicite : le type de la variable est déduit automatiquement de la valeur qu'on lui affecte.
On parle alors de typage dynamique qui s'oppose au typage statique. Il est possible d'afficher le type d'une variable sous Python en utilisant la fonction type(variable).

Mémorisation 0x - Réussite 0/0
Rechercher les types des valeurs suivantes :
  • 4
  • 2.5
  • "bonjour"
  • True
  • (1, 2, 3)
  • [1, 2, 3]
entrer type(4)...
  • 4:int
  • 2.5:float
  • "bonjour":str
  • True:bool
  • (1, 2, 3):tuple
  • [1, 2, 3]:list

Retenir qu'en python :

  • Les chaînes de caractères sont délimitées par des guillemets.
    Ainsi 4 est de type int, il s'agit d'un nombre mais "4" est de type str, il s'agit d'un caractère.
  • Les listes sont repérées par des crochets et les n-uplets, ou tuples, entre parenthèses.
  • Les valeurs des booléens True et False commencent par une majuscule.

Selon leur type, les variables vont avoir des propriétés différentes et il sera possible d'appliquer certains opérateurs. Il n'est donc pas possible, dans une majorité des cas, de réaliser des opérations entre des variables de types différents (il existe toutefois des exceptions).

Mémorisation 0x - Réussite 0/0
De quelle opération s'agit-il ?
concaténation
addition
Placer tous les éléments dans les bons groupes.
On constate que l'opérateur + ne réalise pas la même opérations selon le type des opérandes sur lesquelles il s'applique.

Retenir qu'en python : L'opérateur + additionne des entiers ou des flottants et concatène des chaînes de caractère, des listes ou des n-uplets. Concaténer signifie coller bout à bout.

Faire de même avec des variables de types différents. Que constate-t-on ? Exemples :
>>> 4 + 3.2
7.2
Il est possible d'additionner des entiers et des flottants ;
>>> 4 + "a"
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
il est impossible d'additionner ou concaténer un entier avec une chaîne de caractères ;
>>> [1, 2] + (3, 4)
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
TypeError: can only concatenate list (not "tuple") to list
il est impossible d'additionner ou concaténer une liste avec un tuple.
Il est indispensable de bien regarder les messages d'erreur.
Ils vous donnent beaucoup d'informations et vous permettent très souvent de corriger vos programmes.
Il est parfois possible de modifier le type d'une variable avec les fonctions suivantes :
  • str() converti en une chaîne de caractère,
  • int() en un entier,
  • float() en un flottant,
  • bool() en un booléen,
  • Il existe également : list() et tuple().
Mémorisation 0x - Réussite 0/0
Quel est le type de chaque valeur en pyhon ?
chaîne de caractères / str (string)
n-uplet / tuple
entier / int (integer)
liste / list
décimal / float
Placer tous les éléments dans les bons groupes.

Les opérateurs

Outre l'addition (ou la concaténation), Python connaît la plupart des opérations mathématiques habituelles.

Mémorisation 0x - Réussite 0/0
Que réalise chacun de ces opérateurs (en python 3.x) ?
//
/
%
Glisser-déposer pour former les bonnes paires.
Remarques :
  • la fonction «racine carrée» (square root)sqrt() n'est pas une fonction pré-chargée de Python, il faut importer le module math pour pouvoir l'utiliser ; on peut le faire de deux façons, en écrivant :
    • import math puis math.sqrt() pour appeler la fonction ;
    • ou bien from math import * puis sqrt() pour appeler la fonction (dans ce cas, pas besoin d'écrire math. avant sqrt).
  • L'opération «reste euclidien» (modulo) % est souvent utilisée pour obtenir la parité d'un entier :
    • si n%2 vaut 0, n est pair ;
    • si n%2 vaut 1, n est impair ;
Mémorisation 0x - Réussite 0/0/16
Lorsque x contient 12, que renvoie l'instruction x%2 == 0
Cocher la bonne réponse.
Retenir que si a%b == 0 alors a est un multiple entier de b, c'est-à-dire que a est divisible par b.

Python est également capable, comme la plupart des langages informatiques, d'utiliser les comparateurs mathématiques.

2 == 2     # comparaison d'égalité, à ne pas confondre avec l'affectation (un seul signe = )
2 != 3     # comparaison «différent de», le ! représente la barre sur le signe égal, comme dans ≠
2 < 3      # comparaison plus petit que
2 > 3      # comparaison plus grand que
2 <= 2     # comparaison plus petit ou égal
2 >= 3     # comparaison plus grand ou égal
Le résultat obtenu est un booléen : True ou False (type bool).

Tous les opérateurs (de calcul, de comparaison, booléen) peuvent être associés dans une même instruction et des règles de priorité s'appliquent.
Voici les opérateurs classés du plus prioritaire au moins prioritaire :

(...)           # L'encadrement par des parenthèses
**
*, /, //, %
+, -
> >=
== != < <=
in, not in      # Vous verrez ces opérateurs dans le chapitre sur les types construits
not
and
or
Mémorisation 0x - Réussite 0/0/5
Écrire le résultat de l'instruction (3 + 2)*4 :

Interagir avec l'utilisateur

La plupart des programmes informatiques nécessitent d'interagir avec l'utilisateur en lui communiquant des informations ou en lui demandant par exemple d'entrer une valeur.

La tradition en informatique veut que l'on commence par apprendre comment dire bonjour en affichant le texte Hello World!.
En python, afficher se réalise avec la fonction print().
Pour demander à l'utilisateur d'entrer quelque chose on utilise la fonction input(). Il est possible de donner en argument de cette fonction un texte qui sera affiché pour guider l'utilisateur dans sa réponse.
Dans cet exemple, l'instruction input() demande à l'utilisateur d'entrer son nom et affecte sa réponse à la variable x. Le contenu de la variable x est affiché par l'instruction . Il s'agit d'une chaîne de caractères.
x = input("Quel est votre nom ?")
print("Bonjour, comment allez-vous", x ,"?")        # Première solution
print("Bonjour, comment allez-vous " + x + " ?")    # Deuxième solution
Il faudra toujours faire attention : la fonction input() renvoie une chaîne de caractères str et dans de nombreuses situations, il sera nécessaire de convertir ces variables pour pouvoir les manipuler par la suite.
30s Mémorisation 0x - Réussite 0/0

Devenir programmeur

Choix du nom des variables

Tâcher de toujours choisir des noms de variable qui aient un sens.

Attention, certains noms sont réservés en python. Par exemple, il serait assez dangereux de nommer une variable int car ce mot est déjà utilisé pour une fonction de python. Si vous le faites, vous écrasez la fonction originale, qui devient inutilisable pour la suite du code ce qui est source d'erreur.
Voici la liste des mot-clés de python :
Falseawaitelseimportpass
Nonebreakexceptinraise
Trueclassfinallyisreturn
andcontinueforlambdatry
asdeffromnonlocalwhile
assertdelglobalnotwith
async elififoryield

Se documenter

Pour découvrir ce que peut faire une fonction, il faut prendre l'habitude de consulter la documentation en ligne.
La documentation officielle de python est sur python.org mais il existe aussi une documentation peut-être plus accessible sur w3schools.com.
Il faudra très souvent se débrouiller avec l'anglais.

Une autre façon de se documenter est d'utiliser la fonction help qui affiche la documentation de ce que vous lui donnez en argument et qui a été renseigné par le développeur au sein code.

Mémorisation 0x - Réussite 0/0
Aller sur w3schools.com pour découvrir la documentation de la fonction print().
Repérer la syntaxe d'appel de cette fonction. Les arguments que vous pouvez lui donner, ainsi que leur valeur par défaut.
print(object(s), sep=separator, end=end, file=file, flush=flush)
Parameter Description
object(s) Any object, and as many as you like. Will be converted to string before printed
sep='separator' Optional. Specify how to separate the objects, if there is more than one. Default is ' '
end='end' Optional. Specify what to print at the end. Default is '\n' (line feed)

Utiliser un EDI

Un EDI est un logiciel de traitement de texte amélioré qui propose des fonctionnalités facilitant l'écriture du code avec entre autre :
  • la coloration syntaxique,
  • la présentation de la documentation des fonctions et méthodes,
  • l'autocomplétion du code.
vscodium capture
visual-studio-codium logo
logo vscodium (version libre de vscode)

Commenter son code !

En python tout ce qui suit un dièse # est un commentaire et ne sera pas exécuté.

  • Ils permettent d'expliquer le code.
  • Ils permettent de rendre un code plus lisible en l'organisant avec des titres par exemple.
  • Ils permettent de neutraliser temporairement une ligne de code que l'on ne souhaite pas voir exécutée.

Commentez suffisamment votre code mais veillez à ce que vos commentaires soient à jour, n'alourdissent pas le code et ne soit pas redondants ; ne commentez pas des évidences. Exemple :

x = x + 1    # Incrémente x de 1          (Inutile)
x = x + 1    # Compensation de bordure    (Utile)
Code source (modification) :
Consulter le guide
sur Wikipédia.
Écrire du HTML
30s Mémorisation 0x - Réussite 0/0

Respecter le PEP8

La norme PEP8, écrite en 2001, regroupe quelques règles de bonnes pratiques dans l'écriture du code. Son objectif est d'améliorer la lisibilité et la cohérence du code Python.
En voici un extrait :
Il faut indenter avec 4 espaces et non avec la tabulation.
Les opérateurs doivent être entourés d'espaces.
✓ À faire !
x = 'valeur'
ceci == cela
1 + 2
🚫 Ne pas faire
x='valeur'
ceci==cela
1+2
Avec deux exceptions notables :
les opérateurs mathématiques de plus haute priorité
a = x*21
b = x*x + y*y
c = (a+b) * (a-b)
la déclaration d'arguments dans une fonction
def fonction(arg='valeur'):
Pas d'espace à l'intérieur des parenthèses, crochets ou accolades.
✓ À faire !
2 * (3 + 4)
def fonction(arg='valeur'):
    {str(x): x for x in range(10)}
    val = dico['key']
🚫 Ne pas faire
2 * ( 3 + 4 )
def fonction( arg='valeur' ):
    { "nom": "Elvis" }
    val = dico[ 'clé' ]
Pas d'espace avant les deux points, les virgules et les points-virgules, mais après oui.
✓ À faire !
def fct(arg1, arg2):
    dico = {'a': 1}
🚫 Ne pas faire
def fct(arg , arg2) :
    dico = {'a' : 1}
Une ligne doit se limiter à 79 caractères car il est plus facile de scanner un code sur une courte colonne qu'en faisant des allers-retours de défilement. Si une ligne est trop longue, il existe plusieurs manières de la découper sur plusieurs lignes :
Tant qu'une liste (ou un tuple) n'est pas refermée par son crochet (par sa parenthèse), python accepte le passage à la ligne.
A = une_fonction_au_nom_long(ne, tient, pas,
                             sur, une, ligne)
Si c'est une même ligne de code qu'il faut couper, on peut utiliser l'antislash \ pour passer à la ligne :
if (a<=10 or a>20) and \
   (b<=10 or 20100):
Les imports de modules doivent se faire sur plusieurs lignes.
✓ À faire !
import math
import random
🚫 Ne pas faire
import math, random
Pour découper une ligne sur deux lignes, il faut indenter la deuxième pour une question de visibilité :
✓ À faire !
s = ["Do", "Ré", "Mi", "Fa",
     "Sol", "La", "Si"]
🚫 Ne pas faire
s = ["Do", "Ré", "Mi", "Fa",
"Sol", "La", "Si"]
Encoder son texte en UTF8 avec cette ligne de pseudo-code en première ligne de votre programme :
✓ À faire !
# -*- coding:Utf-8 -*-
  • Ne jamais utiliser les lettres L minuscule « l », i majuscule « I » et o majuscule « O » que l'on peut confondre.
  • Lettre seule et en minuscule pour les variables de boucles et les indices. Lettres minuscules et underscores pour les noms de modules, variables, fonctions et méthodes.
for x in range(10):
      print(x)
  i = get_index() + 12
  print(ma_liste[i])


def une_fonction():
    une_variable = 10
  
Première lettre en majuscule sans espace pour les classes.
class Classeur:
30s Mémorisation 0x - Réussite 0/0

Utiliser d'autres bibliothèques

Il existe un grand nombre de modules/bibliothèques ajoutant de nouvelles fonctionnalités à Python. Vous pouvez retrouver tous les modules natifs dans la documentation de python disponible ici : https://docs.python.org/3/ en cliquant sur « Index général des modules ».
Il existe aussi de nombreux modules/bibliothèques qui ne sont pas répertoriés ici et qui sont développés par la grande communauté de programmeur python.

Exemple de biblitohèques externes :

  • pygame pour l'interfaces graphique d'un petit jeu ;
  • pillow pour le traitement d'image ;
  • matplotlib pour le tracé de graphiques.
Un très grand nombre de bibliothèques pour Python sont regroupées sur le site pypi.org.
Exemple du module natif turtle :

Le module turtle de Python est un ensemble d'outils permettant de dessiner de façon très simple en piloter un stylo. Avant toutes choses, il est nécessaire d'importer les fonctions du module. Pour cela, il faut ajouter à votre script la ligne de code :
from turtle import *

Quelques instructions de turtle :
  • reset() : permet d'effacer les tracés
  • goto(x, y) : permet de se rendre au point de coordonnées (x,y)
  • forward(x) : permet d'avancer d'une distance de x pixels
  • backward(x) : permet de reculer d'une distance de x pixels
  • up() et down() : permet de lever le crayon de la feuille et de le poser sur la feuille.
  • color("couleur") : définit la couleur en anglais : red, blue, green, yellow, purple, black, …
  • left(x) et right(x) : permet de tourner d'un angle x (en degré) vers la gauche ou vers la droite
  • width(x) : permet d'obtenir une épaisseur de trait de x pixels
  • begin_fill() : permet de remplir un contour fermé avec la couleur sélectionnée. On ferme ensuite avec end_fill().
  • write("texte") : permet d'écrire la chaîne de caractères "texte"
  • speed(x) : définit la vitesse de tracé de la tortue (maximale à 0)
  • ht() : masque la flèche/le curseur st() : montre la flèche/le curseur
  • exitonclick() : permet de refermer une fenêtre graphique turtle en cliquant simplement dessus
Mémorisation 0x - Réussite 0/0
Aller sur le site officiel de python et retrouver la description du module turtle et de ses fonctions.
Tester les instructions turtle afin de vous familiariser avec.

Structures de gestion du flux d'exécution

Une structure de gestion du flux d'exécution permet de définir les instructions qui seront exécutées selon le contexte.

  • Il peut s'agir d'instruction à n'exécuter que si des conditions sont vérifiées. Dans ce cas on utilisera une structure conditionnelle (tests) : if, elif, else.
  • des blocs instructions à répéter un grand nombre de fois. On utilisera une structure itérative (boucles) : for, while.
  • ou à utiliser à différents endroits d'un programme. On utilisera une structure procédurale (fonctions) : def.

4.1. Les tests : if

Il est souvent nécessaire dans un programme de prévoir plusieurs actions possibles pour chaque instance (c'est-à-dire pour chaque donnée entrée). C'est par exemple le cas lorsqu'un programme demande de faire un choix entre plusieurs options ou lorsqu'il doit adopter un comportement différent selon les actions de l'utilisateur. Pour réaliser cela, tous les langages de programmation proposent une structure que l'on appelle le test ou structure conditionnelle.

Syntaxe python

La structure de test implique l'existence d'une condition derrière le « si » et le « sinon si ». Dans le cas idéal, le programme doit pouvoir couvrir toutes les instances possibles. Prenons un exemple pour illustrer l'algorithme d'un test et de sa traduction en langage Python.
# algorithme :
Quelle est votre couleur préférée ?
Si couleur est vert :
    Répondre : J'adore le vert !
Sinon si couleur est jaune :
    Répondre : Je déteste le jaune !
Sinon :
    Répondre : Tous les goût sont dans la nature !
En Python, l'algorithme précédent s'écrit très simplement, en anglais :
  • Si devient if ;
  • Sinon si devient elif (facultatif, contraction de «else+if») ;
  • Sinon devient else (facultatif mais conseillé pour rendre le code plus lisible et couvrir toutes les possibilités).
# traduction (implémentation) en Python :
coul = input("Quelle est votre couleur préférée ?")
if coul == "vert":
    print("J'adore le vert !")
elif coul == "jaune":
    print("Je déteste le jaune !")
else:
    print("Tous les goût sont dans la nature !")

En Python, on retiendra que chaque ligne de test doit nécessairement se terminer par deux points et que chaque bloc d'instruction doit être indenté de quatre espaces.
Remarque : Il existe d'autres structures de test sous Python (par exemple le test d'erreur « tryexcept »).

Mémorisation 0x - Réussite 0/0
Écrire un programme qui vous demande votre âge et vous indique si vous êtes majeur ou mineur.
age = int(input("Quel est votre âge ?")) if age >= 18: print("Vous êtes majeur.") else : print("Vous êtes mineur.")

Tests imbriqués

Il est également possible de créer une structure conditionnelle dans une autre. On parle de tests imbriqués.
Dans ce cas, les indentations sont particulièrement importantes car elles délimitent les différents blocs.

Mémorisation 0x - Réussite 0/0
Étudier le programme ci-contre et prévoir son comportement pour différentes instances (différentes valeurs de a, b et c).
a = int(input("a ?")) b = int(input("b ?")) c = int(input("c ?")) if a <= b: # Si a est le plus petit, if a >= c: # On le compare à c pour trouver le plus petit des deux print(c) else: print(a) elif b >= c: # Sinon, c'est b qui est le plus petit et on le compare à c print(c) else: print(b)
Ce programme recherche la plus petite des trois valeurs a, b et c saisies par l'utilisateur.

4.1.3. Condition composée (opérateurs et mot clé in)

Lorsqu'on écrit une condition dans un test, par exemple : if condition:, cela signifie en réalité que :
  • si la condition est vraie, alors le script qui est indenté à la suite s'exécute ;
  • si la condition est fausse, l'ensemble du bloc indenté est ignoré.
Une condition est un booléen. Dans une condition, il est possible d'utiliser tous les opérateurs de comparaisons, ou les opérateurs booléens : or, and et not.
Il est également possible d'utiliser le mot clé in pour savoir si une chaîne de caractères contient un caractère particulier.
Exemple :
demande = input("Quel est votre demande ?")
if "s'il vous plaît" in demande :
    print("Utilisateur bien éduqué.")
Code source (modification) :
Consulter le guide
sur Wikipédia.
Écrire du HTML
Mémorisation 0x - Réussite 0/0
Écrire un programme demandant un mot de passe comportant exactement 6 caractères (chiffres ou lettres) dont au moins une fois le caractère spécial $.
  • Si le mot de passe ne fait pas 6 caractères ou si le caractère spécial est absent, le programme doit indiquer que le mot de passe n'est pas conforme et s'arrêter ;
  • sinon le programme demande de confirmer le mot de passe.
    • Si le mot de passe de confirmation ne correspond pas au premier, le programme doit le signaler et s'arrêter ;
    • sinon le programme doit signaler que le mot de passe a été correctement enregistré

Aide :
La fonction len(seq) renvoie le nombre d'élément d'une séquence (chaînes de caractère, liste ou tuple) seq.
Ici, il faut vérifier que deux conditions sont vraies en les associant avec l'opérateur booléen and.
mdp = input("Entrez un mot de passe :") if len(mdp) != 6 or not "$" in mdp: print("Ce mot de passe n'est pas conforme. Opération annulée.") else: mdp_conf = input(...

Des variables comme condition

En python, il est possible d'utiliser des valeurs de variable directement comme des conditions. Elles sont alors interprétées comme des booléens.
Pour connaître le booléen associé à une valeur donnée, il suffit d'utiliser la conversion bool(...) ; par exemple : bool(0) renvoie False alors que bool(10) renvoie True. Ainsi :
  • pour les nombres (int, float) : 0 est interprété comme False, tous les autres nombres comme True ;
  • une chaîne de caratères vide "", un tuple vide () et une liste vide [] sont interprétés comme False ; non vides, ils renvoient True.
Mémorisation 0x - Réussite 0/0
Classer les propositions suivantes selon leur interprétation booléenne par Python :
False
True
Placer tous les éléments dans les bons groupes.

Les Boucles

Dans un programme, il est souvent nécessaire d'exécuter plusieurs fois la même tâche. Les langages de programmation permettent de coder facilement ces tâches répétitives à l'aide d'une structure itérative qu'on appelle communément « boucle ». Ces boucles sont de deux types :

4.3.1. La boucle for (pour)

On dit que c'est une boucle bornée car dès le départ, on sait combien de fois elle sera répétée.

for i in range(3):
    print(i)
La boucle for crée une variable i qui va prendre une valeur différente à chaque itération de la boucle.
Les valeurs prises sont celles définies par la séquence que génère la fonction : range().
Le le bloc de code qui est exécuté dans la boucle doit être bien indenté de quatre espaces.
La fonction range() permet d'obtenir des intervalles de nombres entiers ; elle peut être écrite avec 1, 2 ou bien 3 paramètres ; par :
  • range(10) renvoie successivement les entiers de 0 à 9 (10 est exclu), soit 10 entiers en tout ;
  • range(2, 10) renvoie successivement les entiers de 2 (inclus) à 9 (10 est exclu) ;
  • range(2, 10, 4) renvoie successivement les entiers, à partir de 2 inclus et strictement inférieurs à 10, avec un pas de 4, ce qui revient à renvoyer 2 et 6 ;
Mémorisation 0x - Réussite 0/0
Taper help(range) dans la console Python pour obtenir une aide rapide sur cette fonction.
class range(object) | range(stop) -> range object | range(start, stop[, step]) -> range object | | Return an object that produces a sequence of integers from start (inclusive) | to stop (exclusive) by step. range(i, j) produces i, i+1, i+2, ..., j-1. | start defaults to 0, and stop is omitted! range(4) produces 0, 1, 2, 3. | These are exactly the valid indices for a list of 4 elements. | When step is given, it specifies the increment (or decrement).

4.2.2. L'utilisation du mot-clé in dans une boucle for ou un test (if)

  • Le mot-clé in fournit une méthode très pratique pour parcourir les éléments d'une liste, d'un n-uplet (tuple) ou encore les caractères d'une chaîne de caractère, à l'aide d'une boucle for :
    for k in "azerty" :    # k va prendre successivement les valeurs "a", puis "z", ... jusqu'à "y"
        pass               # le mot clé pass ne fait rien (peut être utilisé pour rechercher des erreurs)
  • Le mot clé in est aussi utilisable pour écrire une condition :
    k = "a"
    if k in "azerty" :    # «k in "azerty"» renvoie True
        pass
Code source (modification) :
Consulter le guide
sur Wikipédia.
Écrire du HTML
Mémorisation 0x - Réussite 0/0
Étudiez le script suivant et prévoir le résultat avant de le tester.
for c in "bonjour": print(c)
les lettres de "bonjour" vont être affichées successivement ; la variable c va parcourir tous les caractères de la chaîne ; on peut ainsi voir une chaîne de caractères comme une séquence de caractères.

4.2.3. La boucle while (tant que)

La boucle while (tant que) répète une tâche tant qu'une condition donnée est vérifiée. On dit que c'est une boucle non bornée car au départ, on ne sait pas combien de fois elle sera répétée.
Exemple :
i = 1           # Valeur définie pour entrer dans la boucle
while i < 3:
    print(i)
    i += 1      # Valeur modifiée à chaque itération pour éviter une boucle infinie
La boucle tant que (while) vérifie une condition à chaque itérations.
  • Avant la boucle, cette condition doit être vraie (True) pour pouvoir entrer dans la boucle.
  • Cette condition doit obligatoirement être modifiée à un moment donné dans la boucle pour qu'elle puisse devenir fausse (False) à un moment donné et que la boucle while s'arrête.
    Sinon, la boucle est infinie et le programme tourne sans fin.
  • Comme d'habitude, le code qui est exécuté dans la boucle doit être indenté de quatre espaces.
Mémorisation 0x - Réussite 0/0
Écrire un script qui permet d'afficher tous les entiers de 1 à 10 (1,2,3,4,5,….) à l'aide d'une boucle for.
for i in range(1, 11): print(i)
Remarque : En python, il est possible d'interrompre une boucle for ou while avec le mot-clé break. Certains vous diront que si vous êtes amené à utiliser un break c'est que votre code est mal pensé.
Mémorisation 0x - Réussite 0/0
Écrire un script qui choisit aléatoirement deux nombres entiers entre 1 et 6 inclus. Le script demande ensuite à l'utilisateur d'entrer un chiffre.
  • Si ce chiffre correspond à l'un ou l'autre des nombres tirés au hasard, le script écrit « Bravo !» ;
  • sinon, l'utilisateur doit en choisir un autre, et ce jusqu'à ce qu'il trouve l'un des nombres.
Le programme ne devra contenir qu'une seule boucle et aucun if.
Aide : La fonction randint(a, b) peut être utile. Rechercher sa documentation afin d'importer le bon module.
from random import * a = randint(1, 6) b = randint(1, 6) u = int(input("Entrez un nombre entre 1 et 6 inclus : ")) while u != a and u != b: u = int(input("Entrez un nombre entre 1 et 6 inclus : ")) print("Bravo !")

Boucles imbriquées

De la même façon qu'il est possible d'imbriquer des structures conditionnelles, il est possible d'imbriquer des boucles.
Attention, dans ce cas, à bien respecter les différents niveaux d'indentation.
Mémorisation 0x - Réussite 0/0
Étudier le script ci-contre et prévoir son comportement en donnant ce qu'il affiche avant de le tester.
i = 1 while i != 2: for j in range(i, 3): print(i, j, end='_') i = i + 1

Les fonctions

Syntaxe python

Le but initial de la programmation est « d'apprendre » à un ordinateur comment réaliser des tâches, on parle aussi de procédures. Bien souvent, pour réaliser une tâche complexe, il est préférable de la découper en plusieurs tâches plus simples et d'enseigner à l'ordinateur comment réaliser ces tâches simples.
Par exemple, pour apprendre à un ordinateur comment dessiner une maison, il est préférable de lui apprendre comment tracer un trait puis d'avoir recours à cette tâche simple pour tracer la maison entière. Sous Python, et bien d'autres langages de programmation qui utilise le paradigme procédural, on peut facilement « enseigner » une tâche à un ordinateur au moyen d'une structure qu'on appelle fonction (ou parfois : sous-programme).

Exemple : Dans cet exemple, on définit la fonction nommée surface_disque(r) qui a besoin d'un paramètre r pour renvoyer son résultat :
def surface_disque(r):
    """Donne la surface d'un disque de rayon r (float) au centième près."""
    return round(3.14*r**2, 2)

Retenir qu'en python :

  • Le mot clé def permet de définir une nouvelle fonction.
  • Les commentaires décrivant la fonction sont encadrés de """...""" et précisent généralement le type des paramètres de la fonction.
    Par la suite, en entrant help(surface_disque), on peut accéder à ces commentaires. Si le but de la fonction est trop évident, on peut omettre ces commentaires pour plus de légèreté.
  • L'instruction return (renvoyer) indique ce que la fonction répond. L'exécution du code d'une fonction s'arrête lors d'une instruction return, le reste du code n'est pas exécuté.
  • L'ensemble des instructions et commentaires de la fonction doivent être indentés de quatre espaces.
Par la suite, on pourra appeler une fonction qui a été préalablement définie, pour l'utiliser dans un programme plus complexe en faisant suivre son nom des parenthèses ouvrantes et fermante ; par exemple : surface_disque(2)
Mémorisation 0x - Réussite 0/0
Écrire un programme qui demande le rayon d'un disque à l'utilisateur, utilise la fonction surface_disque précédente et lui donne une réponse sous la forme :
La surface d'un disque de rayon 2 vaut 12,56.
def surface_disque(r): """Donne la surface d'un disque de rayon r (float) au centième près.""" return round(3.14*r**2, 2) r = int(input("Quel est le rayon du disque ? ")) s = surface_disque(r) print("La surface d'un disque de rayon ", r, " vaut ", str(s).replace(".",","), ".", sep="")

4.3.2. Paramètres d'une fonction

Voici des exemples de fonctions qui ne demandent pas de paramètre :

Script 1 :
def fonction1():
    a = 0
    for i in range(1, 4):
        a += i
    return a

fonction1() # Appel de la fonction : les parenthèses sont vides

Lors de l'exécution du script 1 :

  • le moteur python commence par lire la ligne 1 et retient que c'est à cette ligne qu'est définie la fonction nommée fonction1.
  • Ensuite il saute tout le bloc de la fonction pour lire la ligne 7 qui correspond à l'appel («call» ()) de la fonction fonction1, ainsi écrit : fonction1().
  • Il recherche dans sa mémoire la position dans le code de cette fonction puis y retourne pour suivre les instructions du bloc de la fonction.

Script 2 :
def fonction2():
    for i in range(1, 4):
        return i
Dans le script 1 ci-dessus, la fonction renvoie l'entier 6. Si l'on veut que le résultat s'affiche dans la console, il faudra écrire print(fonction1()).
Dans le script 2 ci-dessus, l'appel fonction2() renvoie 1 : en effet après return, l'exécution du script de la fonction s'arrête.
Il faut faire attention en nommant vos fonctions à choisir des noms :
  • assez explicites ;
  • toujours différents.
En effet si deux définitions de fonction existent pour un même nom, seule la dernière définition sera retenue.

Il est toujours préférable d'utiliser les fonctions input et print à l'extérieur d'une fonction. Ceci permet de bien séparer le coeur du code de la partie réservée à l'interaction avec l'utilisateur. Ce conseil vous permettra de créer des fonctions réutilisables dans d'autres contexte et notamment avec des interface plus évoluée avec l'utilisateur.

Il est possible de préciser en argument de la fonction un ou plusieurs paramètres qui seront utilisable à l'intérieur de cette fonction.
Dans le cas où une fonction prendrait plusieurs paramètres, on les sépare par des virgules :
def fonction(param1, param2, ...):

Il est également possible de prévoir des valeurs de paramètres par défaut dans une fonction dans le cas où l'utilisateur ne les donnerait pas. Cela se fait en affectant la valeur au paramètre en argument de la fonction :
def fonction(param1=valdef1, param2=valdef2, ...):

Le paramètre n n'a pas de valeur par défaut :
def table1(n):
    i = 1
    while i<=10:
        print(str(n*i), end=" ")
        i = i + 1
Le paramètre n a 2 pour valeur par défaut :
def table2(n=2):
    i = 1
    while i<=10:
        print(str(n*i), end=" ")
        i = i + 1
Mémorisation 0x - Réussite 0/0
Écrire la fonction bonjour. À l'appel de la fonction :
  • si vous indiquez en argument votre nom et votre âge, la fonction doit répondre :
    'Bonjour [votre_nom], vous avez [votre_age] ans.'.
  • Si vous n'indiquez pas votre nom, elle doit répondre :
    'Bonjour inconnu, … … '.
  • Si vous n'indiquez pas votre âge, elle doit répondre :
    '… … Quel âge avez-vous ?'
def bonjour(nom="", age=-1): if nom != "" : ph = "Bonjour " + nom else: ph = "Bonjour inconnu" if age !=-1: ph += ", vous avez " + str(age) + " ans." else: ph += ". Quel âge avez-vous ?" # += est une abréviation de ... = ... + .... return ph

Modularité

L'importation des modules se fait toujours en dehors des fonctions, et généralement en début de script.

L'intérêt que présentent l'utilisation des fonctions est de créer des modules entiers regroupant un ensemble de fonctions. Derrière ce terme se cache tout simplement le fait qu'une fonction puisse être écrite dans un fichier et être utilisée dans un autre fichier distinct : le programme est alors découpé en plusieurs modules. Pour utiliser une fonction présente dans un autre fichier, il est nécessaire d'importer cette fonction, ce que vous savez réaliser avec l'instruction fromimport..

Exemple : Une fonction appelée fonction est écrite dans un fichier appelé fichier.py. Pour rendre cette fonction disponible dans un script, on rentrera au début du script l'instruction : from fichier import fonction.
Alternativement, en entrant from fichier import *, on exécute l'ensemble du code présent dans le fichier ce qui rend disponible toutes les fonctions qui y sont définies.

Remarques :
  • Il est indispensable que les deux fichiers soient dans le même répertoire.
  • Insérer la ligne de pseudo-code en toute première ligne de vos scripts pour gérer convenablement les caractères UTF-8 :
    # -*- coding: utf-8 -*-
Mémorisation 0x - Réussite 0/0
Associer chaque fonction à son module :
math
random
Placer tous les éléments dans les bons groupes.

Portée des variables

Une fonction est un objet à part et possèdent leur propre domaine de noms de variables (namespace). Toutes les variables définies à l'intérieur d'une fonction n'existent qu'à l'intérieur de celle-ci, on dit que ces variables sont locales. Pour pouvoir utiliser dans une fonction, une variable définie à l'extérieur de celle-ci, dans le domaine de noms principal, il faut rendre cette variable globale grâce au mot-clé python global. Elle peut alors être appelée et modifiée dans la fonction.

Même si cette technique peut être pratique, elle peut être source d'erreur en modifiant des valeurs de variables qui n'aurait pas dû l'être. Il sera préférable de passer les valeurs dont la fonction à besoin, en arguments, quitte à modifier ensuite la variable d'origine par un retour de la fonction (avec return).

Les espaces de noms liés aux variables locales et aux variables globales peuvent être consultés avec les instructions locals() et globals.
30s Mémorisation 0x - Réussite 0/0

Fonctions récursives

De la même façon qu'une fonction peut appeler une autre fonction, il est également possible de faire en sorte qu'une fonction s'appelle elle-même. C'est ce qu'on appelle une fonction récursive : elle contient un appel récursif.
En mathématique, la récursivité est une démarche faisant référence à l'objet même de cette démarche, ce qui se résume souvent en informatique par l'aphorisme humoristique :
« Pour comprendre la récursivité il faut d'abord comprendre la récursivité ».

La récursivité intervient dans de nombreux domaines. Elle permet notamment de dessiner des fractales. La nature également utilise des algorithmes récursifs comme on peut le voir dans le chou romanesco.

chou romanesco
Un chou récursif : le chou romanesco (image Wikipédia)

Étudions la structure générale d'une fonction récursive simple :

def fct(n):
    if n == 0:
        return 2 # valeur de fct(0)
    else:
        return 2 + fct(n-1)

Les lignes 2 et 3 définissent le cas trivial qui permet d'arrêter la récursivité, c'est à dire la condition d'arrêt, tandis que les lignes 4 et 5 concernent le cas récursif, qui appelle la fonction en modifiant la valeur de l'argument afin, qu'à un moment donné, on tombe sur le cas trivial.

En suivant l'algorithme ci-dessus, on constate que l'appel fct(3) renvoie 2 + fct(2) qui a besoin du retour de fct(2) pour continuer et ainsi de suite. Cela crée une pile d'appels récursifs telle que :

fct(3) = 2 + fct(2)
       = 2 + (2 + fct(1))               # on empile les appels récursifs
       = 2 + (2 + (2 + fct(0)))         # fct(0) renvoie une valeur ...
       = 2 + (2 + (2 + 2))              # ... donc Python peut remonter la pile ...
       = 8                              # ... et arriver au résultat à renvoyer

Le moteur python ne permet pas d'empiler les appels récursifs en trop grand nombre lorsque cela demande beaucoup de ressources mémoire. Si la pile est trop grande et que la capacité en mémoire de l'ordinateur est dépassée, celle-ci déborde et le message d'erreur StackOverflow (ou dépassement de pile) s'affiche.

30s Mémorisation 0x - Réussite 0/0