====== Séquences, méthodes plus avancées ====== Dans [[nsi:langages:python:sequences|le chapitre sur les bases]] on a présenté ce qu'était une séquence et comment on accédait à ses éléments. En Python, on dispose de syntaxe permettant d'aller plus loin. ===== Indice négatif ===== Un indice négatif indique que l'on compte depuis la fin : >>> t = [4, 19, 25, 78, 29] >>> t[-1] 29 >>> t[-2] 78 >>> t[-5] 4 >>> t[-6] IndexError: list index out of range Autrement dit, si ''%%n = len(t)%%'' alors ''%%t[-1]%%'' est équivalent à ''%%t[n-1]%%''. ===== Slices ===== Les **slices** sont des découpage que l'on pourra faire dans les séquences. Python est très efficace pour cela -- //slice = tranche, comme un tranche de saucisson.// >>> t = [4, 19, 25, 78, 29, 42, 15, 89] >>> t[2:5] [25, 78, 29] En choisissant ''%%2:5%%'' à la place de l'indice, on indique que l'on veut les éléments allant du rang 2 au rang **5 non compris**. C'est une constante de la syntaxe Python. Quand on indique **de a à b**, il faut comprendre que **b est exclus**. Les possibilités sont très nombreuses : >>> t = [4, 19, 25, 78, 29, 42, 15, 89] >>> t[:3] # jusque au rang 3 [4, 19, 25] >>> t[3:] # à partir du rang 3 [78, 29, 42, 15, 89] >>> t[:-1] # jusqu'au dernier (non compris comme toujours) [4, 19, 25, 78, 29, 42, 15] >>> t[-2:] # les deux derniers [15, 89] La syntaxe est la même pour une chaîne de caractères >>> t = "abcdefghij" >>> t[:3] # jusque au rang 3 'abc' >>> t[3:] # à partir du rang 3 'defghij' >>> t[:-1] # jusqu'au dernier (non compris comme toujours) 'abcdefghi' >>> t[-2:] # les deux derniers 'ij' Un peu surprenant, on n'a pas de //IndexError// avec une slice : >>> t = "abcdefghij" >>> t[5:1000] 'fghij' ==== Indiquer un pas ==== On peut également indiquer que l'on souhaite parcourir la séquence de 2 en 2, de 3 en 3... >>> t = "abcdefghijjlmn" >>> t[1:8:3] 'beh' ''%%1:8:3%%'' -> Du rang 1 au rang 8 (exclus) par pas de 3, donc les rangs 1, 4, 7 En enlevant le 8, ''%%1::3%%'' -> Du rang 1 à la fin, par pas de 3. >>> t = "abcdefghijjlmn" >>> t[1::3] 'behjn' Et avec un pas négatif, on peut parcourir à l'envers ! >>> t = "abcdefghijjlmn" >>> t[8:1:-3] # parcours les rangs 8, 5, 2 'ifc' >>> t[::-1] # totalité, à l'envers ! 'nmljjihgfedcba' ===== Concaténations ===== Concaténer deux séquences ''a'' et ''b'', c'est créer une 3e séquence ''c'' constituée de ''a'' et ''b'' mises bout à bout. On utilise cela l'opérateur ''+''. >>> [4, 5, 6] + [7, 8, 9] [4, 5, 6, 7, 8, 9] >>> "abc" + "def" 'abcdef' >>> (1, 2) + (7, 8) (1, 2, 7, 8) En lisant l'opérateur ''+'', Python examine les opérandes et adapte son comportement. * ''%%3 + 7%%'' : les opérandes sont des entiers, Python réalise une addition ordinaire, * ''%%"abc" + "xyz"%%'' : les opérandes sont des chaînes, Python réalise une concaténation, * ''%%"abc" + 5%%'' : voyant une chaîne, Python tente une concaténation mais cela ne fonctionnera pas avec l'entier -> ''%%TypeError: can only concatenate str (not "int") to str%%''. Dans la même logique, on peut utiliser l'opérateur ''%%*%%'' : >>> "ab" + "ab" + "ab" 'ababab' >>> "ab" * 3 'ababab' ===== Dépaquetage (unpack) ===== On peut distribuer les items contenus dans une séquence vers des variables, à condition que les variables soient en nombre égal au nombre d'items. >>> a, b, c = "xyz" >>> a 'x' >>> b 'y' >>> c 'z' Dans cet exemple, la chaîne ''%%"xyz"%%'' contient 3 items, des caractères. En écrivant ''%%a, b, c = "xyz"%%'' on affecte aux variables ''a'', ''b'' et ''c'' ces 3 caractères, respectivement. Si on met trop ou pas assez de variables, on a une erreur. >>> t = 4, 9, 17 >>> a, b, c, d = t ValueError: not enough values to unpack (expected 4, got 3) >>> a, b = t ValueError: too many values to unpack (expected 2) Ce mécanisme est surtout utilisé avec les tuples -- ci dessous, un extrait de [[nsi:langages:python:p-uplets_et_tableaux|p-uplets - tuple]] {{section>nsi:langages:python:p-uplets_et_tableaux#Cas d'utilisation&nofooter}}