Listes et tuples en Python

Les listes et les tuples permettent à un programme Python de conserver plusieurs valeurs sous un même nom. Ce cours montre comment créer des listes, lire des éléments et des tranches par leur position, modifier des listes avec des méthodes et les traiter avec des boucles, notamment pour les tableaux stockés sous forme de listes de listes. Il présente les tuples et le dépaquetage, explique pourquoi deux variables peuvent partager une même liste et comment copier une liste sans risque, puis se termine par le tri avec 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

  1. 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 liste
      Extraire 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 natives
      Concaté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.
  2. 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éments
      Agrandir 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éments
      Localiser des valeurs avec index(), count() et in, puis remplacer des éléments ou des parties entières par affectation à un indice ou à une tranche.
  3. 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 positions
      Choisir 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 listes
      Totaliser, 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ées
      Stocker 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.
  4. 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 valeurs
      Affecter 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.
  5. 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 alias
      Expliquer 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ées
      Cré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 renvoyer
      Pré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.
  6. 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 enregistrements
      Trier 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.

Listes et tuples en Python : cours

6 chapitres

1

Cré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.

ExpressionRésultatPosition
scores[0]88Première
scores[1]92Deuxième
scores[2]75Troisième
scores[-1]75Dernière
scores[-2]92Avant-dernière
scores[-3]88Troisiè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 est len(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ève TypeError.
  • in teste 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
TrancheSignificationRé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
ExpressionRé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, min et max produisent 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.
  • split crée des morceaux de texte ; join appelé sur un séparateur assemble des chaînes.
2

Modifier 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érationUtiliseRenvoie
items.pop()Dernière positionÉlément retiré
items.pop(i)Position iÉlément retiré
items.remove(x)Première valeur égale à xNone
del items[i]Position iAucune valeur de retour
del items[start:stop]Tranche de positionsAucune valeur de retour
items.clear()Liste entièreNone

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

  • append ajoute un élément ; extend ajoute chaque élément fourni.
  • insert ajoute un élément avant une position et décale les éléments suivants.
  • pop retire un élément par sa position et le renvoie.
  • remove supprime la première valeur égale et échoue si elle est absente.
  • del supprime des éléments par position ou par tranche ; clear vide la même liste.
  • Des méthodes comme append renvoient None : 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().

InstructionEffet 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

  • index renvoie la première position correspondante et lève ValueError si la valeur est absente.
  • count renvoie 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.
3

Traiter 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 et enumerate pour les deux.
  • Créer une nouvelle liaison pour la variable de boucle ne remplace pas un élément de la liste.
  • zip s’arrête à la fin de l’entrée la plus courte.
  • reversed parcourt la liste à rebours sans la modifier.
  • Une boucle while doit faire avancer son indice et s’arrêter avant len(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 break pour 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.
4

Utiliser 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 :

ExpressionValeur 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, a pour conserver les deux anciennes valeurs.
  • Plusieurs valeurs de retour sont généralement empaquetées dans un seul tuple.
5

Suivre 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
InstructionQu’est-ce qui change ?Que voit un alias ?
b.append(4)Liste existanteÉlément ajouté
b[0] = 9Liste existanteÉlément remplacé
b = [7, 8]Le nom bListe 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 que is vé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() et copy() 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.deepcopy copie 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 None et crée une liste dans la fonction pour obtenir une nouvelle liste par défaut.
6

Mettre 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ésultatModifie 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

  • sort modifie une liste et renvoie None ; sorted renvoie une nouvelle liste.
  • sorted accepte des itérables comme les tuples et les chaînes.
  • reverse=True trie 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=len ou key=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.
  • min et max renvoient les éléments d’origine et choisissent le premier lorsque les clés sont égales.

Listes et tuples en Python : exemples

6 Leçons Interactives

1

Lire les nombres de livraisons d’une semaine

13 étapes
Créer une liste, sélectionner des jours et calculer une moyenne sans risque.
  1. 1
    IntroductionConserver 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.

  2. 2
    ExempleAssocier 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 avec deliveries[-1], en utilisant un indice négatif compté depuis la fin.

  3. 3
    ConseilVé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 True puis False. La valeur 9 est présente, mais pas 4, même si 4 est un indice valide. in vérifie les valeurs stockées. Si tu veux le nombre à la position 4, utilise deliveries[4], qui renvoie 17.

  4. 4
    DéfiTrouver l’avant-dernier nombre

    Que renvoie deliveries[-2] et est-ce que deliveries[len(deliveries)] fonctionnerait ?

    ---reveal---

    L’indice négatif -2 sélectionne 9, une place avant le dernier élément 17. La seconde expression essaie l’indice 5 et lève IndexError. Utilise len(deliveries) - 1 ou -1 pour sélectionner le dernier élément ; le nombre d’éléments dépasse d’une unité le dernier indice positif ou nul.

  5. 5
    ExempleSé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. middle est une nouvelle liste : modifier ses positions externes ne remplacera donc pas une position dans deliveries.

  6. 6
    ExplicationOmettre 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.

  7. 7
    ExempleParcourir 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.

  8. 8
    DéfiDistinguer un nombre d’une liste

    Quelles sont les valeurs et les types de deliveries[2] et de deliveries[2:3] ?

    ---reveal---

    deliveries[2] est l’entier 15. 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.

  9. 9
    ExempleCalculer 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 31 puis 10.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.

  10. 10
    Point 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 que sum([]) vaille 0, diviser ce total par len([]) entraînerait une division par zéro. min et max échouent aussi sur ces entrées vides.

  11. 11
    LienConstruire 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. join est 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. split effectue l’opération inverse en découpant le texte en chaînes.

  12. 12
    Dé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.

  13. 13
    Ré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.

2

Modifier une demande de fournitures

10 étapes
Ajouter, supprimer, trouver et remplacer des éléments en suivant les résultats des méthodes.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionSuivre la liste et la valeur renvoyée
  2. 2
    ExempleAjouter un lot d’articles
  3. 3
    ExemplePlacer un article au début
  4. 4
    ExempleRetirer et sauvegarder un article récupéré
  5. 5
    DéfiChoisir une suppression par valeur
  6. 6
    ExempleTrouver la position d’un article à corriger
  7. 7
    ExempleRemplacer un article par un lot
  8. 8
    DéfiSupprimer une partie et trouver une valeur
  9. 9
    DéfiTerminer la demande sans la perdre
  10. 10
    RécapitulatifAdapter l’opération à la modification
3

Nettoyer des mesures et totaliser un tableau

13 étapes
Choisir des formes de boucle, construire un résultat et traiter des lignes de longueurs différentes.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionDécider ce que chaque boucle conserve
  2. 2
    ExplicationLire une valeur sans modifier sa position
  3. 3
    ExempleRemplacer les mesures invalides par indice
  4. 4
    LienAssocier des libellés aux mesures
  5. 5
    DéfiExpliquer pourquoi un élément est ignoré
  6. 6
    ExempleCompter les mesures positives
  7. 7
    ExempleConstruire un résultat filtré et transformé
  8. 8
    ConseilChercher jusqu’à la première correspondance
  9. 9
    DéfiChoisir un maximum valide
  10. 10
    ExempleSélectionner une ligne et une cellule
  11. 11
    ExempleTotaliser toutes les lignes
  12. 12
    DéfiFiltrer dans tout le tableau
  13. 13
    RécapitulatifSéparer l’initialisation du travail répété
4

Utiliser un enregistrement fixe et dépaqueter ses champs

10 étapes
Suivre les positions d’un tuple, le dépaquetage avec étoile, les échanges et les paires renvoyées.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionGarder un enregistrement groupé
  2. 2
    ExempleCréer l’enregistrement de la station
  3. 3
    Point cléTester la portée de l’immuabilité
  4. 4
    DéfiCréer un tuple à un élément
  5. 5
    ExempleDonner un nom à chaque champ
  6. 6
    ExempleConserver la première mesure et le reste
  7. 7
    DéfiÉchanger les valeurs des coordonnées
  8. 8
    ExempleRenvoyer une paire de valeurs extrêmes
  9. 9
    DéfiLire et dépaqueter un champ sélectionné
  10. 10
    RécapitulatifLire la structure avant de dépaqueter
5

Suivre une copie de tableau dans une fonction

14 étapes
Distinguer les alias, les copies superficielles, les copies profondes et les modifications locales de paramètres.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionDessiner les chemins vers les objets
  2. 2
    ExempleCréer un alias
  3. 3
    ExempleRediriger un nom
  4. 4
    DéfiPrévoir deux types d’addition
  5. 5
    ExempleCopier le tableau externe
  6. 6
    ExempleModifier une ligne partagée
  7. 7
    Point cléRemplacer une ligne copiée
  8. 8
    DéfiChoisir une copie plus profonde
  9. 9
    ExempleModifier un objet par un paramètre
  10. 10
    LienRenvoyer une liste distincte
  11. 11
    ExplicationÉviter un panier par défaut persistant
  12. 12
    DéfiDistinguer une nouvelle liaison locale de la suppression du contenu
  13. 13
    DéfiSuivre une copie superficielle passée à une fonction
  14. 14
    RécapitulatifSuivre le niveau modifié
6

Classer des enregistrements sans perdre leur ordre d’arrivée

13 étapes
Trier une copie, choisir des clés, résoudre les égalités et conserver l’ordre des éléments à clés égales.

Enregistre cette unité pour suivre chaque Leçon Interactive pas à pas.

  1. 1
    IntroductionDistinguer les données stockées des clés de comparaison
  2. 2
    ExempleConserver l’ordre d’arrivée
  3. 3
    ExempleComparer l’inversion et le tri décroissant
  4. 4
    ConseilVérifier le type de l’entrée
  5. 5
    DéfiSuivre le résultat d’un tri
  6. 6
    ExempleChoisir une clé fondée sur la note
  7. 7
    Point cléConserver l’ordre d’arrivée des enregistrements ex aequo
  8. 8
    DéfiPasser un objet appelable
  9. 9
    ExempleAjouter un critère de départage alphabétique
  10. 10
    ConseilInverser seulement le sens numérique
  11. 11
    LienChoisir un élément selon une clé extrême
  12. 12
    DéfiConserver les enregistrements et les noms sous leur forme d’origine
  13. 13
    RécapitulatifChoisir l’effet et la règle

Listes et tuples en Python : QCM

60 Questions Pratiques en 6 séries

Série 1 : Lire, découper et modifier des séquences10 Questions Pratiques

Question 1 sur 10

Pour levels = [14, 29, 37, 52], que vaut levels[-2] ?
  1. 29
  2. 52
  3. 37
  4. 14
Afficher la réponseMasquer la réponse
Réponse : C
Un indice négatif se compte depuis la fin : -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

Pour codes = [2, 5, 8, 11, 14, 17], que vaut codes[1:5:2] ?
  1. [5, 11]
  2. [5, 8, 11, 14]
  3. [5, 11, 17]
  4. [2, 8, 14]
Afficher la réponseMasquer la réponse
Réponse : A
La tranche commence à l’indice 1 et visite ensuite l’indice 3 car son pas est de 2. Elle s’arrête avant l’indice 5 : le résultat est donc [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"])
  1. ['pen', 'clip', 'pad']
  2. [['pen'], ['clip', 'pad']]
  3. ['pen', 'clip pad']
  4. ['pen', ['clip', 'pad']]
Afficher la réponseMasquer la réponse
Réponse : D
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])
  1. 8 12
  2. 3 12
  3. 3 6
  4. 8 |
Afficher la réponseMasquer la réponse
Réponse : B
Le découpage aux deux séparateurs crée trois éléments de type chaîne : '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]
  1. 4
  2. 5
  3. 6
  4. 3
Afficher la réponseMasquer la réponse
Réponse : B
La tranche sélectionne deux éléments existants, aux indices 1 et 2, et les remplace par trois éléments. La nouvelle longueur est 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

Comment écris-tu un tuple contenant uniquement l’entier 12 ?
  1. (12)
  2. [12]
  3. tuple(12)
  4. (12,)
Afficher la réponseMasquer la réponse
Réponse : D
Un tuple à un élément nécessite une virgule finale : (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)
  1. 18 [0, 24]
  2. 0 [18, 24]
  3. None [0, 24]
  4. 24 [18, 0]
Afficher la réponseMasquer la réponse
Réponse : A
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])
  1. 6
  2. 12
  3. 9
  4. 15
