Un cap pour ce chapitre
Ce que vous saurez faire
- Lire une compréhension dans l’ordre logique
- Construire un tableau transformé avec ou sans filtre
- Traduire une compréhension en parcours explicite
Produire une valeur pour chaque entrée
L’expression [x * x for x in range(5)] construit le tableau [0, 1, 4, 9, 16]. Même si le calcul apparaît à gauche dans la syntaxe, on lit d’abord le parcours : x prend les valeurs de range(5). Pour chacune, on évalue x * x et on ajoute ce résultat au nouveau tableau. La compréhension ne demande pas de changer range ni de modifier une case existante. Elle construit un résultat à partir d’une règle. Commencez par des exemples courts afin de pouvoir vérifier chaque association entrée-sortie.
La règle peut utiliser la valeur directement ou calculer une nouvelle valeur. Sans condition, chaque entrée produit exactement une sortie. La longueur est donc prévisible avant le calcul, même lorsque plusieurs entrées donnent le même résultat.
Filtrer avant de produire
Une condition placée après le parcours sélectionne les entrées retenues. Dans [x * x for x in valeurs if x > 0], les valeurs positives sont gardées, puis leur carré est produit. Pour valeurs = [-3, 0, 2, 5], le résultat est [4, 25]. Il faut distinguer la condition portant sur x et une condition portant sur le résultat transformé. Filtrer les x positifs ne donne pas la même chose que conserver les carrés positifs, puisque le carré d’un entier négatif est lui aussi positif.
Le filtre décide si une entrée produit quelque chose, sans remplacer les entrées refusées par zéro. Un tableau résultat plus court conserve donc seulement les éléments sélectionnés, dans leur ordre initial. Cela diffère d’une transformation qui conserverait toutes les positions.
Retrouver la boucle derrière l’expression
Une compréhension peut se développer en un parcours qui construit progressivement un tableau résultat. Cette traduction aide à expliquer une expression et à la déboguer. Dans les exercices, on peut suivre une table avec valeur lue, test, valeur produite et tableau partiel. Une compréhension devrait rester lisible : si la règle demande de nombreux cas, plusieurs étapes ou des effets sur d’autres données, une fonction et une boucle explicite peuvent mieux exprimer le traitement. L’objectif n’est pas de condenser le plus de code possible sur une ligne.
valeurs = [-3, 0, 2, 5]
carres_positifs = [x * x for x in valeurs if x > 0]La table de trace doit séparer les colonnes « entrée », « condition » et « production ». Pour une entrée refusée, la production est absente, et non nulle. Une compréhension avec plusieurs effets ou de nombreuses conditions doit être décomposée pour rester explicable.
Vérifier taille, ordre et absence de modification
Sans filtre, le résultat contient autant d’éléments que le parcours. Avec un filtre, il peut en contenir moins, éventuellement aucun. L’ordre du parcours est conservé pour les éléments retenus : une compréhension ne trie pas automatiquement ses résultats. Elle ne supprime pas non plus les doublons, sauf si la règle le prévoit par un autre mécanisme. Dans nos exemples d’entiers, le tableau d’origine reste inchangé. Ces propriétés permettent d’anticiper le résultat avant de calculer chaque valeur et de repérer une réponse qui ne peut pas être correcte.
Avec un tableau vide, une compréhension à un seul parcours produit naturellement un tableau vide. Avec un filtre toujours faux, le résultat est également vide, mais pour une autre raison. Comparer ces deux situations permet de distinguer absence d’entrée et rejet de toutes les entrées.
La condition porte sur une étape déterminée
Pour [-3, -1, 0, 2], l’expression [x * x for x in t if x > 0] produit [4]. Si l’on filtre plutôt les carrés strictement positifs, les entrées moins trois et moins un conviennent aussi : le résultat devient [9, 1, 4]. Le carré transforme le signe et peut donc changer la signification d’un critère de positivité.
Avant d’écrire la condition, formulez précisément la question : sélectionner des mesures positives puis les mettre au carré, ou sélectionner les mesures dont le carré est positif. Les deux formulations utilisent les mêmes opérations, mais ne sélectionnent pas les mêmes données.
Produire les positions plutôt que les valeurs
On cherche les indices des notes atteignant douze dans [9, 14, 12, 8, 14]. Le parcours doit porter sur range(len(notes)), la condition sur notes[i] >= 12 et la production sur i. Le résultat est [1, 2, 4]. Si la production devient notes[i], on obtient les notes [14, 12, 14].
Les deux résultats ont ici la même longueur mais un sens différent. Choisir la variable de parcours selon le résultat demandé évite de reconstruire ensuite des indices à partir de valeurs répétées. Les deux occurrences de quatorze possèdent des positions distinctes qu’il faut conserver.
À vous de faire varier les choses
Suivez chaque valeur jusqu’au résultat
Choisissez la transformation et le filtre. Observez les éléments refusés et la manière dont les valeurs retenues sont transformées.
Lire le résultat de l’expérience initiale
Résultat : [4, 25]
Le tableau initial reste [-3, -2, 0, 2, 5]. Le filtre porte sur x avant sa transformation.
| Entrée x | Filtre | Valeur produite |
|---|---|---|
| -3 | Exclu | Aucune production |
| -2 | Exclu | Aucune production |
| 0 | Exclu | Aucune production |
| 2 | Retenu | 4 |
| 5 | Retenu | 25 |
La table de correspondance révèle la différence entre sélectionner une entrée et transformer sa valeur.
De la compréhension à l’autonomie
À vous de résoudre
Cherchez d’abord par vous-même. Vérifiez les résultats demandés, utilisez les indices si nécessaire, puis comparez votre méthode à la correction.
Lire une transformation
Donnez le résultat de [2 * x + 1 for x in range(4)]. Expliquez le nombre d’éléments obtenu.
Indice 1
range(4) parcourt 0, 1, 2 et 3.
Indice 2
Calculez l’expression une fois pour chaque valeur.
Comprendre la correction
Les résultats sont 1, 3, 5 et 7, donc le tableau construit est [1, 3, 5, 7]. Il contient quatre éléments parce que le parcours possède quatre valeurs et qu’aucun filtre n’en exclut. Le dernier résultat 7 ne signifie pas que range a parcouru jusqu’à 7.
Filtrer puis transformer
Pour t = [-2, 3, 0, 5, -1], calculez [x + 10 for x in t if x > 0].
Indice 1
La condition est évaluée sur la valeur initiale x.
Indice 2
Les valeurs retenues sont 3 et 5.
Comprendre la correction
Les valeurs positives 3 et 5 produisent respectivement 13 et 15. Le résultat est [13, 15]. Les valeurs - 2, 0 et -1 sont exclues avant la transformation ; le fait que leur somme avec 10 serait positive ne change pas le critère effectivement écrit.
Des doublons qui restent
Un élève attend [1, 4] pour [x * x for x in [-2, -1, 1, 2]]. Pourquoi cette réponse est-elle incorrecte ?
Indice 1
Aucune condition ne supprime une entrée.
Indice 2
Deux entrées différentes peuvent produire le même résultat.
Comprendre la correction
Le résultat réel est [4, 1, 1, 4]. Il respecte l’ordre des quatre entrées et conserve une production par entrée. Une compréhension ne déduplique pas et ne trie pas automatiquement. Pour attendre [1, 4], il faudrait annoncer d’autres opérations, qui ne figurent pas dans cette expression.
Construire une règle
Écrivez une compréhension donnant les indices des éléments strictement supérieurs à 10 dans t = [8, 14, 10, 17].
Indice 1
Le résultat demandé contient des positions, pas les valeurs 14 et 17.
Indice 2
Parcourez range(len(t)) et testez t[i].
Comprendre la correction
On écrit [i for i in range(len(t)) if t[i] > 10]. Le résultat est [1, 3]. La valeur 10 à l’indice 2 est exclue car la comparaison est stricte. Écrire [x for x in t if x > 10] donnerait [14, 17], qui répond à une autre question.
Sélectionner avant ou après le carré
Avec t = [-3, -1, 0, 2], calculez [x*x for x in t if x > 0] puis [x*x for x in t if x*x > 0]. Expliquez chaque exclusion et indiquez si le tableau original change.
Indice 1
Un nombre négatif peut avoir un carré positif.
Indice 2
Zéro reste nul après multiplication par lui-même.
Comprendre la correction
La première expression retient seulement deux et donne [4]. La seconde retient moins trois, moins un et deux, donnant [9, 1, 4]. Zéro est exclu dans les deux cas. Les compréhensions construisent de nouveaux tableaux ; le tableau original reste identique. Le critère porte sur des expressions différentes.
Des alertes localisées
Pour t = [8, 13, 11, 16, 13], écrivez une compréhension donnant les indices des valeurs strictement supérieures à douze. Donnez ensuite celle produisant les valeurs elles-mêmes et comparez leurs résultats.
Indice 1
Une production d’indice doit parcourir les positions.
Indice 2
Les deux occurrences de treize doivent être conservées.
Comprendre la correction
Les indices s’obtiennent avec [i for i in range(len(t)) if t[i] > 12], soit [1, 3, 4]. Les valeurs s’obtiennent avec [x for x in t if x > 12], soit [13, 16, 13]. La répétition de treize ne supprime aucune entrée ; chaque occurrence répond au critère.
Un filtre qui conserve zéro
On transforme [-4, -1, 0, 3, 4] en doublant seulement les nombres pairs. Écrivez la compréhension, donnez le tableau produit et expliquez le traitement de zéro et des négatifs. Quelle longueur maximale peut avoir le résultat ?
Indice 1
Un entier pair possède un reste nul dans la division par deux.
Indice 2
Le filtre ne dépend pas du signe.
Comprendre la correction
L’expression [2*x for x in t if x % 2 == 0] produit [-8, 0, 8]. Moins quatre et zéro sont pairs, donc retenus. Le résultat possède trois éléments et ne peut jamais dépasser cinq éléments pour ce parcours : chaque entrée produit au maximum une sortie.
Les erreurs qui méritent un détour
- Lire le calcul avant de connaître la valeur parcourue
- Lisez mentalement le parcours, puis le filtre, puis l’expression produite.
- Attendre un tri ou une suppression automatique des doublons
- La compréhension conserve l’ordre et produit une valeur pour chaque entrée retenue.
La fiche à garder
L’essentiel à retenir
- Une compréhension construit un nouveau tableau.
- Le filtre porte sur l’expression réellement écrite.
- Valeurs et indices demandent des parcours différents.
Le prochain pas
Retrouver le catalogue de Première
Ce chapitre s’appuie sur le programme officiel de Première (PDF, nouvel onglet). Les explications et exercices sont proposés pour l’apprentissage.
