Skip to article frontmatterSkip to article content

c’est quoi une séquence ?

les séquences dans le langage Python (entre autres):

fonctions sur toutes les séquences

indexation, longueur

les séquences sont des itérables

un itérable en Python, c’est un objet sur lequel on peut faire un for

for item in S:
    # do something with item

concaténation, comparaisons

appartenance, recherches

slicing

voyons des exemples de tout ceci

indices omis et négatifs

s = "egg, bacon"
s[0:3]
'egg'
# si on omet une borne
# ce sera le début ..
s[:3]
'egg'
# ... ou la fin:
s[5:]
'bacon'
# les indices peuvent être négatifs
s[-3:10]
'con'
# tout entier: une shallow-copy
s[:]
'egg, bacon'

les bornes

La convention est choisie pour pouvoir facilement “encastrer” les slices:

s[0:3]
'egg'
s[3:6]
', b'
s[6:]
'acon'
s[0:3] + s[3:6] + s[6:] == s
True

le pas

s[0:10:2]
'eg ao'
s[::2]
'eg ao'
s[:8:3]
'e,a'
s[-2::-3]
'obg'

pas d’exception

les slices ont un comportement plus permissif que l’indexation

# Si j'essaie d'utiliser un index inexistant
try: s[100]
except Exception as e: print("OOPS", e)
OOPS string index out of range
# par contre avec un slice, pas de souci
s[5:100]
'bacon'
# vraiment..
s[100:200]
''

exemples

s[-1]
'n'
s[-3:-1]
'co'
s[:-3]
'egg, ba'
s[::-1]
'nocab ,gge'
s[2:0:-1]
'gg'
s[2::-1]
'gge'

formes idiomatiques

s = [1, 2, 3]

# une copie simple
s[:]
'egg, bacon'
# copie renversée
s[::-1]
'nocab ,gge'

str pour manipuler du texte

écrire une str de manière littérale

# une chaine entre double quotes
# pas de souci pour les accents
print("c'est l'été")
c'est l'été
# entre simple quotes
print('on se dit "pourquoi pas"')
on se dit "pourquoi pas"

sur plusieurs lignes

# bien sûr ici vous pouvez remplacer les """ par '''

print("""et pour entrer plusieurs lignes,
ou bien des chaines avec des " et des '
c'est facile aussi""")
et pour entrer plusieurs lignes,
ou bien des chaines avec des " et des '
c'est facile aussi

chaînes de caractères accolées

s = "le début" " et la fin"
print(s)
le début et la fin
s = ("une chaine trop longue"
     " pour tenir sur une ligne")
print(s)
une chaine trop longue pour tenir sur une ligne

échappements dans les chaines

s = "deux\nlignes"
print(s)
deux
lignes
s = 'des\ttrucs\tespacés'
print(s)
des	trucs	espacés
# imaginons qu'on ait les deux sortes de guillemets
s = "simple' double\""
print(s)
simple' double"
s = 'backslash \\\tquote \''
print(s)
backslash \	quote '

raw-strings

voici un problème commun, surtout sous Windows:
on aurait envie d’écrire

s = 'C:\Temp\test.txt'
# du coup on est amené à utiliser plutôt une raw-string

s = r'C:\Temp\test.txt'
print(s)
C:\Temp\test.txt

en dehors des raw-strings, on utilise fréquemment des backslash pour échapper les caractères spéciaux

séquencesignification
\nnouvelle ligne
\ttabulation
\rretour chariot
\\backslash
\'apostrophe
\"guillemet

docstrings

une docstring est une chaine littérale insérée au tout début du code d’une fonction (ou classe ou module) et qui sert à la documenter
on utilise souvent les triples guillemets pour cela

def double(n):
    """
    Returns the double of its input parameter

    The help message usually spans several lines
    """
    return 2*n
help(double)
Help on function double in module __main__:

double(n)
    Returns the double of its input parameter

    The help message usually spans several lines

opérations sur les str

toutes les opérations des séquences

que l’on a déjà vues :

s1 = 'abcdéfg'
s2 = 'bob'
len(s1)
7
# concaténation
s1 + s2
'abcdefbob'
'abcdefbob'
# slicing
s1[-1::-2]
'géca'
'=' * 30
'=============================='
# est-ce une sous-chaine ?
'cdé' in s1
True
# à quelle position ?
s1.index('cdé')
2

objet str non mutable

par contre ATTENTION un str n’est pas mutable

try:
    s1[2] = 'x'
except TypeError as e:
    print("OOPS", e, type(e))
OOPS 'str' object does not support item assignment <class 'TypeError'>

méthodes sur les str

strip()

# j'ai lu une chaine dans un fichier
# je ne sais pas trop s'il y a des espaces à la fin
# et si la chaine contient un newline

dirty = "  des blancs au début et à la fin et un newline  \n"
dirty
' des blancs au début et à la fin et un newline \n'
# c'est la méthode la plus simple pour nettoyer
dirty.strip()
'des blancs au début et à la fin et un newline'

split() et join()

# une chaine à découper
s = "une phrase\nsur deux lignes"
s
'une phrase\nsur deux lignes'
# sans argument, split
# découpe selon les espaces
# et tabulations et newline
liste = s.split()
liste
['une', 'phrase', 'sur', 'deux', 'lignes']
# recoller les morceaux
"".join(liste)
'unephrasesurdeuxlignes'
# le plus souvent
" ".join(liste)
'une phrase sur deux lignes'
# ou n'importe quel autre séparateur
"+++".join(liste)
'une+++phrase+++sur+++deux+++lignes'

remplacements, recherches

s = "une petite phrase"
s.replace('petite', 'grande')
'une grande phrase'
# l'index du premier caractère
s.find('hra')
12
s[12]
'h'

et plein d’autres..

un peu d’introspection (avancé)

disons qu’on voudrait savoir combien de méthodes sont disponibles sur les chaines.

type("abc")
str
str
str
# 'str' est une variable prédéfinie, qui référence
# le type (la classe) de toutes les chaines
type("abc") is str
True
# du coup son type, c'est .. le type <type>
type(str)
type

un peu d’introspection...

# peu importe... quoi qu'il en soit, dir(str) retourne la liste
# des noms de méthodes connues sur cette classe;
# regardons par exemple les premiers et les derniers
dir(str)[:2], dir(str)[-2:]
(['__add__', '__class__'], ['upper', 'zfill'])
# avec len() je peux savoir combien il y en a
len(dir(str))
81
# mais en fait, pour un décompte significatif
# on enlève celles dont le nom contient `__`
methods = [method for method in dir(str)
           if '__' not in method]
len(methods)
47
# est-ce que les chaines ont une méthode 'split' ?
'split' in methods
True