Afficher la réponseMasquer la réponse
Réponse : C
La première tranche sélectionne les indices 1 à 3, ce qui donne [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

Pour items = [9, 16, 25], que se passe-t-il lorsque Python évalue items[len(items)] ?
  1. Une erreur IndexError est levée.
  2. Le dernier élément, 25, est renvoyé.
  3. Le premier élément, 9, est renvoyé.
  4. Une erreur TypeError est levée.
Afficher la réponseMasquer la réponse
Réponse : A
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

Quel est le résultat de cette comparaison : [4, 99] < [5, 1] ?
  1. False, car la deuxième paire est 99 et 1.
  2. False, car le total de la première liste est plus grand.
  3. True, car les deux listes ont la même longueur.
  4. True, car la première paire inégale est 4 et 5.
Afficher la réponseMasquer la réponse
Réponse : D
La comparaison d’ordre des séquences compare les positions correspondantes de gauche à droite. La première paire diffère déjà et 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)
  1. [0, 0]
  2. [8, 3]
  3. [0, 3]
  4. [8, 0]
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)
  1. 1
  2. 33
  3. 2
  4. 3
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Pour table = [[6, 8, 10], [11, 13, 15]], que produit table[1][0] + table[0][2] ?
  1. 21
  2. 19
  3. 25
  4. 23
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Combien de paires contient list(zip(["Lee", "Mo", "Nia"], [41, 56])) ?
  1. 3
  2. 5
  3. 2
  4. 1
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])
  1. 2 -8
  2. -1 2
  3. -4 1
  4. 1 -4
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
  1. 3
  2. 6
  3. 9
  4. 2
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)
  1. [1]
  2. [0, 0, 1]
  3. [1, 0]
  4. [0, 1]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Une boucle doit trouver la plus grande valeur de la liste non vide [-14, -6, -19]. Quelle valeur doit initialiser son maximum courant ?
  1. Le premier élément, -14.
  2. Le nombre zéro, 0.
  3. La longueur de la liste, 3.
  4. Le premier indice, 0.
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)
  1. [4, 8]
  2. [5, 9]
  3. [5, 16, 9, 22]
  4. [16, 22]
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
  1. [[6, 0], [6, 0]]
  2. [[0, 6], [0, 0]]
  3. [[0, 0], [6, 0]]
  4. [[0, 0], [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

Après label, amount = ("rice", 4), quelle valeur contient amount ?
  1. 'rice'
  2. (4,)
  3. ('rice', 4)
  4. 4
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Que vaut middle après first, *middle, last = (2, 5, 8, 11, 14) ?
  1. (5, 8, 11)
  2. [5, 8, 11]
  3. [2, 5, 8, 11]
  4. [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)
  1. True True
  2. False True
  3. True False
  4. False False
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)
  1. ([2, 7], 'ready')
  2. ([2], 'ready')
  3. ([7], 'ready')
  4. ([2], 'ready', 7)
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)
  1. [4, 9, 12] [4]
  2. [4, 9, 12] [4, 9, 12]
  3. [4, 9, 12] [4, 9]
  4. [4, 9] [4, 9, 12]
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)
  1. 18 5
  2. 5 18
  3. 18 18
  4. 5 5
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)
  1. [10, 6] [10, 6]
  2. [2, 6] [2, 6]
  3. [10, 6] [2, 6]
  4. [2, 6] [10, 6]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Un programme a besoin d’une clé de dictionnaire représentant la ligne 3 et la colonne 7. Quelle valeur peut-il utiliser comme clé de coordonnées ?
  1. [3, 7]
  2. (3, 7)
  3. ([3], 7)
  4. (3, [7])
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)
  1. [[4], [8]]
  2. [[4, 6], [9]]
  3. [[4], [9]]
  4. [[4, 6], [8]]
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)
  1. [[1, 7], [1, 7]] [8, 9]
  2. [[8, 7], [8, 7]] [8, 7]
  3. [[1, 7], [1, 2]] [8, 9]
  4. [[1, 2], [1, 2]] [8, 7]
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

