- Apprendre
- Informatique et numérique
- Programmation
- Python : variables, boucles, fonctions et fichiers
- Listes et tuples en Python
Listes et tuples en Python
sort(), sorted() et les fonctions clés.DébutantUnité 6 sur 10 de la formation Formation : Python : variables, boucles, fonctions et fichiers
Ce que tu vas apprendre
- Créer des listes, lire des éléments et des tranches par indice, puis combiner et résumer des listes avec les opérateurs et les fonctions natives de Python.
- Créer une liste et lire ses éléments par indiceÉcrire des littéraux de liste, construire des listes avec list(), mesurer leur longueur avec len(), lire des éléments avec des indices positifs et négatifs et tester l’appartenance avec in.
- Extraire une tranche d’une listeExtraire une partie d’une liste avec des tranches début:fin:pas, prévoir le résultat lorsque des valeurs sont omises, négatives ou hors limites, et distinguer une tranche d’un élément unique.
- Combiner et résumer des listes avec des opérateurs et des fonctions nativesConcaténer et répéter des listes avec + et *, comparer des listes, calculer des totaux, des valeurs extrêmes et des moyennes avec sum(), min() et max(), et convertir des chaînes en listes et inversement.
- Créer une liste et lire ses éléments par indice
- Ajouter, insérer, supprimer, trouver et remplacer des éléments dans une liste, et utiliser correctement l’effet et la valeur de retour de chaque méthode.
- Ajouter et supprimer des élémentsAgrandir et réduire une liste avec append(), extend(), insert(), pop(), remove(), del et clear(), et distinguer leurs effets et leurs valeurs de retour.
- Trouver, compter et remplacer des élémentsLocaliser des valeurs avec index(), count() et in, puis remplacer des éléments ou des parties entières par affectation à un indice ou à une tranche.
- Ajouter et supprimer des éléments
- Parcourir tous les éléments d’une liste avec des boucles, appliquer des schémas de comptage, de totalisation, de recherche, de filtrage et de transformation, et utiliser des listes de listes comme tableaux.
- Parcourir les éléments et leurs positionsChoisir entre parcourir les éléments, les indices avec range(len()), ou les deux avec enumerate() et zip(), et modifier une liste sans risque pendant son traitement.
- Appliquer les schémas classiques de traitement de listesTotaliser, compter, trouver les valeurs extrêmes, rechercher, filtrer et transformer les éléments d’une liste avec des boucles, et reconnaître quand une fonction native effectue la même tâche.
- Manipuler des listes imbriquéesStocker un tableau sous forme de liste de lignes, lire et modifier des cellules avec deux indices, et parcourir chaque cellule avec des boucles imbriquées.
- Parcourir les éléments et leurs positions
- Stocker des groupes fixes de valeurs dans des tuples, décider quand un tuple convient mieux qu’une liste et dépaqueter des séquences dans des variables distinctes.
- Créer des tuples et choisir entre tuples et listesÉcrire des tuples, y compris des tuples vides et à un élément, les lire par indice et par tranche, et expliquer ce que leur immuabilité permet et interdit.
- Empaqueter et dépaqueter des valeursAffecter simultanément plusieurs variables à partir d’un tuple ou d’une liste, échanger deux valeurs, recueillir les valeurs restantes avec un nom étoilé et renvoyer plusieurs valeurs depuis une fonction.
- Créer des tuples et choisir entre tuples et listes
- Prévoir comment une modification effectuée par une variable apparaît dans d’autres, copier des listes lorsqu’une indépendance est nécessaire et passer des listes à des fonctions sans surprise.
- Distinguer les noms, les objets et les aliasExpliquer que les variables font référence à des objets, reconnaître quand deux noms partagent une liste, et distinguer l’identité (is) de l’égalité (==), ainsi que la mutation de la nouvelle liaison.
- Copier des listes en évitant les listes internes partagéesCréer une copie indépendante avec une tranche, list() ou copy(), reconnaître quand une copie superficielle partage encore des listes imbriquées et utiliser une copie profonde lorsqu’elle ne doit pas les partager.
- Passer des listes à des fonctions et les renvoyerPrévoir quand une fonction modifie la liste de l’appelant, choisir entre modifier une liste en place et en renvoyer une nouvelle, et éviter un argument par défaut mutable.
- Distinguer les noms, les objets et les alias
- Mettre des données en ordre avec sort() et sorted(), par ordre croissant ou décroissant, et contrôler l’ordre avec des fonctions clés et la comparaison des tuples.
- Trier avec sort() et sorted()Choisir entre trier une liste en place et créer une copie triée, trier par ordre décroissant, distinguer l’inversion du tri et prévoir l’ordre des nombres et des chaînes.
- Trier selon une clé et trier des enregistrementsTrier selon une clé calculée, comme la longueur ou le texte en minuscules, trier des listes de tuples selon un ou plusieurs champs et utiliser le fait que le tri de Python est stable.
- Trier avec sort() et sorted()
Listes et tuples en Python : cours
1Créer et lire des listes
Une liste donne à un programme un endroit où conserver une collection ordonnée, comme des notes ou des noms. Ses positions permettent d’accéder à un élément précis, tandis que les tranches permettent de sélectionner une suite d’éléments ou de les parcourir selon un pas. Créer, lire et combiner des listes produit plusieurs types de résultats : un élément, une nouvelle liste, un nombre ou une chaîne. Suivre ces résultats aide à choisir l’opération suivante et à repérer une erreur de borne.
1.1 Créer une liste et lire une position
Une liste conserve des valeurs dans un ordre choisi. Écris les éléments entre crochets, séparés par des virgules. Chaque élément a une position : des valeurs répétées occupent donc des places distinctes.
Construire une liste et mesurer sa longueur
scores = [88, 92, 75]
print(scores)
print(len(scores))
Sortie :
[88, 92, 75]
3
len() compte les éléments, et non la plus grande valeur ou la dernière position. Les listes peuvent contenir des types différents, comme dans [3, "three", 3.0, True], même si regrouper des données liées facilite généralement leur traitement. [] et list() créent tous deux une liste vide. Sa longueur est 0 et elle peut grandir à mesure que le programme recueille des valeurs.
list() peut aussi recueillir les éléments d’un itérable, un objet qu’une boucle for peut parcourir. list(range(4)) donne [0, 1, 2, 3]. list("cat") donne ['c', 'a', 't'] : la chaîne fournit un caractère à la fois. Le résultat est une nouvelle liste.
Compter les positions à partir de zéro
Un indice désigne une position. Python commence à 0 : les trois notes ont donc les indices 0, 1 et 2.
| Expression | Résultat | Position |
|---|---|---|
scores[0] | 88 | Première |
scores[1] | 92 | Deuxième |
scores[2] | 75 | Troisième |
scores[-1] | 75 | Dernière |
scores[-2] | 92 | Avant-dernière |
scores[-3] | 88 | Troisième en partant de la fin |
Les indices négatifs se comptent à rebours depuis la fin. Pour une liste de longueur n, les indices valides vont de -n à n - 1. Le dernier élément est scores[len(scores) - 1], ou plus simplement scores[-1]. -0 vaut toujours 0 ; il ne désigne pas la dernière position.
Reconnaître un indice invalide
scores[3] lève IndexError car il n’existe pas de quatrième élément. scores[len(scores)] commet la même erreur : le nombre d’éléments dépasse d’une unité le dernier indice positif ou nul. Une liste vide n’a aucun indice d’élément valide, pas même -1.
Un indice de liste doit être un entier, et non un flottant. scores[1.0] lève TypeError, même si 1,0 a une valeur entière. / produit un flottant, donc scores[len(scores) / 2] échoue aussi. Avec cette liste de trois éléments, len(scores) // 2 produit l’entier 1, et scores[1] vaut 92.
Vérifier si une valeur est présente
Le test d’appartenance vérifie les valeurs, pas les positions :
colors = ["red", "green"]
print("green" in colors)
print("Green" in colors)
print("blue" not in colors)
Sortie :
True
False
True
in et not in renvoient des valeurs booléennes et fonctionnent aussi sur les listes vides. La comparaison des chaînes est sensible à la casse : "Green" et "green" ne correspondent donc pas. Un test d’appartenance est utile avant une opération qui exige la présence d’une valeur, comme sa suppression ou la recherche de sa position.
Points clés
- Les listes conservent l’ordre et peuvent contenir des valeurs répétées.
len(values)compte les éléments ; le dernier indice positif ou nul estlen(values) - 1.- Les indices négatifs se comptent depuis la fin, à partir de
-1. - Un indice d’élément invalide lève
IndexError; un indice flottant lèveTypeError. inteste si une valeur égale est présente dans la liste.
1.2 Extraire une tranche d’une séquence
Une tranche sélectionne une suite d’éléments et renvoie une nouvelle séquence. Pour une liste, le résultat est une autre liste, même lorsqu’elle ne contient qu’un élément ou aucun.
Inclure le début et exclure la fin
letters = ["a", "b", "c", "d", "e", "f"]
print(letters[1:4])
Sortie :
['b', 'c', 'd']
Les positions sélectionnées sont 1, 2 et 3. La position 4 est la borne de fin, donc 'e' est exclu. Avec un pas de 1 et des bornes qui vérifient 0 <= start <= stop <= len(letters), le nombre d’éléments sélectionnés est stop - start. Ici, il vaut 3. letters[4:2] donne [], car une tranche parcourue vers l’avant ne peut pas atteindre une fin située avant son début.
Omettre une borne
| Tranche | Signification | Résultat |
|---|---|---|
letters[:2] | Deux premiers éléments | ['a', 'b'] |
letters[4:] | De la position 4 à la fin | ['e', 'f'] |
letters[:] | Tous les éléments dans une nouvelle liste | ['a', 'b', 'c', 'd', 'e', 'f'] |
letters[-2:] | Deux derniers éléments | ['e', 'f'] |
letters[:-1] | Tous sauf le dernier | ['a', 'b', 'c', 'd', 'e'] |
Les bornes négatives se comptent depuis la fin, comme les indices négatifs. letters[:n] et letters[n:] divisent la liste à une même borne. Concaténer ces deux tranches reconstitue son contenu dans l’ordre d’origine.
Contrôler le pas
La forme complète est values[start:stop:step]. Un pas de 2 sélectionne une position, en saute une et sélectionne la suivante. letters[::2] donne ['a', 'c', 'e'], tandis que letters[1::2] donne ['b', 'd', 'f'].
Un pas négatif revient en arrière. letters[::-1] part du dernier élément et produit ['f', 'e', 'd', 'c', 'b', 'a']. Pour une tranche bornée parcourue à rebours, letters[4:1:-1] visite les indices 4, 3 et 2, ce qui donne ['e', 'd', 'c'] ; la fin reste exclue. Un pas de 0 lève ValueError car il ne permet pas de passer à une autre position.
Distinguer une borne d’une position
Les bornes d’une tranche peuvent dépasser l’une ou l’autre extrémité. Python les ramène aux extrémités : letters[4:100] vaut ['e', 'f'] et letters[10:] vaut []. Ces tranches ne lèvent pas IndexError. La lecture de l’élément unique letters[10] le fait.
letters[2] est la chaîne 'c'. letters[2:3] est la liste ['c']. Les deux-points changent la nature du résultat, ce qui compte lorsque le code suivant attend une chaîne ou une liste.
Utiliser le résultat
Après first_three = letters[:3], l’affectation first_three[0] = "z" ne modifie que cette nouvelle liste externe ; letters[0] reste égal à 'a'. Une tranche complète est une copie superficielle : les éléments mutables imbriqués peuvent donc rester partagés.
Les chaînes et les tuples suivent les mêmes règles de bornes et de pas. Le résultat conserve le type de la séquence d’origine : "python"[1:4] donne 'yth', et (10, 20, 30)[1:] donne (20, 30).
Points clés
- Une tranche inclut son début et exclut sa fin.
- Les bornes omises sélectionnent les éléments jusqu’à l’extrémité correspondante de la séquence.
- Le pas contrôle la direction et l’espacement ; zéro est invalide.
- Les bornes de tranche hors limites sont ramenées aux extrémités.
- L’accès à un élément renvoie un élément ; une tranche renvoie une séquence.
- Une tranche de liste crée une nouvelle liste externe.
1.3 Combiner des valeurs et calculer des indicateurs
Les listes prennent en charge des opérateurs pour construire des séquences et des fonctions pour résumer leurs valeurs. Vérifie si une opération crée une nouvelle liste, produit un nombre ou renvoie du texte : ces résultats ont des usages différents.
Concaténer ou répéter des listes
+ concatène deux listes et crée une nouvelle liste. [1, 2] + [3] donne [1, 2, 3] sans modifier les listes de départ. Les deux opérandes doivent être des listes : [1, 2] + 3 lève TypeError. Place une valeur supplémentaire seule dans une liste à un élément lorsque tu utilises +.
* répète la séquence. [0] * 4 donne [0, 0, 0, 0], et ["ab", "cd"] * 2 donne ['ab', 'cd', 'ab', 'cd']. L’opérateur répète les éléments, pas les caractères de chaque chaîne. Un nombre de répétitions nul ou négatif donne []. counts = [0] * 7 fournit sept compteurs initiaux. Répéter une liste interne la partage entre plusieurs positions, ce qui compte lorsque ces lignes sont modifiées par la suite.
Total, valeurs extrêmes et moyenne
| Expression | Résultat |
|---|---|
sum([4, 8, 15]) | 27 |
min([4, 8, 15]) | 4 |
max([4, 8, 15]) | 15 |
sum([]) | 0 |
sum() additionne des nombres. Cette fonction ne concatène pas les chaînes ; sum(["a", "b"]) lève TypeError. min() et max() trouvent les plus petits et les plus grands éléments, qui doivent donc pouvoir être comparés entre eux. Les listes composées uniquement de chaînes fonctionnent : max(["pear", "apple"]) donne 'pear' selon l’ordre caractère par caractère. Une liste vide n’a ni minimum ni maximum et lève ValueError pour chacun de ces appels.
La moyenne est le total divisé par le nombre d’éléments :
temps = [18.5, 21.0, 19.5, 23.0]
if temps:
total = sum(temps)
mean = total / len(temps)
print(total, mean)
Sortie :
82.0 20.5
La condition fonctionne parce que les listes vides sont considérées comme fausses et les listes non vides comme vraies. Sans cette condition de garde, calculer la moyenne de [] diviserait par zéro et lèverait ZeroDivisionError. Choisis ce que le programme doit faire lorsqu’il n’existe aucune mesure, par exemple renvoyer None.
Comparer des séquences dans l’ordre
== vérifie que les éléments aux mêmes positions sont égaux. [1, 2, 3] == [1, 2, 3] vaut True ; [1, 2, 3] == [3, 2, 1] vaut False.
Pour < et >, compare les éléments depuis la gauche et arrête-toi à la première paire inégale. [2, 9] < [3, 0] vaut True car 2 est inférieur à 3. Les valeurs 9 et 0 ne décident de rien. Lorsqu’une liste constitue le début d’une autre, la plus courte vient en premier : [2] < [2, 0] vaut True.
Passer du texte aux listes et inversement
colors = "red,green,blue".split(",")
print(colors)
print(", ".join(["red", "green"]))
Sortie :
['red', 'green', 'blue']
red, green
split() découpe une chaîne à son séparateur. join() est appelée sur le séparateur et le place entre les chaînes fournies. Chaque élément doit être une chaîne. Pour assembler des nombres, construis d’abord une liste de leurs résultats obtenus avec str() ; passer directement [1, 2] à join() lève TypeError.
Points clés
+concatène des listes ;*répète leur séquence d’éléments.sum,minetmaxproduisent des valeurs récapitulatives.- Prévois une condition de garde pour une liste vide avant de calculer une moyenne ou une valeur extrême.
- La comparaison de séquences utilise l’ordre des éléments et la première paire inégale.
splitcrée des morceaux de texte ;joinappelé sur un séparateur assemble des chaînes.
2Modifier une liste
Une liste de courses s’allonge, une file perd son premier élément et un prix enregistré doit être corrigé. Python fournit des méthodes de liste et l’affectation pour effectuer ces changements. Le choix dépend de ce que tu connais, une valeur ou une position, du nombre d’éléments concernés et de ton besoin éventuel de conserver un élément retiré. Faire attention à la valeur de retour d’une méthode évite qu’une modification de la liste ne remplace accidentellement son nom par None.
2.1 Ajouter et supprimer des éléments d’une liste
Les listes sont mutables : un programme peut modifier leur contenu après leur création. Une méthode appartient à un objet et s’appelle avec un point, comme dans cart.append("eggs"). Son effet sur la liste et sa valeur de retour sont deux choses distinctes.
Ajouter un ou plusieurs éléments
cart = ["milk"]
cart.append("eggs")
cart.extend(["tea", "jam"])
print(cart)
Sortie :
['milk', 'eggs', 'tea', 'jam']
append(x) ajoute exactement un élément à la fin. Si x est une liste, cette liste entière devient un seul élément imbriqué. En partant de ['milk', 'eggs'], cart.append(["tea", "jam"]) produit ['milk', 'eggs', ['tea', 'jam']], de longueur 3.
extend(iterable) ajoute séparément les éléments fournis par l’itérable. Ajouter les éléments de ["tea", "jam"] porte la longueur du panier à 4. Avec "ab", les caractères 'a' et 'b' sont ajoutés séparément ; ajoute la chaîne comme un seul élément pour conserver 'ab'.
insert(i, x) ajoute un élément avant la position actuelle i. Après nums = [10, 30] et nums.insert(1, 20), la liste vaut [10, 20, 30]. Les éléments suivants sont décalés vers la droite. insert(0, x) ajoute au début ; un indice au-delà de la fin ajoute l’élément à la fin sans erreur d’indice.
Supprimer par position ou par valeur
| Opération | Utilise | Renvoie |
|---|---|---|
items.pop() | Dernière position | Élément retiré |
items.pop(i) | Position i | Élément retiré |
items.remove(x) | Première valeur égale à x | None |
del items[i] | Position i | Aucune valeur de retour |
del items[start:stop] | Tranche de positions | Aucune valeur de retour |
items.clear() | Liste entière | None |
Avec nums = [10, 20, 30], last = nums.pop() sauvegarde 30 et laisse [10, 20]. nums.pop(0) renvoie ensuite 10 et laisse [20]. Une liste vide ou une position invalide conduit pop() à lever IndexError.
remove() prend une valeur. Avec pets = ["cat", "dog", "cat"], pets.remove("cat") laisse ['dog', 'cat']. Seule la première occurrence disparaît. Si la valeur est absente, remove() lève ValueError. Utilise un test d’appartenance lorsqu’elle risque d’être absente. Pour supprimer toutes les occurrences de 'cat', utilise :
while "cat" in pets:
pets.remove("cat")
Avec [5, 0, 7], remove(0) supprime la valeur 0 et laisse [5, 7] ; pop(0) retire la valeur à la position 0, ce qui donne [0, 7]. Le sens de l’argument détermine la méthode à choisir.
del peut supprimer une partie : à partir de [5, 6, 7, 8], del nums[1] laisse [5, 7, 8], puis del nums[0:2] laisse [8]. clear() laisse la liste existante vide.
Bien distinguer la valeur de retour
append, extend, insert, remove et clear renvoient None. Écris cart.append("tea") seul sur sa ligne. Écrire cart = cart.append("tea") fait référence à None avec cart ; un appel ultérieur à cart.append("jam") lève AttributeError. Ne sauvegarde le résultat d’une méthode que lorsqu’il fournit une valeur dont le programme a besoin, comme le fait last = cart.pop().
Points clés
appendajoute un élément ;extendajoute chaque élément fourni.insertajoute un élément avant une position et décale les éléments suivants.popretire un élément par sa position et le renvoie.removesupprime la première valeur égale et échoue si elle est absente.delsupprime des éléments par position ou par tranche ;clearvide la même liste.- Des méthodes comme
appendrenvoientNone: n’affecte donc pas ce résultat au nom de la liste.
2.2 Trouver des valeurs et remplacer des éléments
Trouver une valeur, la compter et la remplacer sont des opérations différentes. Utilise un test d’appartenance lorsque tu as besoin d’une réponse par oui ou par non, une méthode de recherche lorsque tu as besoin d’une position et une affectation lorsque tu veux modifier la liste.
Trouver la première position correspondante
days = ["Mon", "Tue", "Wed", "Tue"]
print(days.index("Tue"))
print(days.index("Tue", 2))
print(days.count("Tue"))
print(days.count("Sun"))
Sortie :
1
3
2
0
index(x) renvoie la première position qui contient une valeur égale à x. Son argument de début facultatif indique à Python où commencer la recherche. days.index("Tue", 2) ignore la correspondance à la position 1 et trouve celle de la position 3. Le résultat reste un indice dans toute la liste, et non un décompte depuis le nouveau point de départ.
index() lève ValueError lorsque la valeur est absente. Les listes n’ont pas de méthode find() qui renvoie -1. Si une valeur risque d’être absente, teste d’abord son appartenance :
if "Sun" in days:
position = days.index("Sun")
print(position)
Ce code n’affiche rien car 'Sun' est absent. count(x) peut être utilisé sans cette condition de garde : la méthode renvoie 0 lorsqu’il n’y a aucune correspondance. Ces opérations utilisent l’égalité, donc [1, 2.0].count(2) vaut 1. Le texte reste sensible à la casse : 'tue' n’est pas égal à 'Tue'.
Remplacer un élément existant
prices = [4.5, 3.0, 7.25]
prices[1] = 3.5
print(prices)
Sortie :
[4.5, 3.5, 7.25]
L’ancienne deuxième valeur est écrasée et la longueur reste 3. L’indice doit exister : prices[3] = 1.0 lève IndexError. Pour ajouter à la fin, utilise append().
| Instruction | Effet sur [10, 20] |
|---|---|
nums[0] = 99 | [99, 20] |
nums.insert(0, 99) | [99, 10, 20] |
Le remplacement utilise un emplacement existant. L’insertion crée un emplacement supplémentaire avant la position sélectionnée.
Remplacer une partie par affectation de tranche
nums = [1, 2, 3, 4, 5]
nums[1:3] = [20, 30, 40]
print(nums)
nums[0:2] = []
print(nums)
Sortie :
[1, 20, 30, 40, 4, 5]
[30, 40, 4, 5]
La première affectation remplace les deux éléments d’indices 1 et 2 par trois nouveaux éléments, ce qui augmente la longueur de la liste d’une unité. Une tranche contiguë ordinaire peut être remplacée par une séquence plus courte ou plus longue. Affecter [] supprime la partie sélectionnée. Cette opération modifie la liste d’origine ; elle diffère de la lecture d’une tranche dans une nouvelle variable.
Modifier du texte en construisant un nouveau texte
Une chaîne est immuable, donc word = "cat" suivi de word[0] = "b" lève TypeError. Construis une nouvelle chaîne avec word = "b" + word[1:], ou crée une liste de caractères, modifie-la et assemble-la :
letters = list("cat")
letters[0] = "b"
word = "".join(letters)
print(word)
Sortie :
bat
Points clés
indexrenvoie la première position correspondante et lèveValueErrorsi la valeur est absente.countrenvoie le nombre d’éléments égaux, y compris zéro.- L’affectation d’élément remplace un emplacement qui existe déjà.
- L’affectation à une tranche contiguë peut modifier la longueur d’une liste.
- Les chaînes doivent être reconstruites au lieu d’être modifiées par affectation d’élément.
3Traiter des listes avec des boucles
Les boucles transforment une collection stockée en résultats utiles : un total, une position correspondante, une liste filtrée ou un tableau modifié. Chaque tâche commence par le choix de ce qu’il faut conserver au fil de la boucle et des informations dont elle a besoin pour chaque élément. Certaines tâches n’ont besoin que des valeurs, d’autres ont besoin des positions ou d’enregistrements associés. Les listes imbriquées ajoutent un niveau à suivre : traiter un tableau consiste donc à parcourir ses lignes, puis leurs cellules.
3.1 Parcourir les éléments et les positions
Une boucle peut utiliser les valeurs d’une liste, leurs positions ou les deux. Choisis la forme qui fournit ce dont le corps de la boucle a besoin. Pour modifier la liste, vérifie aussi si l’instruction modifie un élément ou crée simplement une nouvelle liaison pour un nom local.
Utiliser directement les éléments
for name in ["Ana", "Ben"]:
print("Hi", name)
Sortie :
Hi Ana
Hi Ben
La boucle parcourt chaque élément dans l’ordre. À chaque passage, name fait référence à l’élément courant. Affecter une autre valeur à name ne remplace pas cet élément dans la liste. Dans for r in readings: r = 0, seul le nom r change de liaison.
Utiliser les positions pour remplacer des éléments
readings = [3, -1, 4, -5]
for i in range(len(readings)):
if readings[i] < 0:
readings[i] = 0
print(readings)
Sortie :
[3, 0, 4, 0]
range(len(readings)) fournit 0, 1, 2 et 3. À l’indice 1, la condition est vraie, donc l’affectation d’élément remplace -1. À l’indice 3, elle remplace -5. Les mesures positives conservent leurs valeurs. Utiliser range(len(readings) + 1) atteindrait aussi l’indice 4, qui n’existe pas.
Obtenir une position et un élément ensemble
enumerate() fournit des paires. Dépaquette chaque paire dans l’en-tête de la boucle :
for i, name in enumerate(["Ana", "Ben"]):
print(i, name)
Sortie :
0 Ana
1 Ben
enumerate(names, start=1) fournit des numéros à partir de 1 pour un affichage numéroté. Ces numéros ne sont plus les indices de la liste qui commencent à zéro. Pour parcourir la liste du dernier élément au premier sans la modifier, utilise for item in reversed(names):. Pour obtenir les indices à rebours, utilise range(len(names) - 1, -1, -1) ; une liste de trois éléments donne 2, 1, 0.
Associer deux listes
names = ["Ana", "Ben"]
scores = [90, 85]
for name, score in zip(names, scores):
print(name, score)
Sortie :
Ana 90
Ben 85
zip() associe les éléments de même position et s’arrête à la fin de l’entrée la plus courte. Si chaque enregistrement compte, vérifie les longueurs avant de l’utiliser ; sinon, un dernier nom sans correspondance sera ignoré.
Contrôler un indice avec while
Une boucle while a besoin d’un indice de départ, d’une vérification de borne et d’un pas :
i = 0
while i < len(readings):
print(readings[i])
i += 1
Oublier l’incrémentation empêche cette boucle de se terminer. Utiliser <= atteint len(readings) et provoque IndexError.
Éviter de décaler les éléments pendant une boucle for
Supprimer des éléments change la position de ceux qui suivent. Avec [1, 2, 2, 3], retirer chaque 2 rencontré pendant le parcours de cette même liste laisse [1, 2, 3] : le second 2 est décalé à la position qui vient d’être visitée. Parcours nums[:] si les suppressions doivent toucher l’originale, ou construis une nouvelle liste des éléments à conserver. Ajouter des éléments à la liste en cours de parcours peut aussi produire un comportement inattendu.
Points clés
- Utilise une boucle directe pour les éléments,
range(len(...))pour les positions etenumeratepour les deux. - Créer une nouvelle liaison pour la variable de boucle ne remplace pas un élément de la liste.
zips’arrête à la fin de l’entrée la plus courte.reversedparcourt la liste à rebours sans la modifier.- Une boucle
whiledoit faire avancer son indice et s’arrêter avantlen(values). - Construis une nouvelle liste ou parcours une copie lorsque tu supprimes des éléments.
3.2 Construire des totaux, des recherches et de nouvelles listes
De nombreux problèmes sur les listes utilisent quelques schémas de boucle réutilisables. Décide du résultat dont le programme a besoin, initialise-le avant la boucle et mets-le à jour à l’arrivée de chaque élément.
Accumuler un total ou un compte
sales = [120, 75, 205, 50]
total = 0
for sale in sales:
total += sale
print(total)
Sortie :
450
Le total cumulé prend successivement les valeurs 120, 195, 400 et 450. Placer total = 0 dans la boucle effacerait le travail précédent à chaque passage. sum(sales) calcule directement ce total.
Un compteur ajoute 1 pour chaque élément qui satisfait la condition, et non la valeur de cet élément :
scores = [72, 45, 60, 88, 59]
passed = 0
for score in scores:
if score >= 60:
passed += 1
print(passed)
La sortie est 3 : 72, 60 et 88 satisfont la condition. > 60 donnerait 2 car cette condition exclut exactement 60. Fais correspondre la formulation du seuil et la comparaison.
Trouver une valeur extrême
Pour une liste non vide, initialise un maximum courant à partir d’un élément réel :
temps = [-3, -8, -1, -5]
highest = temps[0]
for temp in temps[1:]:
if temp > highest:
highest = temp
print(highest)
La sortie est -1. Partir de 0 conserverait à tort 0 car toutes les mesures sont inférieures. Utilise < pour trouver le minimum, ou utilise les fonctions natives min() et max(). Vérifie que la liste n’est pas vide avant d’accéder à son premier élément.
S’arrêter à la première correspondance
values = [4, 0, -2, 5, -7]
position = -1
for i, value in enumerate(values):
if value < 0:
position = i
break
print(position)
La sortie est 2. -1 est un signal choisi pour indiquer l’absence de correspondance ; ne l’utilise pas comme indice si la recherche a échoué, car c’est aussi un indice valide pour le dernier élément. break conserve la position de la première correspondance. Sans cette instruction, les correspondances suivantes écraseraient le résultat.
x in values recherche une valeur précise, et values.index(x) trouve sa première position. Une condition comme « est négatif » nécessite une recherche fondée sur une condition, comme la boucle ci-dessus.
Filtrer ou transformer
Un filtre conserve certains éléments d’origine :
passing = []
for score in scores:
if score >= 60:
passing.append(score)
print(passing)
La sortie est [72, 60, 88] ; scores conserve ses cinq éléments. Une transformation calcule un nouvel élément à partir de chaque élément d’origine :
nums = []
for text in ["3", "14", "15"]:
nums.append(int(text))
print(nums, sum(nums))
La sortie est [3, 14, 15] 32. La conversion a lieu avant l’addition ; additionner les chaînes d’origine échoue.
Renvoyer un résultat réutilisable
def average(values):
if not values:
return None
return sum(values) / len(values)
average([18.5, 21.0, 19.5, 23.0]) renvoie 20.5. Pour une liste vide, la fonction renvoie None sans diviser par zéro, et elle laisse la liste reçue inchangée.
Points clés
- Initialise un accumulateur avant la boucle.
- Un compteur ajoute 1 par correspondance ; un total additionne des valeurs.
- Initialise une valeur extrême courante à partir d’un élément réel.
- Utilise
breakpour conserver la première correspondance lors d’une recherche. - Le filtrage sélectionne des éléments ; la transformation calcule de nouvelles valeurs.
- Une fonction qui renvoie une valeur permet à l’appelant de conserver un résultat sans modifier l’entrée.
3.3 Lire et traiter un tableau de lignes
Une liste imbriquée est une liste qui contient d’autres listes. Un tableau utilise généralement une liste interne par ligne. Chaque accès sélectionne un niveau : lire une cellule demande donc deux indices.
Sélectionner la ligne, puis la cellule
grid = [[1, 2, 3], [4, 5, 6]]
print(grid[1])
print(grid[1][2])
print(len(grid), len(grid[0]))
Sortie :
[4, 5, 6]
6
2 3
grid[1] sélectionne la deuxième ligne ; [2] sélectionne ensuite le troisième élément de cette ligne. len(grid) compte les lignes, tandis que len(grid[0]) compte les cellules de la première ligne. Ce tableau rectangulaire comporte six cellules. grid[2][1] échoue dès le premier accès car la ligne 2 n’existe pas. Inverser les positions de ligne et de colonne peut sélectionner la mauvaise cellule ou lever IndexError.
Modifier une cellule ou une ligne entière
grid[0][1] = 20 modifie la deuxième cellule de la première ligne et donne [[1, 20, 3], [4, 5, 6]]. grid[0] = [0, 0, 0] remplace toute la première ligne. Le nombre d’accès indique le niveau qui est remplacé.
Parcourir chaque valeur
grid = [[1, 2, 3], [4, 5, 6]]
total = 0
for row in grid:
for value in row:
total += value
print(total)
Sortie :
21
La boucle interne termine la première ligne avant que la boucle externe ne fournisse la deuxième. Elle additionne 1, 2, 3, puis 4, 5, 6. Le total d’une colonne utilise une position fixe dans chaque ligne :
column_total = 0
for row in grid:
column_total += row[1]
print(column_total)
La sortie est 7, obtenue à partir de 2 et 5. Ce code exige que chaque ligne ait un deuxième élément.
Les lignes ne doivent pas nécessairement avoir la même longueur. [[1], [2, 3]] est une liste imbriquée valide. Les boucles imbriquées directes parcourent toujours chaque valeur car chaque boucle interne suit sa propre ligne. Supposer que toutes les lignes ont len(grid[0]) éléments ferait manquer des valeurs ici. Pour compter les cellules d’un tel tableau, additionne len(row) pour chaque ligne.
Construire des lignes indépendantes
table = []
for r in range(3):
table.append([0] * 4)
table[0][0] = 1
print(table)
Sortie :
[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
Chaque passage crée une nouvelle liste de quatre éléments. Le raccourci [[0] * 4] * 3 répète une référence à une même ligne ; modifier sa première cellule apparaîtrait dans les trois lignes.
Stocker des enregistrements
Une ligne peut décrire un enregistrement plutôt qu’une ligne de nombres. Avec students = [["Ana", 90], ["Ben", 85]], students[1][0] vaut 'Ben' et students[1][1] vaut 85. Lorsque chaque enregistrement contient deux éléments, for name, score in students: les dépaquette dans des noms utiles. Des listes de tuples peuvent représenter le même type d’enregistrements.
Points clés
- Deux indices sélectionnent une ligne, puis une cellule de cette ligne.
len(grid)compte les lignes ; leurs longueurs peuvent différer.- Des boucles imbriquées traitent chaque ligne avec sa propre boucle interne.
- L’accès à une colonne exige que cette position existe dans chaque ligne sélectionnée.
- Crée chaque ligne mutable séparément pour éviter les cellules partagées.
4Utiliser les tuples et le dépaquetage
Dans les groupes fixes de valeurs, les positions ont souvent un sens : un point a des coordonnées et un enregistrement de résultat contient un nom et une note. Les tuples gardent ces positions fixes, tandis que le dépaquetage donne à chaque valeur un nom utile. Ces outils expliquent aussi comment une seule affectation peut échanger deux valeurs et comment une fonction peut renvoyer plusieurs résultats. Un tuple externe immuable peut encore contenir une liste modifiable : suis donc à la fois le conteneur et les objets qu’il contient.
4.1 Choisir une liste ou un tuple
Un tuple stocke des éléments dans l’ordre, comme une liste, mais ses éléments ne peuvent pas être remplacés, ajoutés ou supprimés. C’est l’immuabilité. Les tuples conviennent aux groupes fixes comme les coordonnées, les dates et les enregistrements ; les listes conviennent aux collections qui grandissent ou changent.
Créer et lire un tuple
point = (3, 4)
date = (2024, 7, 15)
print(date[0])
print(date[1:])
print(len(date))
Sortie :
2024
(7, 15)
3
L’accès aux tuples par indice, les indices négatifs, les tranches et l’appartenance suivent les mêmes règles que pour les listes. Une tranche de tuple renvoie un tuple. Tu peux parcourir un tuple avec une boucle ou utiliser +, *, min, max, sum, count et index lorsque ses éléments conviennent à l’opération.
La virgule crée un tuple non vide. t = 3, 4 produit (3, 4) même sans parenthèses. Un tuple à un élément a besoin d’une virgule finale :
| Expression | Valeur et type |
|---|---|
(5) | Entier 5 |
(5,) | Tuple à un élément (5,) |
() | Tuple vide |
tuple([1, 2]) | Tuple (1, 2) |
tuple("ab") | Tuple ('a', 'b') |
list(t) convertit les éléments d’un tuple en une liste modifiable.
Comprendre ce qui ne peut pas changer
point[0] = 5 lève TypeError car un tuple ne permet pas l’affectation d’élément. Les tuples n’ont pas les méthodes append, remove ou sort ; point.append(5) lève AttributeError.
Un nom peut toutefois être lié à un nouveau tuple :
point = (3, 4)
point = (5,) + point[1:]
print(point)
La sortie est (5, 4). L’expression crée un nouveau tuple ; elle ne modifie pas l’ancien.
Un tuple peut contenir un élément mutable
t = ([1, 2], "x")
t[0].append(3)
print(t)
Sortie :
([1, 2, 3], 'x')
La première position contient toujours la même liste. Le contenu de cette liste a changé. t[0] = [9] remplacerait l’objet à cette position et est interdit. L’immuabilité du tuple externe ne fige pas une liste interne.
Adapter la structure à son rôle
Utilise (x, y) pour des coordonnées, (255, 128, 0) pour une couleur RVB ou ("Ana", 90) pour un enregistrement à deux champs. Chaque position a un sens particulier. Utilise une liste pour toutes les notes d’une classe ou les articles d’un panier, dont le nombre et l’ordre peuvent changer. Une liste de tuples, comme [("Ana", 90), ("Ben", 85)], associe une collection modifiable à des enregistrements dont les positions sont fixes.
Un tuple de nombres ou de chaînes peut servir de clé de dictionnaire, comme dans {(0, 0): "origin"}. Les clés doivent être hachables, c’est-à-dire qu’elles respectent les règles de Python permettant un accès stable par clé. Une liste n’est pas hachable, et un tuple qui contient une liste ne l’est pas non plus.
Comparer des tuples
La comparaison commence à gauche et s’arrête à la première paire inégale. (1, 2, 5) < (1, 3, 0) vaut True : les premières valeurs sont égales et 2 est inférieur à 3. Cette même règle ordonne une liste d’enregistrements sous forme de tuples lorsqu’aucune fonction clé n’est fournie.
Points clés
- Un tuple a des positions fixes, mais peut contenir un objet mutable.
- La virgule crée un tuple non vide ;
(5,)contient un élément. - Les opérations de lecture d’un tuple suivent les règles des séquences.
- Créer une nouvelle liaison pour le nom d’un tuple donne une valeur différente sans modifier l’ancien tuple.
- Les tuples utilisés comme clés de dictionnaire doivent avoir un contenu hachable.
- La comparaison de tuples utilise la première paire d’éléments inégaux.
4.2 Dépaqueter des enregistrements dans des noms
L’empaquetage rassemble des valeurs dans un tuple. Le dépaquetage affecte dans l’ordre les éléments d’un itérable à des noms. Ensemble, ils permettent au code de donner des noms clairs aux champs d’un enregistrement et de recevoir plusieurs résultats d’une fonction.
Associer les noms aux valeurs
record = "Ana", 34, "Lima"
name, age, city = record
print(name, age, city)
Sortie :
Ana 34 Lima
Le premier élément devient name, le deuxième age et le troisième city. Le dépaquetage fonctionne aussi sur les listes et les chaînes : first, second = [10, 20] et a, b, c = "xyz" affectent leurs éléments dans l’ordre. user, domain = "ana@example.com".split("@") donne 'ana' et 'example.com' car le découpage produit deux parties.
Sans nom étoilé, les nombres doivent correspondre exactement. x, y = (1, 2, 3) lève ValueError car il y a trop de valeurs ; x, y, z = (1, 2) lève ValueError car il n’y en a pas assez. Python ne supprime pas les éléments supplémentaires sans avertissement.
Échanger des valeurs sans risque
a = 1
b = 2
a, b = b, a
print(a, b)
La sortie est 2 1. Python évalue tout le membre de droite avec les anciennes valeurs avant d’effectuer les affectations aux noms de gauche. La tentative en deux instructions a = b puis b = a perd l’ancienne valeur de a et donne la valeur 2 aux deux noms.
Recueillir les éléments restants
Un nom étoilé reçoit une liste des valeurs restantes :
first, *rest = [5, 6, 7, 8]
print(first, rest)
*init, last = [5, 6, 7, 8]
print(init, last)
Sortie :
5 [6, 7, 8]
[5, 6, 7] 8
L’étoile peut aussi se trouver entre des noms non étoilés : first, *middle, last = (5, 6, 7, 8) donne à middle la liste [6, 7]. L’objet recueilli est toujours une liste, même lors du dépaquetage d’un tuple. head, *rest = [5] laisse rest égal à []. Il doit y avoir assez d’éléments pour les noms non étoilés, et un seul nom étoilé est autorisé dans un même dépaquetage.
Dépaqueter pendant une boucle
for name, score in [("Ana", 90), ("Ben", 85)]:
print(name, score)
Sortie :
Ana 90
Ben 85
L’en-tête dépaquette chaque enregistrement à son arrivée. C’est aussi le fonctionnement de for i, item in enumerate(values): et de for a, b in zip(left, right): : chaque itération fournit une paire.
Renvoyer plusieurs résultats
def min_max(values):
return min(values), max(values)
low, high = min_max([7, 2, 9])
result = min_max([7, 2, 9])
print(low, high)
print(result)
Sortie :
2 9
(2, 9)
La fonction renvoie un seul tuple. L’appelant peut le dépaqueter ou conserver l’objet entier. Par convention, un trait de soulignement désigne une valeur dont le code n’a pas besoin : _, month, day = (2024, 7, 15) conserve le mois et le jour sous des noms descriptifs. _ reste une variable ordinaire, et non une opération spéciale de rejet.
Points clés
- L’empaquetage rassemble des valeurs ; le dépaquetage les affecte dans l’ordre.
- Sans nom étoilé, le nombre d’éléments doit correspondre exactement au nombre de noms.
- Un nom étoilé reçoit une liste des éléments restants, éventuellement vide.
- Échange les valeurs avec
a, b = b, apour conserver les deux anciennes valeurs. - Plusieurs valeurs de retour sont généralement empaquetées dans un seul tuple.
5Suivre le partage et créer des copies
Deux noms peuvent faire référence à une même liste, et une copie de la liste externe peut encore partager ses lignes. Ces relations expliquent pourquoi une modification apparaît parfois à plusieurs endroits. Détermine à quel objet un nom donne accès avant de décider si une opération modifie cet objet ou crée une nouvelle liaison pour le nom. Le même raisonnement s’applique lorsqu’une fonction reçoit une liste et lorsqu’un argument par défaut est réutilisé entre plusieurs appels. La copie apporte de l’indépendance aux niveaux qui en ont besoin.
5.1 Suivre les noms qui partagent une liste
Une variable est un nom qui fait référence à un objet. Une affectation change l’objet auquel un nom fait référence ; elle ne copie pas automatiquement l’objet. Avec une liste mutable, deux noms peuvent donc donner accès aux mêmes modifications.
Suivre les références
a = [1, 2, 3]
b = a
b.append(4)
print(a)
print(b)
Sortie :
[1, 2, 3, 4]
[1, 2, 3, 4]
Il y a une liste et deux noms pour la désigner. b est un alias de a. L’ajout modifie l’objet partagé : lire la liste par l’un ou l’autre nom montre donc l’élément ajouté. Pour suivre ce code, dessine deux flèches, une depuis chaque nom, vers la même liste.
Distinguer égalité et identité
a = [1, 2]
b = a
c = [1, 2]
print(a == b, a == c)
print(a is b, a is c)
Sortie :
True True
True False
== compare les contenus ; is teste s’il s’agit du même objet. c a un contenu égal, mais désigne une liste distincte. id(x) donne le numéro d’identité d’un objet : id(a) == id(b) donne donc le même résultat que a is b. Les numéros d’identité n’indiquent pas quels éléments une liste contient.
Utilise == pour vérifier si les contenus correspondent. Utilise is pour vérifier le partage ou tester un objet particulier comme None. Un nouveau littéral de liste crée une liste distincte : a is [1, 2] est donc faux pour une liste a existante, même si les contenus correspondent.
La mutation et la nouvelle liaison n’ont pas la même portée
| Instruction | Qu’est-ce qui change ? | Que voit un alias ? |
|---|---|---|
b.append(4) | Liste existante | Élément ajouté |
b[0] = 9 | Liste existante | Élément remplacé |
b = [7, 8] | Le nom b | Liste d’origine inchangée |
Après la dernière instruction, b pointe vers une nouvelle liste. a continue de faire référence à l’objet d’origine. Créer une nouvelle liaison pour un nom ne redirige pas tous les noms qui faisaient référence à cet objet.
Suivre séparément += et +
Pour les listes, += étend la liste existante :
a = [1]
b = a
a += [2]
print(a, b)
La sortie est [1, 2] [1, 2]. En revanche :
a = [1]
b = a
a = a + [2]
print(a, b)
La sortie est [1, 2] [1]. + crée une nouvelle liste, et l’affectation fait référence à cette liste avec a. b fait toujours référence à la liste d’origine à un élément.
Chercher des alias moins visibles
row = [0, 0] suivi de table = [row, row] stocke deux fois la même ligne. table[0][0] = 5 produit [[5, 0], [5, 0]] car les deux positions donnent accès à la même liste interne.
Les nombres et les chaînes ne peuvent pas changer en place. Après x = 5, y = x, x += 1, y reste égal à 5 ; une nouvelle liaison a été créée pour x. Les positions des éléments d’un tuple restent aussi fixes, mais une liste interne peut changer. Après t = ([1], 2), u = t et t[0].append(3), u affiche ([1, 3], 2) : les deux noms donnent toujours accès au même tuple et à la même liste mutable qu’il contient.
Points clés
- L’affectation partage une référence ; elle ne copie pas une liste.
==compare les valeurs, tandis queisvérifie l’identité des objets.- Une mutation est visible par les alias ; une nouvelle liaison redirige un seul nom.
- Pour les listes,
+=modifie la liste tandis que+en crée une nouvelle. - Le partage peut se produire dans un tableau ou un tuple, ainsi qu’entre des noms de variables.
5.2 Copier les niveaux qui doivent être indépendants
La copie crée un nouvel objet, mais sa profondeur compte. Une nouvelle liste externe peut encore contenir des références aux listes internes d’origine.
Créer une nouvelle liste externe
a = [1, 2, 3]
b = a.copy()
b.append(4)
print(a)
print(b)
print(a is b)
Sortie :
[1, 2, 3]
[1, 2, 3, 4]
False
a[:], list(a) et a.copy() créent tous une copie superficielle d’une liste. Son conteneur externe est nouveau et les références à ses éléments sont copiées. Avec des nombres ou des chaînes immuables, remplacer ou ajouter un élément dans une liste externe laisse l’autre inchangée.
Voir ce qu’une copie superficielle partage
a = [[1, 2], [3, 4]]
b = a.copy()
b[0].append(99)
print(a)
print(b is a, b[0] is a[0])
Sortie :
[[1, 2, 99], [3, 4]]
False True
Les deux listes externes sont différentes, mais leurs premiers éléments font référence à la même liste interne. append() modifie cet objet interne.
Remplacer un élément de b est différent. Après b[1] = [0], b a une deuxième ligne différente tandis que a[1] reste égal à [3, 4]. L’affectation change une référence dans la liste externe de b ; elle ne modifie pas l’ancienne deuxième ligne.
Copier aussi les listes imbriquées
import copy
a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)
b[0].append(99)
print(a)
print(b)
Sortie :
[[1, 2], [3, 4]]
[[1, 2, 99], [3, 4]]
import copy rend le module de copie disponible. copy.deepcopy() copie récursivement la structure de listes imbriquées : les modifications des listes internes copiées ne touchent donc pas l’originale. Utilise cette fonction lorsque les modifications à ces niveaux internes doivent être indépendantes. Une copie superficielle suffit si seuls l’ordre ou les références aux éléments de la liste externe doivent changer.
Éviter les références répétées lors de la construction des lignes
table = [[0] * 3] * 2
table[0][0] = 7
print(table)
La sortie est [[7, 0, 0], [7, 0, 0]]. La multiplication a répété la référence à une seule ligne. Elle n’a pas construit deux lignes.
Construis chaque ligne dans la boucle :
table = []
for r in range(2):
table.append([0] * 3)
table[0][0] = 7
print(table)
La sortie est [[7, 0, 0], [0, 0, 0]]. [0] * 3 seul convient à des compteurs indépendants : les entiers ne peuvent pas être modifiés, et l’affectation d’élément ne remplace qu’une position.
Choisir une copie pour une raison précise
Conserver l’ordre d’origine avant un tri exige une nouvelle liste externe. Préserver les mesures imbriquées d’origine tout en modifiant les cellules copiées exige aussi des listes internes indépendantes. Un traitement en lecture seule n’a pas besoin de copie, et une modification partagée intentionnelle peut utiliser des alias. Pour examiner un bug dans une structure imbriquée, vérifie à la fois b is a et b[0] is a[0] ; tester uniquement les listes externes ne révèle pas le partage interne.
Points clés
- Une tranche,
list()etcopy()créent une nouvelle liste externe. - Une copie superficielle conserve les références aux éléments d’origine.
- Remplacer une ligne copiée diffère de la modification d’une ligne partagée.
copy.deepcopycopie récursivement les listes imbriquées.- La multiplication d’une liste imbriquée répète des références à une même ligne.
- Copie uniquement les niveaux dont les modifications doivent être indépendantes.
5.3 Clarifier les effets d’une fonction sur une liste
Un paramètre de fonction est un autre nom pour l’objet fourni par l’appelant. Un argument de type liste n’est pas automatiquement copié. La fonction peut modifier cet objet, créer une nouvelle liaison pour son paramètre local ou renvoyer un nouveau résultat ; ces actions n’ont pas le même effet sur l’appelant.
Une mutation atteint l’appelant
def add_bonus(scores):
scores.append(5)
marks = [80]
result = add_bonus(marks)
print(marks)
print(result)
Sortie :
[80, 5]
None
scores et marks font initialement référence à la même liste. L’ajout effectué par scores la modifie. Comme la fonction ne contient pas d’instruction de retour explicite, son résultat est None.
En revanche, def reset(scores): scores = [] crée une nouvelle liaison pour le seul paramètre local. Le nom marks de l’appelant fait toujours référence à son ancienne liste. Utilise scores.clear() pour vider cette liste effectivement partagée.
Conserver une liste renvoyée si nécessaire
Deux conceptions sont courantes : modifier une liste en place et renvoyer None, ou la laisser inchangée et renvoyer une nouvelle liste :
def drop_first(values):
del values[0]
def tail(values):
return values[1:]
Pour nums = [1, 2, 3], appeler drop_first(nums) laisse nums égal à [2, 3]. Écrire nums = drop_first(nums) lierait en revanche nums à None. En repartant de [1, 2, 3], shorter = tail(nums) donne à shorter la liste [2, 3] tandis que nums reste inchangé. Appeler tail(nums) sans conserver son résultat abandonne la nouvelle liste.
D’autres conceptions sont aussi utiles : sum() renvoie une valeur récapitulative, et pop() modifie une liste tout en renvoyant un élément. Indique clairement l’effet et la valeur de retour dans le nom ou la docstring d’une fonction.
Construire un résultat sans modifier l’entrée
def without_negatives(values):
kept = []
for value in values:
if value >= 0:
kept.append(value)
return kept
original = [3, -2, 0, 7]
print(without_negatives(original))
print(original)
Sortie :
[3, 0, 7]
[3, -2, 0, 7]
Un appelant peut aussi protéger sa liste externe en passant une copie superficielle, comme dans drop_first(original[:]). Une opération qui modifie les listes internes nécessiterait aussi une copie à ces niveaux.
Éviter une valeur par défaut mutable partagée
def add_item(item, basket=[]):
basket.append(item)
return basket
La liste par défaut est créée une fois, lorsque l’instruction def s’exécute. add_item("a") renvoie ['a'], et l’appel suivant utilisant la valeur par défaut, add_item("b"), renvoie ['a', 'b']. Utilise None pour obtenir une nouvelle liste :
def add_item(item, basket=None):
if basket is None:
basket = []
basket.append(item)
return basket
Chaque appel sans panier crée maintenant sa propre liste. Passer un panier existant permet toujours de partager volontairement les modifications. Une fonction ne peut pas modifier un nombre ou une chaîne, ni remplacer les éléments d’un tuple, mais elle peut modifier une liste stockée dans un tuple, par exemple en appelant pair[0].append(9).
Points clés
- Un paramètre fait initialement référence à l’objet de l’appelant.
- Modifier un paramètre de type liste change cet objet ; créer une nouvelle liaison pour le paramètre ne le change pas.
- Conserve une nouvelle liste renvoyée si le programme en a besoin.
- Vérifie à la fois l’effet d’une fonction et sa valeur de retour.
- Une liste par défaut mutable est partagée entre les appels qui utilisent cette valeur par défaut.
- Utilise
Noneet crée une liste dans la fonction pour obtenir une nouvelle liste par défaut.
6Mettre des séquences en ordre
Mettre des enregistrements en ordre demande deux choix : les valeurs qui déterminent l’ordre et la modification éventuelle de la collection d’origine. Python peut trier une liste en place ou renvoyer une nouvelle liste à partir de n’importe quel itérable. Les fonctions clés permettent à un programme de comparer un champ, une valeur calculée ou plusieurs champs successifs. Les éléments dont les clés sont égales conservent leur ordre d’entrée, ce qui rend les égalités prévisibles et permet de trier selon plusieurs règles.
6.1 Choisir comment trier ou inverser des données
Le tri place les éléments selon leur ordre de comparaison. L’inversion renverse leur ordre actuel. Décide aussi si le programme doit modifier la liste existante ou la conserver et recevoir une nouvelle liste.
Trier en place ou conserver une nouvelle liste
nums = [3, 1, 2]
new = sorted(nums)
print(nums)
print(new)
nums.sort()
print(nums)
Sortie :
[3, 1, 2]
[1, 2, 3]
[1, 2, 3]
sorted() crée une nouvelle liste. sort() est une méthode de liste qui réorganise la liste existante et renvoie None. nums = nums.sort() fait perdre au nom sa référence à la liste et le lie à None. Écris nums.sort() seul sur sa ligne ou utilise nums = sorted(nums). print(nums.sort()) affiche None même si la liste a été réordonnée.
sorted() accepte n’importe quel itérable et renvoie toujours une liste. sorted((3, 1, 2)) donne [1, 2, 3], et sorted("cab") donne ['a', 'b', 'c']. Les chaînes et les tuples n’ont pas de méthode sort() qui agit en place.
Ordre décroissant et ordre inversé
Expression pour nums = [3, 1, 2] | Résultat | Modifie nums ? |
|---|---|---|
sorted(nums, reverse=True) | [3, 2, 1] | Non |
nums.sort(reverse=True) | Renvoie None ; la liste devient [3, 2, 1] | Oui |
nums[::-1] | [2, 1, 3] | Non |
list(reversed(nums)) | [2, 1, 3] | Non |
nums.reverse() | Renvoie None ; la liste devient [2, 1, 3] | Oui |
Chaque ligne part de la liste d’origine. reverse=True demande un tri par ordre décroissant et doit être donné par son nom ; sorted(nums, True) lève TypeError. L’inversion parcourt simplement les positions existantes à rebours : elle ne produit donc pas nécessairement des valeurs décroissantes.
Vérifier les valeurs comparées
Les nombres sont triés selon leur valeur numérique, même lorsque les entiers et les flottants sont mélangés : sorted([2.5, -1, 2]) donne [-1, 2, 2.5].
Le texte est comparé caractère par caractère. sorted(["10", "9", "100"]) donne ['10', '100', '9']. Le premier caractère '1' vient avant '9', et une chaîne qui forme un préfixe vient avant une chaîne plus longue qui commence par ce préfixe. Convertis les chaînes numériques avec int() ou float() lorsque tu veux un ordre numérique.
Les majuscules A à Z viennent avant les minuscules a à z. sorted(["b", "B", "a"]) donne ['B', 'a', 'b']. L’ordre par défaut des chaînes repose sur les codes des caractères ; ce n’est pas un ordre de dictionnaire insensible à la casse.
Tous les éléments comparés doivent prendre en charge < entre eux. sorted([3, "two", 1]) lève TypeError. Nettoie ou convertis les données avant le tri.
Utiliser les positions après le tri
Pour un nombre impair de notes, le tri facilite la lecture de la valeur du milieu :
scores = [72, 95, 64, 88, 79]
ordered = sorted(scores)
median = ordered[len(ordered) // 2]
print(ordered)
print(median)
La sortie est [64, 72, 79, 88, 95] puis 79. La liste d’origine conserve l’ordre d’arrivée des notes. Ce calcul à partir d’un seul élément central s’applique aux listes non vides d’effectif impair.
Points clés
sortmodifie une liste et renvoieNone;sortedrenvoie une nouvelle liste.sortedaccepte des itérables comme les tuples et les chaînes.reverse=Truetrie par ordre décroissant ; inverser seul renverse les positions actuelles.- Les chaînes numériques suivent l’ordre du texte tant qu’elles ne sont pas converties.
- Les éléments doivent pouvoir être comparés entre eux.
6.2 Trier des enregistrements selon les champs utiles
Une fonction clé calcule la valeur de comparaison de chaque élément. Les éléments d’origine restent intacts dans le résultat trié. Cela permet à un programme de trier du texte selon sa longueur ou des enregistrements selon un champ choisi.
Passer une fonction, pas un appel de fonction
words = ["kiwi", "fig", "banana"]
print(sorted(words, key=len))
Sortie :
['fig', 'kiwi', 'banana']
Python appelle len une fois pour chaque élément et compare les longueurs obtenues, 4, 3 et 6. Passe key=len, sans parenthèses. key=len() essaie d’appeler immédiatement len sans argument et échoue.
Pour comparer en minuscules, utilise key=str.lower. Avec ["banana", "apple", "Cherry"], l’ordre par défaut est ['Cherry', 'apple', 'banana']. Avec key=str.lower, le résultat est ['apple', 'banana', 'Cherry']. Le C majuscule d’origine reste dans le résultat ; seules les clés de comparaison sont en minuscules.
Sélectionner un champ d’enregistrement
results = [("Ana", 90), ("Ben", 72), ("Cy", 85)]
def by_score(record):
return record[1]
print(sorted(results, key=by_score))
Sortie :
[('Ben', 72), ('Cy', 85), ('Ana', 90)]
La fonction reçoit un enregistrement à la fois. record[1] sélectionne sa note. Ajoute reverse=True pour placer la note la plus élevée en premier. results.sort(key=by_score, reverse=True) utilise la même règle, mais modifie results lui-même.
key=by_score(results) est différent : cette expression appelle la fonction sur toute la liste et transmet son résultat comme argument de clé. Ici, ce résultat est le tuple ('Ben', 72), qui ne peut pas être appelé comme une fonction ; le tri lève donc TypeError.
Utiliser plusieurs champs
Sans clé, les tuples comparent leurs premiers éléments, puis leurs deuxièmes éléments pour départager les premiers éléments égaux. Trier [("Ben", 72), ("Ana", 90), ("Ana", 85)] donne [('Ana', 85), ('Ana', 90), ('Ben', 72)].
Une clé peut renvoyer un tuple pour choisir un autre ordre de champs :
def rank_key(record):
return (-record[1], record[0])
results = [("Dee", 85), ("Ana", 90), ("Cy", 85)]
print(sorted(results, key=rank_key))
Sortie :
[('Ana', 90), ('Cy', 85), ('Dee', 85)]
Prendre l’opposé de la note donne des clés plus petites aux notes plus élevées. Les noms départagent ensuite les notes égales par ordre croissant. reverse=True appliqué à une clé (score, name) dont la note est positive inverserait les deux champs, y compris les noms, et ne respecterait donc pas cette règle qui combine deux sens de tri.
Conserver l’ordre des éléments à clés égales
Le tri de Python est stable : les éléments dont les clés sont égales conservent leur ordre d’entrée. Trier ["bb", "a", "cc", "d"] selon len donne ['a', 'd', 'bb', 'cc']. Parmi les deux mots d’une lettre ex aequo, 'a' reste en premier ; parmi ceux de deux lettres, 'bb' reste en premier. La stabilité permet aussi de trier d’abord selon un champ secondaire, puis selon le champ principal.
min() et max() acceptent aussi des fonctions clés. max(words, key=len) renvoie 'banana', et non sa longueur. Lorsque les clés sont égales, ces fonctions renvoient le premier élément correspondant rencontré.
Points clés
- Une fonction clé associe un élément à sa valeur de comparaison.
- Passe la fonction elle-même, comme dans
key=lenoukey=by_score. - Les résultats des clés contrôlent l’ordre sans remplacer les éléments d’origine.
- Une clé tuple ordonne selon son premier champ, puis utilise les champs suivants pour résoudre les égalités.
- Prendre l’opposé d’une clé numérique peut inverser le sens de tri de ce seul champ.
- Un tri stable conserve l’ordre d’entrée des éléments dont les clés sont égales.
minetmaxrenvoient les éléments d’origine et choisissent le premier lorsque les clés sont égales.
Listes et tuples en Python : exemples
1Lire les nombres de livraisons d’une semaine
13 étapes
- 1IntroductionConserver les nombres dans l’ordre
Un journal de livraisons stocke un nombre par jour. Une liste conserve l’ordre : une position désigne donc un jour et une tranche sélectionne plusieurs jours. Tu peux ensuite calculer un total ou une moyenne à partir des valeurs sélectionnées.
Travaille avec
deliveries = [12, 7, 15, 9, 17]. Il s’agit de cinq nombres quotidiens dans leur ordre d’arrivée. Suis d’abord les positions, puis les bornes des tranches et enfin le type de résultat produit par chaque opération. - 2ExempleAssocier les nombres aux positions
Les cinq nombres occupent les indices 0 à 4 :
deliveries = [12, 7, 15, 9, 17] print(deliveries[0], deliveries[4])La sortie est
12 17.len(deliveries)vaut 5, mais l’indice 5 n’existe pas. Un nombre d’éléments indique combien de positions existent ; il ne désigne pas la dernière. Le dernier nombre peut aussi être lu avecdeliveries[-1], en utilisant un indice négatif compté depuis la fin. - 3ConseilVérifier une valeur avant de l’utiliser
Le test d’appartenance répond à une question différente de l’accès par indice :
print(9 in deliveries) print(4 in deliveries)La sortie est
TruepuisFalse. La valeur 9 est présente, mais pas 4, même si 4 est un indice valide.invérifie les valeurs stockées. Si tu veux le nombre à la position 4, utilisedeliveries[4], qui renvoie17. - 4DéfiTrouver l’avant-dernier nombre
Que renvoie
deliveries[-2]et est-ce quedeliveries[len(deliveries)]fonctionnerait ?---reveal---
L’indice négatif
-2sélectionne9, une place avant le dernier élément17. La seconde expression essaie l’indice 5 et lève IndexError. Utiliselen(deliveries) - 1ou-1pour sélectionner le dernier élément ; le nombre d’éléments dépasse d’une unité le dernier indice positif ou nul. - 5ExempleSélectionner les trois jours du milieu
Utilise l’indice 1 comme début et l’indice 4 comme fin exclue :
middle = deliveries[1:4] print(middle)La sortie est
[7, 15, 9]. Les positions sélectionnées sont 1, 2 et 3. La position 4 contient 17, mais elle marque ici la borne de fin.middleest une nouvelle liste : modifier ses positions externes ne remplacera donc pas une position dansdeliveries. - 6ExplicationOmettre une borne
deliveries[:2]donne[12, 7], les deux premiers jours.deliveries[2:]donne[15, 9, 17], tous les jours restants. Les deux tranches se rejoignent à la borne 2 : les concaténer reconstitue donc le contenu d’origine.deliveries[-2:]donne[9, 17]. Une borne négative se compte depuis la fin.deliveries[20:]vaut[]: une borne de tranche hors limites est ramenée à l’extrémité, contrairement à un accès à un élément hors limites. - 7ExempleParcourir les jours un sur deux
Un troisième champ de tranche contrôle l’espacement :
print(deliveries[::2]) print(deliveries[::-1])La sortie est
[12, 15, 17]puis[17, 9, 15, 7, 12]. Le pas 2 visite les indices 0, 2 et 4. Le pas −1 visite chaque élément à rebours. Les deux résultats sont de nouvelles listes. Un pas nul ne peut pas avancer et lève ValueError. - 8DéfiDistinguer un nombre d’une liste
Quelles sont les valeurs et les types de
deliveries[2]et dedeliveries[2:3]?---reveal---
deliveries[2]est l’entier15.deliveries[2:3]est la liste[15]. La tranche sélectionne une position, mais renvoie tout de même une liste. Cette différence compte si l’opération suivante attend un nombre : ajouter 1 à l’entier fonctionne, tandis qu’ajouter directement 1 à la liste lève TypeError. - 9ExempleCalculer une moyenne à partir de la tranche
La tranche du milieu est
[7, 15, 9]. Additionne ses éléments et divise par sa longueur :total = sum(middle) mean = total / len(middle) print(total) print(mean)La sortie est
31puis10.333333333333334. Le total est 7 + 15 + 9, et le diviseur est 3./produit un résultat en virgule flottante : cette moyenne est donc affichée avec une approximation décimale. - 10Point cléTraiter une sélection sans jour
Une tranche peut être vide : le calcul d’une moyenne nécessite donc une condition de garde :
selected = deliveries[20:] if selected: print(sum(selected) / len(selected)) else: print("No days selected")Ce code affiche
No days selected. Les listes vides sont considérées comme fausses. Bien quesum([])vaille 0, diviser ce total parlen([])entraînerait une division par zéro.minetmaxéchouent aussi sur ces entrées vides. - 11LienConstruire une ligne d’affichage
Un affichage nécessite des chaînes, et non une liste d’entiers :
pieces = [] for count in deliveries: pieces.append(str(count)) print(", ".join(pieces))La sortie est
12, 7, 15, 9, 17.joinest appelée sur le séparateur et le place entre les éléments. Passer directement la liste de nombres échouerait car chaque élément assemblé doit être une chaîne.spliteffectue l’opération inverse en découpant le texte en chaînes. - 12DéfiSélectionner, totaliser et conserver l’originale
Qu’affiche ce code ?
selected = deliveries[-3:] selected[0] = 0 print(sum(selected), deliveries[2])---reveal---
Il affiche
26 15. La tranche vaut initialement[15, 9, 17], puis son premier élément est remplacé, ce qui donne[0, 9, 17]. Le total de ces valeurs est 26. La liste externe créée par la tranche est distincte : le nombre d’origine àdeliveries[2]reste donc égal à 15. - 13RécapitulatifChoisir le résultat nécessaire
Lis une position pour obtenir un seul nombre, utilise une tranche pour obtenir une séquence et utilise les fonctions récapitulatives pour calculer des totaux ou des valeurs extrêmes. Une tranche de liste crée une nouvelle liste externe.
Avant de calculer la moyenne d’une sélection, traite le cas où elle est vide. Pour construire du texte à afficher, convertis les valeurs numériques en chaînes avant de les assembler.
2Modifier une demande de fournitures
10 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionSuivre la liste et la valeur renvoyée
- 2ExempleAjouter un lot d’articles
- 3ExemplePlacer un article au début
- 4ExempleRetirer et sauvegarder un article récupéré
- 5DéfiChoisir une suppression par valeur
- 6ExempleTrouver la position d’un article à corriger
- 7ExempleRemplacer un article par un lot
- 8DéfiSupprimer une partie et trouver une valeur
- 9DéfiTerminer la demande sans la perdre
- 10RécapitulatifAdapter l’opération à la modification
3Nettoyer des mesures et totaliser un tableau
13 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionDécider ce que chaque boucle conserve
- 2ExplicationLire une valeur sans modifier sa position
- 3ExempleRemplacer les mesures invalides par indice
- 4LienAssocier des libellés aux mesures
- 5DéfiExpliquer pourquoi un élément est ignoré
- 6ExempleCompter les mesures positives
- 7ExempleConstruire un résultat filtré et transformé
- 8ConseilChercher jusqu’à la première correspondance
- 9DéfiChoisir un maximum valide
- 10ExempleSélectionner une ligne et une cellule
- 11ExempleTotaliser toutes les lignes
- 12DéfiFiltrer dans tout le tableau
- 13RécapitulatifSéparer l’initialisation du travail répété
4Utiliser un enregistrement fixe et dépaqueter ses champs
10 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionGarder un enregistrement groupé
- 2ExempleCréer l’enregistrement de la station
- 3Point cléTester la portée de l’immuabilité
- 4DéfiCréer un tuple à un élément
- 5ExempleDonner un nom à chaque champ
- 6ExempleConserver la première mesure et le reste
- 7DéfiÉchanger les valeurs des coordonnées
- 8ExempleRenvoyer une paire de valeurs extrêmes
- 9DéfiLire et dépaqueter un champ sélectionné
- 10RécapitulatifLire la structure avant de dépaqueter
5Suivre une copie de tableau dans une fonction
14 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionDessiner les chemins vers les objets
- 2ExempleCréer un alias
- 3ExempleRediriger un nom
- 4DéfiPrévoir deux types d’addition
- 5ExempleCopier le tableau externe
- 6ExempleModifier une ligne partagée
- 7Point cléRemplacer une ligne copiée
- 8DéfiChoisir une copie plus profonde
- 9ExempleModifier un objet par un paramètre
- 10LienRenvoyer une liste distincte
- 11ExplicationÉviter un panier par défaut persistant
- 12DéfiDistinguer une nouvelle liaison locale de la suppression du contenu
- 13DéfiSuivre une copie superficielle passée à une fonction
- 14RécapitulatifSuivre le niveau modifié
6Classer des enregistrements sans perdre leur ordre d’arrivée
13 étapes
Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.
- 1IntroductionDistinguer les données stockées des clés de comparaison
- 2ExempleConserver l’ordre d’arrivée
- 3ExempleComparer l’inversion et le tri décroissant
- 4ConseilVérifier le type de l’entrée
- 5DéfiSuivre le résultat d’un tri
- 6ExempleChoisir une clé fondée sur la note
- 7Point cléConserver l’ordre d’arrivée des enregistrements ex aequo
- 8DéfiPasser un objet appelable
- 9ExempleAjouter un critère de départage alphabétique
- 10ConseilInverser seulement le sens numérique
- 11LienChoisir un élément selon une clé extrême
- 12DéfiConserver les enregistrements et les noms sous leur forme d’origine
- 13RécapitulatifChoisir l’effet et la règle
Listes et tuples en Python : QCM
Série 1 : Lire, découper et modifier des séquences10 Questions Pratiques
Question 1 sur 10
levels = [14, 29, 37, 52], que vaut levels[-2] ?Afficher la réponseMasquer la réponse
-1 sélectionne 52, et -2 sélectionne 37. Compter deux places depuis le début donnerait 29, mais dans une autre direction. Le signe moins change l’endroit où commence le décompte des positions.Question 2 sur 10
codes = [2, 5, 8, 11, 14, 17], que vaut codes[1:5:2] ?Afficher la réponseMasquer la réponse
[5, 11]. Inclure 17 reviendrait à inclure la fin ; prendre chaque élément entre les bornes reviendrait à ignorer le pas.Question 3 sur 10
Quelle liste résulte de ce code ?
items = ["pen"]
items.append(["clip", "pad"])
Afficher la réponseMasquer la réponse
append ajoute son argument comme un seul élément : les deux chaînes restent donc ensemble dans une liste imbriquée. La liste externe contient maintenant deux éléments : une chaîne et une liste. Ajouter les chaînes comme éléments externes séparés nécessiterait extend avec la liste de deux éléments.Question 4 sur 10
Qu’affiche ce code ?
parts = "6|12|18".split("|")
print(len(parts), parts[1])
Afficher la réponseMasquer la réponse
'6', '12' et '18'. L’indice 1 sélectionne le deuxième élément, qui s’affiche sous la forme 12. Compter les caractères de la chaîne d’origine reviendrait à confondre le texte d’entrée avec la liste renvoyée par split.Question 5 sur 10
Que vaut len(values) après ce code ?
values = [4, 7, 10, 13]
values[1:3] = [20, 21, 22]
Afficher la réponseMasquer la réponse
4 - 2 + 3, soit 5. Garder la longueur d’origine serait correct pour l’affectation d’un élément, mais le remplacement d’une tranche contiguë peut agrandir ou réduire une liste.Question 6 sur 10
Afficher la réponseMasquer la réponse
(12,) est donc la valeur demandée. Les parenthèses seules ne font que regrouper l’entier : (12) est le même entier que 12. Les crochets créent une liste, et tuple(12) échoue car un entier ne peut pas fournir d’éléments itérables.Question 7 sur 10
Qu’affiche ce code ?
queue = [18, 0, 24]
removed = queue.pop(0)
print(removed, queue)
Afficher la réponseMasquer la réponse
pop(0) sélectionne la position 0, retire son élément 18 et le renvoie. La liste restante est [0, 24]. Supprimer la valeur 0 donnerait [18, 24], mais c’est ce que fait remove(0) ; pop interprète son argument comme un indice.Question 8 sur 10
Qu’affiche ce code ?
a = [3, 6, 9, 12, 15]
b = a[-4:-1]
print(b[::-1][1])
Afficher la réponseMasquer la réponse
[6, 9, 12]. Inverser cette nouvelle liste donne [12, 9, 6], dont l’élément d’indice 1 est 9. Choisir 6 reviendrait à lire le premier élément de la tranche d’origine sans effectuer l’inversion et l’accès final.Question 9 sur 10
items = [9, 16, 25], que se passe-t-il lorsque Python évalue items[len(items)] ?Afficher la réponseMasquer la réponse
len(items) vaut 3, mais les indices positifs ou nuls valides sont 0, 1 et 2. Accéder à l’indice 3 lève IndexError car aucun élément ne s’y trouve. L’expression fournit un indice entier : le problème vient donc de sa position hors limites, et non de son type ; items[-1] renverrait 25.Question 10 sur 10
[4, 99] < [5, 1] ?Afficher la réponseMasquer la réponse
4 < 5 est vrai : la comparaison s’arrête donc là. Le 99 suivant ne change pas ce résultat ; Python ne compare pas les totaux des listes pour cette opération.Série 2 : Traiter des valeurs, des positions et des tableaux10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
Quelle liste ce code affiche-t-il ?
values = [8, 3]
for value in values:
value = 0
print(values)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
Quelle valeur ce code affiche-t-il ?
count = 0
for size in [10, 7, 10, 13, 6]:
if size >= 10:
count += 1
print(count)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
table = [[6, 8, 10], [11, 13, 15]], que produit table[1][0] + table[0][2] ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
list(zip(["Lee", "Mo", "Nia"], [41, 56])) ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
Qu’est-ce qui est affiché ?
values = [7, -4, -8, 2]
position = -1
for i, value in enumerate(values):
if value < 0:
position = i
break
print(position, values[position])
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Combien de fois total += value s’exécute-t-il ?
total = 0
for row in [[2, 4], [6], [8, 10, 12]]:
for value in row:
total += value
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Quelle liste reste après ce code ?
values = [0, 0, 1, 0]
for value in values:
if value == 0:
values.remove(value)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
[-14, -6, -19]. Quelle valeur doit initialiser son maximum courant ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
Qu’affiche ce code ?
kept = []
for text in ["4", "15", "8", "21"]:
number = int(text)
if number % 2 == 0:
kept.append(number + 1)
print(kept)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Quel tableau obtient-on ?
table = []
for r in range(2):
table.append([0] * 2)
table[1][0] = 6
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 3 : Dépaqueter des enregistrements et suivre des objets partagés10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
label, amount = ("rice", 4), quelle valeur contient amount ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
middle après first, *middle, last = (2, 5, 8, 11, 14) ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
Qu’affiche ce code ?
a = [5, 8]
b = [5, 8]
print(a == b, a is b)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
Qu’affiche ce code ?
record = ([2], "ready")
other = record
record[0].append(7)
print(other)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
Qu’affiche ce code ?
a = [4]
b = a
a += [9]
a = a + [12]
print(a, b)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Qu’affiche ce code ?
def bounds(values):
return min(values), max(values)
low, high = bounds([18, 5, 12])
low, high = high, low
print(low, high)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Qu’affiche ce code ?
a = [2, 6]
b = a.copy()
b[0] = 10
print(a, b)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
Qu’affiche ce code ?
a = [[4], [8]]
b = a.copy()
b[0].append(6)
b[1] = [9]
print(a)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Qu’affiche ce code ?
row = [1, 2]
table = [row, row]
row = [8, 9]
table[0][1] = 7
print(table, row)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 4 : Contrôler les modifications entre les appels de fonctions10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
tags = ["new", "old", "new"], que renvoie tags.count("done") ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
Qu’affiche ce code ?
def reset(values):
values = []
values = [11, 22]
reset(values)
print(values)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
Qu’affiche ce code ?
import copy
a = [[3], [7]]
b = copy.deepcopy(a)
b[0].append(5)
print(a, b[0] is a[0])
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
Qu’affiche la dernière ligne ?
def collect(item, items=[]):
items.append(item)
return items
first = collect("x")
second = collect("y")
print(first is second, first)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
Qu’affiche ce code ?
def trim(values):
del values[0]
items = [6, 9, 12]
result = trim(items)
print(items, result)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Qu’affiche ce code ?
def change(values):
values.append(8)
values = [0]
return values
original = [3]
result = change(original)
print(original, result)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Quel tableau obtient-on ?
table = [[0] * 2] * 3
table[2][1] = 4
table[0] = [9, 9]
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
codes = ["q", "r", "q", "s", "q"], que vaut codes.index("q", 1) ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
Qu’est-ce qui est affiché ?
def add(item, values=None):
if values is None:
values = []
values.append(item)
return values
a = add(4)
b = add(7)
c = add(9, a)
print(a, b, c is a)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Qu’affiche ce code ?
def edit(rows):
rows[0].append(5)
rows.append([9])
original = [[1], [2]]
edit(original[:])
print(original)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 5 : Choisir des règles de tri et résoudre les égalités10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
result après nums = [8, 2, 5] et result = nums.sort() ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
sorted(["20", "3", "11"]) ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
sorted(["pear", "a", "plum", "to"], key=len) ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
values = [6, 1, 4], quelle paire de résultats obtient-on avec values[::-1] puis sorted(values, reverse=True), dans cet ordre ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
(name, score). Quel corps de fonction clé classe d’abord les notes les plus élevées, puis les noms de A à Z à note égale ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Quel ordre ce code produit-il ?
records = [("Zoe", 8), ("Ali", 8), ("Mia", 6)]
def by_score(record):
return record[1]
print(sorted(records, key=by_score, reverse=True))
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Qu’affiche ce code ?
words = ["oak", "elm", "pine", "ash"]
print(max(words, key=len), min(words, key=len))
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
Qu’affiche ce code ?
words = ["beta", "Alpha", "alpha", "Beta"]
print(sorted(words, key=str.lower))
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
Qu’affiche ce code ?
a = [9, 4, 7]
b = a
c = sorted(a)
a.reverse()
print(b, c)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
(name, score) par nom de A à Z. Il les trie ensuite de façon stable par note décroissante. Dans quel ordre les enregistrements de même note apparaissent-ils dans la liste finale ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Série 6 : Déboguer et combiner des opérations sur les séquences10 Questions Pratiques
Enregistre cette unité pour voir chaque réponse et t'entraîner sur chaque série.
Question 1 sur 10
values = [12, 24], que vaut values[5:20] ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 2 sur 10
None sinon ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 3 sur 10
Qu’affiche ce code ?
items = [1, 2]
result = items.extend([3, 4])
print(len(items), result)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 4 sur 10
Qu’affiche ce code ?
records = [("A", 4), ("B", 9)]
amounts = []
for _, amount in records:
amounts.append(amount)
first, *rest = amounts[::-1]
print(first, rest)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 5 sur 10
Qu’affiche ce code ?
values = [5, -2, 8, -4]
for i, value in enumerate(values):
if value < 0:
values[i] = -value
print(values[1::2])
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 6 sur 10
Qu’affiche ce code ?
a = [[9, 2], [8, 1]]
b = a[:]
b.reverse()
b[0][0] = 6
print(a)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 7 sur 10
Qu’affiche ce code ?
records = [("Rae", 7), ("Dev", 9), ("Cam", 7)]
def rank(record):
return (-record[1], record[0])
ordered = sorted(records, key=rank)
name, score = ordered[1]
print(name, score)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 8 sur 10
Qu’affiche ce code ?
def select(values):
kept = []
for value in values:
if value >= 5:
kept.append(value * 2)
return kept
a = [3, 5, 8]
b = select(a)
b.pop(0)
print(a, b)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 9 sur 10
[31, 12, 27, 18, 24, 15, 21]. Après avoir trié une copie, quelle est la valeur du milieu ?Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Question 10 sur 10
Qu’affiche ce code ?
point = (6, 8)
old = point
point = (10,) + point[1:]
print(old, point)
Afficher la réponseMasquer la réponse
Enregistre cette unité pour voir cette réponse.
Tu bloques sur ton propre exercice ? Aide aux Devoirs
Mots-Clés
A
Accumulateur
total = 0 avant de traiter les mesures, puis utilise total += reading pour conserver les additions précédentes.Affectation d’élément
prices[1] = 6.5 corrige un prix enregistré ; cette affectation ne peut pas créer un élément à l’indice len(prices).Affectation de tranche
values[1:2] = [8, 9] remplace un élément par deux valeurs, ce qui augmente la longueur de la liste d’une unité.Alias
current = queue, ajouter un élément par current modifie aussi la liste accessible par queue.append()
append() ajoute son argument comme un seul élément à la fin de la liste existante et renvoie None.[3, 4] à [1, 2] comme un seul élément produit [1, 2, [3, 4]], car l’argument reste un seul élément.Argument par défaut mutable
basket=[] conserve les éléments ajoutés entre les appels qui l’utilisent, car chacun accède à la même liste.B
Borne de fin
values[2:5], l’indice 5 marque l’arrêt de la sélection et ne fournit pas d’élément.Borne omise
values[::-1], les bornes omises permettent à la tranche parcourue à rebours d’inclure toute la liste en ordre inverse.Boucle imbriquée
C
Cellule
grid[0][2] = 9 remplace la troisième cellule de la première ligne, à condition que cette position existe déjà.Clé insensible à la casse
key=str.lower permet à "Oak" et "oak" d’être comparés comme égaux sans modifier leurs majuscules.Clé tuple
(-score, name) classe les notes par ordre décroissant et utilise les noms de A à Z pour départager les notes égales.Compteur
Concaténation
+ crée une nouvelle liste externe à partir de deux listes.morning + afternoon peut combiner deux listes de mesures tout en laissant chaque liste d’origine intacte.Copie profonde
copy.deepcopy(rows) peut préserver les cellules du tableau d’origine pendant qu’une structure imbriquée distincte est modifiée.Copie superficielle
b = a.copy(), ajouter un élément à b modifie sa liste externe, mais modifier une ligne partagée peut aussi affecter a.count()
count() renvoie le nombre d’éléments égaux à son argument et renvoie 0 lorsque la valeur est absente.[2, 2.0, 5].count(2) vaut 2 car l’entier 2 et le flottant 2,0 sont tous deux égaux à 2 lors de la comparaison.Critère de départage
D
Dépaquetage
name, score = ("Kai", 86) donne à chaque champ de l’enregistrement un nom de variable distinct et parlant.É
Échange simultané
left, right = right, left conserve les deux valeurs sans nécessiter une valeur temporaire nommée séparément.Élément
["desk", ["pen", "pad"]], la liste externe contient deux éléments, même si la liste interne contient deux chaînes.E
Empaquetage
result = lowest, highest stocke les deux valeurs dans un tuple qui peut être renvoyé par une fonction.Enregistrement
("Kai", 86) peut représenter un nom et une note ; une liste de tels enregistrements peut grandir à mesure que les résultats arrivent.enumerate()
enumerate() fournit des paires contenant un numéro et un élément, en commençant par le numéro 0 par défaut.for i, value in enumerate(values): fournit au code à la fois un indice et l’élément courant correspondant.extend()
extend() ajoute chaque élément d’un itérable à la fin de la liste existante et renvoie None.[1, 2] avec [3, 4] produit quatre éléments externes ; l’étendre avec "ab" ajoute deux caractères.F
Filtrage
Fonction clé
key=len classe les mots par longueur sans remplacer ces mots par les nombres correspondant à leur longueur.I
Identité
is ; des contenus égaux peuvent appartenir à des objets listes différents.[1, 3] distincts sont égaux lors d’une comparaison, mais un test d’identité entre ces listes est faux.Immuabilité
index()
index() trouve le premier élément égal dans la partie parcourue et renvoie son indice dans toute la liste.labels.index("go", 2) commence la recherche à la position 2 mais compte toujours son résultat à partir de la position 0.Indice
colors = ["blue", "gold"], l’indice 1 sélectionne 'gold', qui est aussi l’élément d’indice -1.insert()
insert() ajoute un élément avant une position indiquée, décale les éléments suivants et augmente la longueur de la liste.queue.insert(0, "urgent") place un nouvel élément au début sans écraser l’ancien premier élément.Itérable
list().list(range(3)) les recueille donc dans la nouvelle liste [0, 1, 2].Itération
for qui parcourt une liste du premier au dernier élément.names affecte chaque nom courant à la variable de boucle avant d’exécuter son corps.J
join()
join() assemble les chaînes fournies en une seule, en plaçant entre les éléments la chaîne sur laquelle elle est appelée." / ".join(["red", "blue"]) produit 'red / blue' ; les éléments numériques doivent d’abord être convertis en chaînes.L
Ligne
grid[1] récupère toute la deuxième ligne, donc len(grid[1]) compte les cellules de cette ligne.Ligne partagée
table = [row, row] stocke deux fois une même ligne, même si l’affichage du tableau montre deux positions de ligne.Liste
scores = [73, 91, 73] et les traiter ensemble.Liste externe
b[0] = [9] remplace une référence à une ligne, tandis que b[0].append(9) modifie l’objet ligne existant.Liste imbriquée
[[2, 5], [7]], la liste externe contient deux lignes de longueurs deux et un.M
Maximum courant
Médiane
len(ordered) // 2.[5, 12, 2] donne [2, 5, 12], ce qui place la médiane 5 à l’indice central 1.Méthode
queue.append("next") appelle la méthode de la liste et lui fournit en argument l’élément à ajouter.Moyenne
[6, 10, 14], sum(readings) / len(readings) calcule une moyenne de 10.0.Mutation
items[0] = 7 modifie la liste ; tout alias de cette liste voit sa première position prendre la valeur 7.N
Nom étoilé
first, *rest = (4, 8, 12), rest vaut [8, 12], même si l’entrée est un tuple.Nouvelle liaison
b = a, l’affectation b = [] donne à b une nouvelle liste tandis que a continue de faire référence à l’originale.O
Opération en place
values.clear() vide la liste existante : chaque alias voit donc cette liste devenir vide.Ordre décroissant
reverse=True.[5, 1, 8] par ordre décroissant donne [8, 5, 1] ; inverser ses positions seules donne [8, 1, 5].Ordre lexicographique
[3, 20] < [4, 1] est vrai car les premiers éléments déterminent l’ordre avant la comparaison des seconds.P
Paramètre de type liste
values.clear() vide la liste de l’appelant ; l’affectation values = [] ne le fait pas.Pas de tranche
values[1::2] sélectionne une position sur deux à partir de 1 ; un pas négatif parcourt la séquence à rebours.pop()
pop() retire et renvoie un élément par son indice, en utilisant la dernière position si aucun indice n’est fourni.current = queue.pop(0) sauvegarde le premier élément de la file et le retire de cette position dans la liste existante.R
Recherche de la première correspondance
break pour terminer immédiatement la recherche.Référence
b = a donne aux deux noms de variables un accès à la même liste, ce qui permet de partager les modifications.remove()
remove() supprime le premier élément égal à son argument et lève ValueError lorsqu’aucune correspondance n’existe.labels.remove("old") supprime une valeur correspondante ; la méthode n’interprète pas "old" comme une position.Renversement
values.reverse() modifie une liste, tandis que values[::-1] crée une copie superficielle inversée.Répétition
* avec un entier pour répéter dans l’ordre les références aux éléments d’une séquence ; un nombre de répétitions négatif ou nul produit une séquence vide.[0] * 5 crée cinq positions de compteur, tandis que répéter une liste représentant une ligne peut créer des lignes internes partagées.reversed()
reversed() fournit les éléments d’une séquence du dernier au premier sans réorganiser leurs positions dans la séquence.for task in reversed(tasks): traite la dernière tâche en premier tout en conservant l’ordre de la liste d’origine.S
sort()
sort() réordonne la liste existante selon l’ordre de comparaison et renvoie None ; elle accepte les arguments facultatifs key et reverse.scores.sort() modifie directement l’ordre enregistré, et les alias de scores voient les positions triées.sorted()
sorted() accepte un itérable et renvoie une nouvelle liste de ses éléments selon l’ordre de comparaison, sans modifier l’ordre d’entrée.ordered = sorted(scores) permet de conserver l’ordre d’arrivée d’origine dans la variable scores.split()
split() découpe du texte en une liste de chaînes à l’aide d’un séparateur indiqué ou selon les règles relatives aux caractères d’espacement."yes|no|maybe".split("|") crée trois éléments de texte distincts à partir de l’entrée délimitée par un séparateur.T
Test d’appartenance
in ou de not in."ready" in statuses peut déterminer si une liste contient exactement cette chaîne de statut, en tenant compte de la casse.Tranche
tasks[1:4] crée une liste à partir des positions 1, 2 et 3 sans inclure l’élément à la position 4.Transformation
int(text) pour chaque chaîne numérique construit une liste dont on peut calculer le total avec sum().Tri stable
len.Tuple
location = (5, 9) stocke un couple de coordonnées fixe, qui prend toujours en charge l’accès par indice et les tranches.Tuple à un élément
(11,) est un tuple, tandis que (11) donne l’entier 11 sans créer de collection.V
Valeur de retour
None lorsque son corps ne contient pas d’instruction return explicite.Valeur hachable
(5, 9) peut être une clé de coordonnées, mais pas ([5], 9) car sa liste interne n’est pas hachable.Valeur par défaut None
None peut signaler qu’un argument de type liste a été omis, afin que la fonction crée une nouvelle liste dans son corps pour chaque appel utilisant cette valeur par défaut.values=None, la branche if values is None: values = [] évite une liste par défaut partagée accidentellement.Variable de boucle
for value in values: value = 0, la liaison du nom de boucle change, mais pas les éléments stockés aux positions de la liste.Z
zip()
zip() associe les éléments correspondants des itérables reçus et s’arrête par défaut à la fin de l’entrée la plus courte.À propos de cette unité
Crée ton propre Matériel d'Étude
Transforme tes notes, diapos et documents en Guides d'Étude, Questions Pratiques, Flashcards et 6 autres outils.