- Introduction
- Le mode interactif
- Variables et affectations
- Programmation et fonctions
- Structure conditionnelle
- Boucles non bornées
- Les listes
- Boucles bornées
- Lire et écrire dans un fichier
- Application en SNT (en seconde)
Introduction au langage Python
Construire une liste
On peut générer une liste de lettres à partir d'une chaine de caractères, car ce sont des structures semblables (indexées, ordonnées...) :
>>> list('aeiou')
['a', 'e', 'i', 'o', 'u']
Pour générer une séquence d'entiers, il existe une fonction dédiée : range
Avec un seul argument entier, elle génère les entiers entre 0 inclus et cet entier exclu.
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Avec 2 arguments entiers, elle génère les entiers entre le premier inclus et le second exclu.
>>> list(range(5,10))
[5, 6, 7, 8, 9]
Avec 3 arguments entiers, le troisième impose l'intervalle entre chaque entier généré.
>>> list(range(5,10,2))
[5, 7, 9]
Exercice Construire les listes suivantes à l'aide des fonctions list
et range
.
>>> list(range(...))
[0, 3, 6, 9, 12, 15, 18]
>>> list(range(...))
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Même si elle commence à 0, il faut l'indiquer pour avoir accès au troisième paramètre.
>>> list(range(0,20,3))
[0, 3, 6, 9, 12, 15, 18]
On peut utiliser des entiers négatifs.
>>> list(range(9,-1,-1))
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Exercice Construire la liste des indices d'une liste donnée :
>>> lettres = list('Bonjour')
>>> ...
[0, 1, 2, 3, 4, 5, 6]
>>> lettres = list('Bonjour')
>>> list(range(len(lettres)))
[0, 1, 2, 3, 4, 5, 6]
Lire chaque valeur d'une liste
Si l'on souhaite lire, une par une, chaque valeur d'une liste, on peut utiliser une boucle, comme vue précédemment :
liste = ['Ligne 1', 'Ligne 2', 'Ligne 3']
i = 0
while i<len(liste) :
print(liste[i])
i = i+1
Comme c'est une opération très souvent utilisée, il existe une autre boucle, dédiée à cette usage : la boucle pour.
for valeur in ['Ligne 1', 'Ligne 2', 'Ligne 3'] :
print(valeur)
- Point fort : plus besoin de s'occuper des indices, la boucle passe d'une valeur à la suivante.
- Point faible : on passe par une variable intermédiaire (
valeur
). On ne sait plus à quel indice on est, donc on ne peut pas faire de modification de la valeur.
Exercice Écrire une fonction de paramètre un entier et qui renvoie la liste des carrés parfaits compris entre 0 (inclus) et cet entier (exclu).
def carre(n):
""" renvoie la liste des carrés parfaits entre 0 et n (exclu). """
liste = []
for valeur in range(n): # Pas besoin de la fonction list ici
liste.append(valeur**2)
return liste
assert carre(3)==[0, 1, 4], "carre(3) doit renvoyer [0, 1, 4]"
Exercice Écrire une fonction qui calcule la moyenne des valeurs (supposées numériques) d’une liste.
>>> moyenne([10, 11, 12, 16])
12.25
def moyenne(liste):
""" Renvoie la moyenne des valeurs de liste """
somme = 0
for valeur in liste :
somme = somme + valeur
return somme/len(liste)
Modifier chaque valeur d'une liste
Si l'on souhaite modifier, une par une, chaque valeur d'une liste, il suffit de la parcourir à partir de sa liste d'indices :
liste = ['Ligne 1', 'Ligne 2', 'Ligne 3']
for indice in range(len(liste)) :
liste[indice] = 'Ligne modifiée '+str(indice)
Exercice Écrire une fonction qui remplace chaque valeur entière d'une liste passée en paramètre, par son carré.
def carre(liste):
""" Passe toutes les valeurs de liste au carré. """
for i in range(len(liste)):
liste[i] = liste[i]**2
Il faut faire très attention à ce genre de fonction. Comme il n'y a aucun retour, il semble que rien ne se soit passé, mais les valeurs de la liste auront bel et bien été modifiées !
On ne peut, normalement, pas modifier la valeur d'une variable définie en dehors d'une fonction :
a = [1, 2, 3]
def test(x):
""" Les paramètres sont modifiables : pas les arguments. """
# b = a # ERREUR : a n'existe pas dans la fonction
a = [0] # CORRECT : mais rien à voir avec le a extérieur à la fonction
x = [0] # CORRECT : mais ne change pas la variable a de l'appel
test(a)
print(a) # Affiche [1, 2, 3] : la fonction n'a rien changé.
Mais quand il s'agit d'une structure de données, comme une liste, le paramètre peut être utilisé pour obtenir la variable correspondante à une de ses données. Cette variable est alors modifiable, ce qui modifie bien quelque chose à l'extérieur de la fonction.
a = [1, 2, 3]
def test(x):
""" Les paramètres sont modifiables : pas les arguments. """
x[0] = 7 # CORRECT : x permet d'accéder à la variable x[0]
test(a)
print(a) # Affiche [7, 2, 3] (La fonction a bien modifié a)
Boucles bornées
On utilise une boucle bornée, quand on sait d'avance combien d'itérations sont à faire (tout un tableau, toutes les lettres d'une chaine de caractères, toutes les lignes d'un fichier ...). En python la boucle for
permet de le faire en fournissant directement l'objet sur lequel itérer:
for element in iterateur:
traitement(element)
En l'absence de structure de donnée, on utilise la fonction range
pour numéroter chaque itération.
for i in range(5): # i est souvent utilisé pour "indice"
itération_numero(i) # Exécuté 5 fois (i = 0, 1, 2, 3 puis 4)
Exercice Écrire une fonction, de paramètre une chaine de caractères, qui renvoie la même chaine de caractères dans laquelle chaque voyelle a été remplacée par une étoile.
>>> etoilev('minuscule')
'm*n*sc*l*'
def etoilev(mot):
""" renvoie une chaine de caractère, copie de mot,
dans laquelle chaque voyelle a été remplacée par une étoile. """
voyelle = set('aeiouy') # list('aeiouy') aussi bien
reponse = ''
for lettre in mot :
if lettre in voyelle :
lettre = '*' # Peut être dangereux
reponse = reponse + lettre
return reponse
assert etoilev('minuscule')=='m*n*sc*l*', 'minuscule ne passe pas'
Pour s'entraîner
>>> triangle_gauche(7) * ** *** **** ***** ****** *******
>>> triangle_droite(3) * ** ***
>>> triangle_centre(5) * *** ***** ******* *********
>>> triangle_noel(6) * * * * * * * * * * * * * * * * * * * * *
from random import choice
# Mots trouvés sur https://www.carredebaudouin.fr/mot-complique-pendu/
MOT = ['ACAJOU', 'ALEPHS', 'AZIMUT', 'BASSON', 'BURINE', 'CAIMAN', 'CERCLE',
'COCCYX', 'CORNEE', 'FAUCON', 'GOSPEL', 'GUENON', 'HORMIS', 'MENTHE',
'MULARD', 'NOTAIS', 'NOUAIS', 'PAGINE', 'PONTIL', 'SABORD', 'SEISME',
'WHISKY', 'YANKEE', 'ZIPPER']
def pendu(etape):
return [r"""
───────""",r"""
│
│
│
│
│
───┴───
""",r""" ┌───
│
│
│
│
│
───┴───""",r""" ┌───┐
│ │
│
│
│
│
───┴───""",r""" ┌───┐
│ │
│ O
│
│
│
───┴───""",r""" ┌───┐
│ │
│ O
│ │
│
│
───┴───""",r""" ┌───┐
│ │
│ O
│ /│
│
│
───┴───""",r""" ┌───┐
│ │
│ O
│ /│\
│
│
───┴───""",r""" ┌───┐
│ │
│ O
│ /│\
│ /
│
───┴───""",r""" ┌───┐
│ │
│ O
│ /│\
│ / \
│
───┴───"""][etape]
# Tests :
print(choice(MOT))
print(pendu(5))