Pour tags = ["new", "old", "new"], que renvoie tags.count("done") ?
  1. 0
  2. -1
  3. None
  4. ValueError
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)
  1. []
  2. None
  3. [11, 22]
  4. [0, 0]
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])
  1. [[3, 5], [7]] True
  2. [[3], [7]] False
  3. [[3], [7]] True
  4. [[3, 5], [7]] False
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)
  1. False ['x']
  2. True ['x']
  3. False ['x', 'y']
  4. True ['x', 'y']
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)
  1. [9, 12] None
  2. [6, 9, 12] [9, 12]
  3. [9, 12] [9, 12]
  4. None [9, 12]
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)
  1. [0] [0]
  2. [3, 8] [0]
  3. [3] [0]
  4. [3, 8] [3, 8]
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]
  1. [[9, 9], [0, 0], [0, 4]]
  2. [[9, 9], [9, 9], [9, 9]]
  3. [[0, 4], [0, 4], [0, 4]]
  4. [[9, 9], [0, 4], [0, 4]]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 8 sur 10

Pour codes = ["q", "r", "q", "s", "q"], que vaut codes.index("q", 1) ?
  1. 0
  2. 1
  3. 2
  4. 4
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)
  1. [4, 7, 9] [4, 7, 9] True
  2. [4] [7] False
  3. [4, 9] [7] True
  4. [4, 9] [7, 9] False
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)
  1. [[1], [2]]
  2. [[1, 5], [2]]
  3. [[1, 5], [2], [9]]
  4. [[1], [2], [9]]
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

