%% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %%
> [!nav]
> ↩ [[Code et Développement/Programmation/Lecture de Code - Python/Lecture de code - Python|Accueil · Lecture de code - Python]]
>
> | [[Code et Développement/Programmation/Lecture de Code - Python/07_listes\|← Listes]] | [[Code et Développement/Programmation/Lecture de Code - Python/09_tuples\|Tuples →]] |
> |:---|---:|
%% nav-fin %%
# Tranches et séquences (slicing)
Le slicing s'applique à toute **séquence** Python : chaînes (`str`), listes (`list`), tuples (`tuple`).
---
## Syntaxe générale
```python
seq[debut:fin:pas]
```
| Paramètre | Défaut | Signification |
|---|---|---|
| `debut` | 0 | indice de départ (inclus) |
| `fin` | `len(seq)` | indice de fin (exclu) |
| `pas` | 1 | saut entre chaque élément |
---
## Indices positifs
```python
s = "abcde"
s[1:4] # vaut 'bcd' indices 1, 2, 3
s[2:] # vaut 'cde' de l'indice 2 jusqu'à la fin
s[:3] # vaut 'abc' du début à l'indice 3 exclu
s[:] # vaut 'abcde' copie complète
```
**Règle :** `s[a:b]` contient `b - a` éléments (si a < b).
---
## Indices négatifs
Les indices négatifs comptent depuis la fin : `-1` désigne le dernier élément, `-2` l'avant-dernier. Le composant ci-dessous affiche, sous chaque caractère, son indice positif et son indice négatif.
```python
s = "abcde"
s[-1] # vaut 'e' dernier caractère
s[-3:] # vaut 'cde' les 3 derniers
s[:-2] # vaut 'abc' tout sauf les 2 derniers
s[-4:-1] # vaut 'bcd' de l'indice -4 à l'indice -1 exclu
```
---
## Le pas
```python
s = "abcdefgh"
s[::2] # vaut 'aceg' un caractère sur deux
s[1::2] # vaut 'bdfh' un sur deux en commençant à 1
s[::-1] # vaut 'hgfedcba' chaîne inversée
s[6:1:-2] # vaut 'gec' de 6 à 1 exclu, pas de -2
```
**Astuce classique :** `s[::-1]` inverse une séquence.
**À manipuler :** écrivez un indice ou une tranche, les caractères pris s'affichent dans l'ordre.
```sq-tranche
séquence: "abcdefgh"
expression: s[6:1:-2]
```
---
## Slicing sur les listes
La syntaxe est la même. Le résultat est une nouvelle liste.
```python
lst = [10, 20, 30, 40, 50]
lst[1:4] # vaut [20, 30, 40]
lst[::-1] # vaut [50, 40, 30, 20, 10] liste inversée
lst[::2] # vaut [10, 30, 50] un élément sur deux
# Modification par tranche
lst[1:3] = [99, 88] # lst vaut [10, 99, 88, 40, 50]
```
---
**À manipuler :** la même syntaxe sur une liste.
```sq-tranche
séquence: [10, 20, 30, 40, 50]
nom: lst
expression: lst[1:4]
```
## Tableau récapitulatif
| Expression | Résultat sur `"abcde"` | Sens |
|---|---|---|
| `s[1:4]` | `'bcd'` | indice 1 à 3 |
| `s[2:]` | `'cde'` | de 2 à la fin |
| `s[:3]` | `'abc'` | du début à 2 |
| `s[-2:]` | `'de'` | les 2 derniers |
| `s[:-1]` | `'abcd'` | tout sauf le dernier |
| `s[::-1]` | `'edcba'` | inversé |
| `s[::2]` | `'ace'` | un sur deux |
---
## Pièges fréquents
- **La borne de fin est exclue** : `s[1:4]` contient les indices 1, 2, 3, soit `4 - 1 = 3` éléments.
- **Début supérieur ou égal à la fin avec un pas positif : tranche vide** : `s[5:1]` vaut `''`. Pour parcourir de 5 vers 1, il faut un pas négatif : `s[5:1:-1]`.
- **Une tranche hors limites ne provoque pas d'erreur** : `s[0:100]` sur une chaîne de 5 caractères renvoie `s` entière.
- **`lst[::-1]` renvoie une nouvelle liste** : la liste d'origine est inchangée.
---
## Exemple — couper une chaîne en deux moitiés
```python
s = input() # entrée : abcdef
n = len(s) # n vaut 6
mid = (n + 1) // 2 # mid vaut 3
print(s[mid:] + s[:mid])
```
**Trace** : `s[3:]` vaut `'def'` et `s[:3]` vaut `'abc'`. **Sortie : `defabc`**
%% nav-debut : généré par gen_navigation.py, ne pas modifier à la main %%
> [!nav]
> ↩ [[Code et Développement/Programmation/Lecture de Code - Python/Lecture de code - Python|Accueil · Lecture de code - Python]]
>
> | [[Code et Développement/Programmation/Lecture de Code - Python/07_listes\|← Listes]] | [[Code et Développement/Programmation/Lecture de Code - Python/09_tuples\|Tuples →]] |
> |:---|---:|
%% nav-fin %%