Quelle valeur contient result après nums = [8, 2, 5] et result = nums.sort() ?
  1. [2, 5, 8]
  2. [8, 5, 2]
  3. None
  4. [8, 2, 5]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Que renvoie sorted(["20", "3", "11"]) ?
  1. ['3', '11', '20']
  2. ['20', '3', '11']
  3. ['3', '20', '11']
  4. ['11', '20', '3']
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 3 sur 10

Que renvoie sorted(["pear", "a", "plum", "to"], key=len) ?
  1. ['a', 'to', 'plum', 'pear']
  2. ['a', 'to', 'pear', 'plum']
  3. ['a', 'pear', 'plum', 'to']
  4. ['pear', 'plum', 'to', 'a']
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 4 sur 10

Pour values = [6, 1, 4], quelle paire de résultats obtient-on avec values[::-1] puis sorted(values, reverse=True), dans cet ordre ?
  1. [4, 1, 6] et [6, 4, 1]
  2. [6, 4, 1] et [4, 1, 6]
  3. [4, 1, 6] et [4, 1, 6]
  4. [6, 4, 1] et [6, 4, 1]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 5 sur 10

Les enregistrements sont des paires (name, score). Quel corps de fonction clé classe d’abord les notes les plus élevées, puis les noms de A à Z à note égale ?
  1. return (record[1], record[0])
  2. return (record[0], -record[1])
  3. return (-record[1], len(record[0]))
  4. return (-record[1], record[0])
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))
  1. [('Ali', 8), ('Zoe', 8), ('Mia', 6)]
  2. [('Mia', 6), ('Zoe', 8), ('Ali', 8)]
  3. [('Zoe', 8), ('Ali', 8), ('Mia', 6)]
  4. [('Zoe', 8), ('Mia', 6), ('Ali', 8)]
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))
  1. pine oak
  2. pine ash
  3. 4 3
  4. pine elm
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))
  1. ['beta', 'Beta', 'Alpha', 'alpha']
  2. ['Alpha', 'alpha', 'beta', 'Beta']
  3. ['Alpha', 'beta', 'alpha', 'Beta']
  4. ['Alpha', 'Beta', 'beta', 'alpha']
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)
  1. [7, 4, 9] [4, 7, 9]
  2. [4, 7, 9] [4, 7, 9]
  3. [9, 4, 7] [4, 7, 9]
  4. [7, 4, 9] [9, 7, 4]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 10 sur 10

Un programme trie d’abord des enregistrements (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 ?
  1. Par nom de Z à A dans chaque groupe de même note.
  2. Par nom de A à Z avant toute comparaison des notes.
  3. Selon leur ordre avant les deux opérations de tri.
  4. Par nom de A à Z dans chaque groupe de même note.
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

Pour values = [12, 24], que vaut values[5:20] ?
  1. IndexError
  2. []
  3. [24]
  4. [12, 24]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 2 sur 10

Une liste de nombres peut être vide. Comment une fonction peut-elle renvoyer sa moyenne si elle contient des valeurs et None sinon ?
  1. Tester if not values: return None, puis renvoyer sum(values) / len(values).
  2. Tester if not values: return 0, puis renvoyer sum(values) / len(values).
  3. Renvoyer sum(values) / len(values) avant de vérifier si la liste est vide.
  4. Tester if values: return None, puis renvoyer sum(values) / len(values).
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)
  1. 3 None
  2. 4 [1, 2, 3, 4]
  3. 2 [3, 4]
  4. 4 None
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)
  1. 4 [9]
  2. 9 (4,)
  3. 9 [4]
  4. [9] 4
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])
  1. [2, 4]
  2. [-2, -4]
  3. [5, 8]
  4. [5, 2, 8, 4]
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)
  1. [[6, 1], [9, 2]]
  2. [[9, 2], [8, 1]]
  3. [[9, 2], [6, 1]]
  4. [[6, 2], [8, 1]]
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)
  1. Rae 7
  2. Cam 7
  3. Dev 9
  4. Cam -7
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)
  1. [3, 5, 8] [10, 16]
  2. [5, 8] [16]
  3. [3, 5, 8] [10]
  4. [3, 5, 8] [16]
Afficher la réponseMasquer la réponse

Enregistre cette unité pour voir cette réponse.

Question 9 sur 10

Une liste non vide d’effectif impair est [31, 12, 27, 18, 24, 15, 21]. Après avoir trié une copie, quelle est la valeur du milieu ?
  1. 18
  2. 21
  3. 24
  4. 27
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)
  1. (6, 8) (10, 8)
  2. (10, 8) (10, 8)
  3. (6, 8) (6, 10)
  4. (6, 8) (10,)
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

73 Mots-Clés, chacun avec sa définition

A

Accumulateur
Un accumulateur est une variable qui conserve un résultat courant d’un passage de boucle à l’autre, comme un total mis à jour par l’ajout de chaque élément.
Initialise total = 0 avant de traiter les mesures, puis utilise total += reading pour conserver les additions précédentes.
Affectation d’élément
L’affectation d’élément remplace l’objet à une position existante d’une séquence mutable et laisse inchangée la longueur de la séquence externe.
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
L’affectation de tranche remplace une partie sélectionnée dans une séquence mutable ; une partie contiguë peut recevoir un nombre différent d’éléments.
values[1:2] = [8, 9] remplace un élément par deux valeurs, ce qui augmente la longueur de la liste d’une unité.
Alias
Un alias est un autre nom ou une autre référence pour le même objet ; une mutation effectuée par un accès peut ainsi apparaître par un autre.
Si current = queue, ajouter un élément par current modifie aussi la liste accessible par queue.
append()
La méthode de liste append() ajoute son argument comme un seul élément à la fin de la liste existante et renvoie None.
Ajouter [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
Un argument par défaut mutable est un objet modifiable créé lors de la définition d’une fonction et réutilisé par les appels qui omettent cet argument.
Une valeur par défaut 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
Une borne de fin est l’extrémité exclue d’une tranche ; les positions sélectionnées s’arrêtent avant cette borne dans le sens du pas.
Dans values[2:5], l’indice 5 marque l’arrêt de la sélection et ne fournit pas d’élément.
Borne omise
Une borne omise permet à une tranche d’utiliser l’extrémité appropriée d’une séquence, selon que son pas avance ou recule.
Dans values[::-1], les bornes omises permettent à la tranche parcourue à rebours d’inclure toute la liste en ordre inverse.
Boucle imbriquée
Une boucle imbriquée est une boucle située à l’intérieur d’une autre ; la boucle interne accomplit tout son travail à chaque passage de la boucle externe.
Une boucle sur les lignes contenant une boucle sur les cellules peut traiter des tableaux dont les lignes ont des nombres d’éléments différents.

C

Cellule
Une cellule est une valeur d’un tableau, accessible en sélectionnant sa ligne puis sa position dans cette ligne.
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
Une clé insensible à la casse compare des valeurs textuelles normalisées tout en conservant l’écriture d’origine de chaque chaîne dans la collection renvoyée.
key=str.lower permet à "Oak" et "oak" d’être comparés comme égaux sans modifier leurs majuscules.
Clé tuple
Une clé tuple combine des champs de comparaison par ordre de priorité ; les champs suivants ne décident du résultat que lorsque tous les champs précédents sont égaux.
Renvoyer (-score, name) classe les notes par ordre décroissant et utilise les noms de A à Z pour départager les notes égales.
Compteur
Un compteur est une variable qui enregistre le nombre de fois où une condition est satisfaite ; il commence généralement à 0 et augmente de 1 par correspondance.
Un compteur de notes ajoute 1 pour chaque note suffisante, que cette note soit 60 ou 100.
Concaténation
La concaténation joint des séquences bout à bout ; la concaténation de listes avec + 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
Une copie profonde duplique récursivement une structure imbriquée afin que les modifications des listes internes copiées n’atteignent pas les listes internes d’origine.
copy.deepcopy(rows) peut préserver les cellules du tableau d’origine pendant qu’une structure imbriquée distincte est modifiée.
Copie superficielle
Une copie superficielle crée un nouveau conteneur externe tout en conservant les références aux éléments d’origine, y compris aux éventuelles listes internes mutables.
Après b = a.copy(), ajouter un élément à b modifie sa liste externe, mais modifier une ligne partagée peut aussi affecter a.
count()
La méthode de liste 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
Un critère de départage est une règle de comparaison secondaire utilisée lorsqu’une règle précédente donne des clés égales, par exemple comparer les noms après des notes égales.
Deux enregistrements dont la note est 80 peuvent être classés par nom lorsque la clé inclut ce nom après la note.

D

Dépaquetage
Le dépaquetage affecte dans l’ordre les éléments d’un itérable à plusieurs cibles ; leur nombre doit correspondre, sauf si une étoile recueille les éléments restants.
name, score = ("Kai", 86) donne à chaque champ de l’enregistrement un nom de variable distinct et parlant.

É

Échange simultané
Un échange simultané évalue les deux anciennes valeurs avant de les affecter aux noms opposés dans une seule instruction de dépaquetage.
left, right = right, left conserve les deux valeurs sans nécessiter une valeur temporaire nommée séparément.
Élément
Un élément est une valeur stockée à une position dans une collection ; une liste imbriquée compte comme un seul élément de sa liste externe.
Dans ["desk", ["pen", "pad"]], la liste externe contient deux éléments, même si la liste interne contient deux chaînes.

E

Empaquetage
L’empaquetage rassemble plusieurs valeurs d’expressions dans un seul tuple, généralement à l’aide de virgules sans exiger de parenthèses autour.
result = lowest, highest stocke les deux valeurs dans un tuple qui peut être renvoyé par une fonction.
Enregistrement
Un enregistrement est un groupe de champs liés qui décrivent une entité, souvent stocké sous forme de tuple dont les positions ont des significations distinctes.
("Kai", 86) peut représenter un nom et une note ; une liste de tels enregistrements peut grandir à mesure que les résultats arrivent.
enumerate()
La fonction native 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()
La méthode de liste extend() ajoute chaque élément d’un itérable à la fin de la liste existante et renvoie None.
Étendre [1, 2] avec [3, 4] produit quatre éléments externes ; l’étendre avec "ab" ajoute deux caractères.

F

Filtrage
Le filtrage construit une collection d’éléments qui satisfont une condition en excluant ceux qui ne la satisfont pas.
Une boucle peut ajouter à une nouvelle liste uniquement les notes supérieures ou égales à 60, en conservant leur ordre d’origine.
Fonction clé
Une fonction clé calcule une valeur de comparaison à partir de chaque élément d’entrée tout en laissant les éléments d’origine intacts dans la sortie triée.
Utiliser key=len classe les mots par longueur sans remplacer ces mots par les nombres correspondant à leur longueur.

I

Identité
L’identité est le fait d’être le même objet, testé par is ; des contenus égaux peuvent appartenir à des objets listes différents.
Deux littéraux [1, 3] distincts sont égaux lors d’une comparaison, mais un test d’identité entre ces listes est faux.
Immuabilité
L’immuabilité signifie que l’état propre d’un objet ne peut pas être modifié en place ; un tuple fixe ses références aux éléments, mais pas les objets mutables qu’il contient.
Dans un tuple contenant une liste, on ne peut pas remplacer la liste à sa position, mais on peut encore lui ajouter un élément.
index()
La méthode de liste 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
Un indice est une position entière utilisée pour sélectionner un élément ; Python compte à partir de 0 au début ou de -1 à la fin.
Pour colors = ["blue", "gold"], l’indice 1 sélectionne 'gold', qui est aussi l’élément d’indice -1.
insert()
La méthode de liste 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
Un itérable est un objet qui peut fournir des éléments un à un à une boucle ou à une fonction comme list().
Un range fournit des nombres : list(range(3)) les recueille donc dans la nouvelle liste [0, 1, 2].
Itération
L’itération est le traitement répété d’éléments fournis à tour de rôle, comme une boucle for qui parcourt une liste du premier au dernier élément.
Une boucle sur names affecte chaque nom courant à la variable de boucle avant d’exécuter son corps.

J

join()
La méthode de chaîne 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
Dans un tableau constitué de listes, une ligne est une liste interne sélectionnée par le premier indice, avant qu’un second indice ne sélectionne une cellule dans cette ligne.
grid[1] récupère toute la deuxième ligne, donc len(grid[1]) compte les cellules de cette ligne.
Ligne partagée
Une ligne partagée est une liste interne référencée par plusieurs positions d’un tableau ; une modification de cellule peut donc apparaître dans plusieurs lignes affichées.
table = [row, row] stocke deux fois une même ligne, même si l’affichage du tableau montre deux positions de ligne.
Liste
Une liste est une collection ordonnée et mutable dont les éléments peuvent être lus par position. Elle peut contenir des valeurs répétées ou de types différents.
Un programme peut stocker plusieurs résultats de quiz dans scores = [73, 91, 73] et les traiter ensemble.
Liste externe
Une liste externe est le conteneur qui contient les objets internes ; modifier l’une de ses positions diffère de la mutation de l’objet à cette position.
b[0] = [9] remplace une référence à une ligne, tandis que b[0].append(9) modifie l’objet ligne existant.
Liste imbriquée
Une liste imbriquée est une liste qui contient d’autres listes ; chaque liste interne est un élément auquel on peut accéder et qu’on peut traiter séparément.
Dans [[2, 5], [7]], la liste externe contient deux lignes de longueurs deux et un.

M

Maximum courant
Un maximum courant est le plus grand élément rencontré jusque-là ; il est initialisé à partir d’un élément réel et remplacé chaque fois qu’un élément plus grand arrive.
Partir de la première mesure permet de trouver correctement la plus grande valeur lorsque toutes les mesures sont négatives.
Médiane
La médiane est la valeur du milieu dans des données triées ; pour une liste non vide d’effectif impair, c’est l’élément d’indice len(ordered) // 2.
Trier [5, 12, 2] donne [2, 5, 12], ce qui place la médiane 5 à l’indice central 1.
Méthode
Une méthode est une fonction associée à un objet et appelée par notation pointée pour effectuer une opération sur cet objet.
queue.append("next") appelle la méthode de la liste et lui fournit en argument l’élément à ajouter.
Moyenne
La moyenne d’une collection non vide de nombres est son total divisé par son nombre d’éléments ; une collection vide n’a pas de moyenne ici.
Pour les mesures [6, 10, 14], sum(readings) / len(readings) calcule une moyenne de 10.0.
Mutation
Une mutation modifie le contenu ou l’état d’un objet existant, de sorte que chaque référence à cet objet peut donner accès à la même modification.
items[0] = 7 modifie la liste ; tout alias de cette liste voit sa première position prendre la valeur 7.

N

Nom étoilé
Dans un dépaquetage, un nom étoilé recueille toutes les valeurs non affectées aux cibles non étoilées et reçoit toujours une liste.
Dans first, *rest = (4, 8, 12), rest vaut [8, 12], même si l’entrée est un tuple.
Nouvelle liaison
Une nouvelle liaison change l’objet auquel un nom fait référence sans rediriger les autres noms qui faisaient référence à l’objet précédent.
Après 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
Une opération en place modifie un objet existant de sorte que les autres références à cet objet donnent accès au même état modifié.
values.clear() vide la liste existante : chaque alias voit donc cette liste devenir vide.
Ordre décroissant
L’ordre décroissant place les valeurs de comparaison les plus grandes avant les plus petites et s’obtient avec l’option de tri nommée reverse=True.
Trier [5, 1, 8] par ordre décroissant donne [8, 5, 1] ; inverser ses positions seules donne [8, 1, 5].
Ordre lexicographique
L’ordre lexicographique compare les séquences de gauche à droite : la première paire inégale décide du résultat, ou une séquence plus courte qui correspond au début de l’autre vient en premier.
[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
Un paramètre de type liste est un nom local de fonction qui fait initialement référence à l’objet liste de l’appelant, ce qui permet à la fonction de modifier cet objet.
Une fonction qui appelle values.clear() vide la liste de l’appelant ; l’affectation values = [] ne le fait pas.
Pas de tranche
Un pas de tranche est un entier non nul qui contrôle l’espacement et la direction entre les positions sélectionnées d’une séquence.
values[1::2] sélectionne une position sur deux à partir de 1 ; un pas négatif parcourt la séquence à rebours.
pop()
La méthode de liste 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
Une recherche de la première correspondance parcourt les éléments jusqu’à ce que l’un d’eux satisfasse un test, enregistre le résultat et s’arrête avant que des correspondances ultérieures ne le remplacent.
Une boucle peut stocker l’indice de la première mesure négative et utiliser break pour terminer immédiatement la recherche.
Référence
Une référence relie un nom ou une position de conteneur à un objet ; copier cette référence ne copie pas l’objet lui-même.
b = a donne aux deux noms de variables un accès à la même liste, ce qui permet de partager les modifications.
remove()
La méthode de liste 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
Le renversement inverse l’ordre existant d’une séquence sans choisir les positions selon les valeurs ; il ne produit donc pas nécessairement un ordre croissant ou décroissant.
values.reverse() modifie une liste, tandis que values[::-1] crée une copie superficielle inversée.
Répétition
La répétition utilise * 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()
La fonction native 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()
La méthode de liste 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()
La fonction native 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()
La méthode de chaîne 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
Un test d’appartenance vérifie si une valeur égale est présente dans une collection et renvoie un résultat booléen au moyen de 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
Une tranche sélectionne une suite d’éléments au moyen de bornes et d’un pas facultatif, et renvoie une nouvelle séquence du type d’origine.
tasks[1:4] crée une liste à partir des positions 1, 2 et 3 sans inclure l’élément à la position 4.
Transformation
Une transformation calcule une valeur de sortie à partir d’un élément d’entrée, souvent en construisant une nouvelle liste contenant un résultat par élément d’origine.
Ajouter int(text) pour chaque chaîne numérique construit une liste dont on peut calculer le total avec sum().
Tri stable
Un tri stable conserve l’ordre relatif d’entrée des éléments dont les clés de comparaison sont égales, y compris lors d’un tri décroissant.
Les mots de même longueur conservent leur ordre relatif d’origine lorsque la seule fonction clé est len.
Tuple
Un tuple est une séquence ordonnée dont les éléments ne peuvent pas être remplacés, ajoutés ou supprimés après sa création.
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
Un tuple à un élément est un tuple qui ne comporte qu’une position et s’écrit avec une virgule finale pour le distinguer d’une expression regroupée entre parenthèses.
(11,) est un tuple, tandis que (11) donne l’entier 11 sans créer de collection.

V

Valeur de retour
Une valeur de retour est l’objet qu’un appel de fonction produit pour son appelant, indépendamment des modifications apportées aux arguments pendant l’appel.
Une fonction peut ajouter un élément à une liste et renvoyer tout de même None lorsque son corps ne contient pas d’instruction return explicite.
Valeur hachable
Une valeur hachable respecte les règles d’accès stable nécessaires aux clés de dictionnaire ; le contenu d’un tuple doit être hachable, et les listes ne le sont pas.
(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
Une valeur par défaut 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.
Avec values=None, la branche if values is None: values = [] évite une liste par défaut partagée accidentellement.
Variable de boucle
Une variable de boucle est un nom lié à l’élément courant à chaque passage ; lui donner une nouvelle liaison ne modifie pas la liste d’origine par affectation.
Dans 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()
La fonction native 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.
Associer trois noms à deux notes crée deux paires ; le nom sans correspondance nécessite une décision distincte.

À propos de cette unité

Par StudeliSignaler une erreur

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.

Commencer