Un rappel rapide de ce qui existe.
Il existe 4 types de données numériques avec Python.
bool
)Ils sont constitués de False
et True
.
C'est officiellement un type numérique, mais il est hors programme d'utiliser des booléens dans des opérations comme +
ou *
.
int
)Les entiers sont signés, ils peuvent être aussi grands que la mémoire de l'ordinateur le permet, il n'y a pas de limite théorique.
Un rappel des opérations classiques.
float
)Ils sont constitués des nombres à virgule, ils peuvent s'écrire en notation scientifique en binaire 53 bits pour la mantisse et 11 bits pour l'exposant. Ce qui donne environ une précision de 16 chiffres en décimal, et un exposant décimal environ entre -300 et +300.
Un rappel des opérations classiques.
complex
)Pour les élèves en maths expertes...
Les objets Python de type numérique sont qualifiés d'immuables. Même si une variable numérique peut changer de valeur, la valeur, elle, est fixe !
x = 1337 x = x // 100
La variable x
a été modifiée, mais les nombres , et sont immuables.
Cette notion sera utilisée plus tard, au sujet des dictionnaires, les nombres peuvent être des clés de dictionnaires justement par ce qu'ils sont immuables.
More about Python numbers ; en anglais
Les chaînes de caractères (string, de type str
) sont aussi des objets Python immuables, ils pourront être des clés de dictionnaires.
Pour construire une chaîne de caractère dans un code Python, on utilise les délimiteurs :
'
: guillemet simple."
: guillemet double.'''
: triple guillemet simple."""
: triple guillemet double.Remarque : le guillemet simple n'est pas une apostrophe dactylographique, même si on utilise cette même touche pour l'obtenir. La touche du clavier '
est la touche guillemet simple.
salut_en = 'Hello World!' # en anglais, le ! est collé au mot salut_fr = "Bonjour à tous !" # en français, le ! n'est pas collé phrase_1 = 'Il a dit "Bonjour" à tous.' phrase_2 = """Il m'a dit "Bonjour" aussi.""" chaîne_vide = "" un_seul_caractère = 'c'
⚠️ Dans phrase_2
, on ne pouvait pas utiliser ni '
, ni "
qui étaient déjà utilisés à l'intérieur.
Les chaînes de caractères sont indicées à partir de zéro.
Indice 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Caractère B o n j o u r à t o u s !
>>> salut_fr = 'Bonjour à tous !' >>> salut_fr[0] 'B' >>> salut_fr[1] 'o' >>> salut_fr[6] 'r' >>> salut_fr[9] ' ' >>> salut_fr[15] '!' >>> len(salut_fr) 16
Ici la chaîne est de longueur (length) , comme donné par la fonction len
.
Pour une chaîne de caractères de longueur les indices vont de inclus à exclu.
⚠️ Essayer d'accéder à un caractère d'indice ou plus provoque une erreur.
>>> salut_fr[16] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: string index out of range
Ici l'erreur est IndexError
(Erreur d'indice), string index out of range (indice de la chaîne en dehors de l'intervalle).
On peut itérer sur les chaînes de deux façons.
mot = "Salut" longueur = len(mot) for i in range(longueur): print("La lettre d'indice", i, "est", mot[i])
La lettre d'indice 0 est S La lettre d'indice 1 est a La lettre d'indice 2 est l La lettre d'indice 3 est u La lettre d'indice 4 est t
mot = "Salut" for caractère in mot: print("Voici un caractère :", caractère)
Voici un caractère : S Voici un caractère : a Voici un caractère : l Voici un caractère : u Voici un caractère : t
On peut savoir si une sous chaîne extrait
est incluse dans une chaîne phrase
avec le code extrait in phrase
.
CONST_voyelles = "aeiouyAEIOUY" mot = "Bonjour" for lettre in mot: if lettre in CONST_voyelles: print(lettre, end="")
oou
Ce code n'affiche que les voyelles de mot
après avoir testé si lettre
est dans CONST_voyelles
.
Python autorise aussi les indices négatifs, cela peut être très pratique.
Faisons une boucle avec une chaîne, et
Indice -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6
Chaîne B o n j o u r B o n j o u r
Pour une chaîne de longueur , les indices Python valables vont de inclus à exclu. ⚠️ Les indices négatifs ne sont pas légaux avec tous les langages de programmation, ici c'est un exemple de sucre syntaxique autorisé par Python, pour simplifier certains codes.
Python autorise l'extraction d'une tranche d'une chaîne de caractères.
Indice 0 1 2 3 4 5 6 7 8 9 Chaîne T r a v a i l l e r
>>> verbe = "Travailler" >>> verbe[3:6] # du 3 inclus au 6 exclu 'vai' >>> verbe[:4] # du début au 4 exclu 'Trav' >>> verbe[:7] # les 7 premiers (du début au 7 exclu) 'Travail' >>> verbe[7:] # tout sauf les 7 premiers (du 7 inclus à la fin) 'ler' >>> verbe[-2:] # les deux derniers 'er' >>> verbe[:-2] # tout sauf les deux derniers 'Travaill' >>> verbe[:] # une copie complète 'Travailler'
On utilise la fonction input()
pour récupérer une chaîne depuis un utilisateur qui utilise un programme Python.
print("Quel est ton prénom ?") prénom = input() print("Tu t'appelles", prénom)
Quel est ton prénom ? Franck Tu t'appelles Franck
⚠️ Avec Python3, La fonction input()
renvoie une chaîne de caractères ; toujours.
print("Quel est ton âge ?") âge = input() print("Dans dix ans, tu auras", âge + 10)
Quel est ton âge ? 42 Traceback (most recent call last): File "<stdin>", line 3, in <module> TypeError: can only concatenate str (not "int") to str
On expliquera bientôt ce qu'est la concaténation, mais simplement, ici, Python ne sait pas ajouter du texte et un entier, c'est une erreur de type (TypeError
).
Pour travailler avec des nombres donnés par un utilisateur, il faut les convertir avec les fonctions
int()
ou bienfloat()
.
print("Quel est ton âge ?") âge = int(input()) print("Dans dix ans, tu auras", âge + 10, "ans.") print("Quelle est ta masse en kg ?") masse = float(input()) # en kg print("Si tu prends 3.2kg, ta masse sera", poids + 3.2, "kg.")
Quel est ton âge ? 42 Dans dix ans, tu auras 52 ans. Quelle est ta masse en kg ? 74.3 Si tu prends 3.2kg, ta masse sera 77.5 kg.
À retenir
texte = input()
entier = int(input())
nombre = float(input())
Nous avons évoqué la concaténation, un peu avant ; voyons quelles opérations élémentaires on peut faire avec les chaînes de caractères.
La concaténation, c'est le fait de rabouter, de coller, deux chaînes.
>>> "bon" + "jour" 'bonjour' >>> "bon" + "bon" 'bonbon' >>> "bon" * 2 'bonbon' >>> "O" * 10 'OOOOOOOOOO'
On peut donc aussi multiplier une chaîne de caractère avec un entier, on obtient plusieurs copies de la chaîne collées ensemble.
⚠️ Cette technique n'existe pas avec tous les langages de programmation, elle est peut-être hors programme.
Il est possible d'écrire des sauts de lignes, ou des tabulations dans une chaîne de caractères.
'\n'
est le caractère saut de ligne,'\t'
est le caractère tabulation horizontal,More about Python string ; en anglais
Les listes d'éléments (list, de type list
) sont des objets Python muables.
str
immuables.list
comme des clés de dictionnaire, mais on pouvait le faire avec les str
.À part cette grande différence, il y a de nombreux points communs entre str
et list
pour les débutants. Nous allons voir comment construire, accéder, modifier, itérer.
Pour construire une liste dans un code Python, on utilise les délimiteurs :
[
: pour débuter]
: pour finir,
: pour séparer⚠️ Même s'il est possible de construire des listes avec des éléments de types différents, nous le déconseillons.
cours_nsi = ["lundi", "mercredi", "vendredi"] nb_premiers = [2, 3, 5, 7, 11] hauteurs = [1.82, 1.75, 1.68, 1.89] liste_vide = [] liste_avec_un_élément = [1337]
Les listes sont indicées à partir de zéro.
>>> cours_nsi[0] 'lundi' >>> nb_premiers[3] 7 >>> hauteurs[-1] 1.89
Comme pour les str
, les indices négatifs sont autorisés en Python, tout comme les tranches.
⚠️ Point délicat à signaler. Voyons deux façons de copier une liste.
>>> ma_liste = [10, 11, 12, 13, 14] >>> ma_liste_copie1 = ma_liste >>> ma_liste_copie2 = ma_liste[:]
ma_liste_copie1
sur la même liste, nous avons deux variables qui pointent vers le même objet.La preuve :
>>> ma_liste[0] = -1 >>> ma_liste_copie1 [-1, 11, 12, 13, 14] >>> ma_liste_copie2 [10, 11, 12, 13, 14]
On constate qu'en modifiant ma_liste
:
ma_liste_copie1
est modifiée également ; oui, c'est bien la même liste !ma_liste_copie2
n'est pas modifiée ; en effet c'était une copie devenue indépendante !Comme pour les str
, on utilise la fonction len()
(pour length, longueur), pour connaître le nombre d'éléments d'une liste.
>>> len(hauteurs) 4
Comme pour les chaînes, x in ma_liste
renvoie un booléen, la réponse à : x
est-il dans ma_liste
?
Comme pour les str
, on peut itérer sur une liste de deux manières différentes.
hauteurs = [1.82, 1.75, 1.68, 1.89] nb_élements = len(hauteurs) somme = 0.0 for i in range(nb_éléments): somme = somme + hauteurs[i] print("La hauteur totale est", somme)
La hauteur totale est 7.14
hauteurs = [1.82, 1.75, 1.68, 1.89] somme = 0.0 for h in hauteurs: somme = somme + h print("La hauteur totale est", somme)
La hauteur totale est 7.14
On constate que la deuxième méthode est bien plus simple. Elle est très utile lorsqu'on n'a pas besoin de l'indice pendant la boucle.
Voyons maintenant des méthodes alternatives de construction de liste.
Comme pour les str
, on peut concaténer des listes.
début = [2, 3, 5, 7, 11] suite = [13, 17, 19, 23] print(début + suite)
[2, 3, 5, 7, 11, 13, 17, 19, 23]
tab = [0] * 5 print(tab)
[0, 0, 0, 0, 0]
Cette dernière méthode est souvent utilisée pour initialiser de grands tableaux pleins de zéros.
⚠️ Le programme préconise plutôt une autre méthode, la construction des listes en compréhension.
La syntaxe Python générale d'une création de liste en compréhension est :
<nom_liste> = [ <élément(it)> for it in itérable if <condition(it)> ]
Elle permet de créer une liste d'images (au sens des fonctions en mathématiques) depuis une liste d'antécédents, et avec la possibilité de filtrer suivant une condition.
Voyons des exemples progressifs.
>>> [0 for _ in range(5)] [0, 0, 0, 0, 0] >>> [lettre + "_" for lettre in "azerty"] ['a_', 'z_', 'e_', 'r_', 't_', 'y_'] >>> [i*i for i in range(6)] [0, 1, 4, 9, 16, 25] >>> [i*i for i in range(20) if i*i%10 == 9] [9, 49, 169, 289]
range
, ou tout itérable...C'est la bonne méthode à essayer d'utiliser le plus possible. On appelle ce style de programmation, le style fonctionnel, il fait penser fortement à une écriture mathématique.
69
?Réponses :
>>> max([n for n in range(1000) if n*n%100 == 69]) 987 >>> sum([n*n for n in range(1000) if n*n%100 == 69]) 13330760
On découvre, au passage, qu'il existe des fonctions classiques sur les listes :
min()
pour le minimum d'une liste non videmax()
pour le maximum d'une liste non videsum()
pour la somme d'une listelen()
pour la longueur d'une listesorted()
pour renvoyer une copie triée de la liste. (À ne pas confondre avec .sort()
qui fait un tri en place.)D'un point de vue rigoureux, les listes que nous avons présentées précédemment sont des tableaux, des objets :
Les tableaux sont utilisés dans presque tous les langages de programmation, c'est un outil élémentaire.
Les listes Python offrent d'autres possibilités que les tableaux officiels n'ont pas. Avec une liste Python, on peut :
append()
pop()
Nous apprendrons plus tard à nous servir de ces méthodes dynamiques, ce sera une introduction aux concepts de la programmation orientée objet.
⚠️ En attendant, essayez de ne pas utiliser ces méthodes. Les exercices pour débutants utilisent souvent les tableaux et non les listes dynamiques. En terminale, on utilisera les méthodes dynamiques.
Une image est souvent donnée par une liste de lignes. Chaque ligne est donnée par une liste de pixels. Et un pixel est souvent une liste de composantes de couleurs.
Compléter la définition de la liste qui correspond à l'image en noir et blanc ci-dessous.
ligne0 = [0, 0 ,1, 1, 1, 1, 0, 0] ligne1 = [0, 1, 0... ... ligne7 = ... 1, 0, 0] smile = [ligne0, ligne1, ligne2, ... ligne7]
On peut aussi écrire :
smile = [[0,0,1,1,1,1,0,0], [0,1,0,...], ..., [...1,0,0]]
Pour modifier un pixel, on peut faire :
smile[2][4] = 0
Comment lire
smile[2][4]
?
smile
est une liste de lignes, on veut celle d'indice , c'estsmile[2]
qui est une liste d'entiers, un par colonne, on veut celui d'indice .
smile[2][4]
correspond donc au pixel de la ligne d'indice , et de la colonne d'indice .
Un tuple est similaire à une liste Python, mais en version immuable, on pourra donc l'utiliser comme clé de dictionnaire.
list
et tuple
[...]
, un tuple se crée avec (...)
.>>> coord = (5, 2) >>> coord[0] 5 >>> cardinaux = ('N', 'S', 'E', 'O') >>> cardinaux[2] 'E'
⚠️ Un tuple à un seul élément se crée avec une virgule orpheline comme mon_tuple = (5,)
, sinon, sans la virgule, cela deviendrait l'entier ; c'est différent !
Il est possible de changer le type d'un objet tuple
à list
. Soit pour pouvoir le modifier, soit pour pouvoir l'utiliser comme une clé de dictionnaire.
>>> mon_tuple = (2, 3, 5) >>> ma_list = list(mon_tuple) >>> ma_liste.append(7) # on ajoute 7 à la fin >>> mon_tuple = tuple(ma_liste) >>> mon_tuple (2, 3, 5, 7)
list()
essaie de transformer son argument en liste, autant que possible. On l'utilise souvent pour transformer une chaîne de caractères en liste de caractères. Liste que l'on peut modifier...tuple()
essaie de transformer son argument en tuple...int()
essaie de transformer son argument en entier...float()
essaie de transformer son argument en flottant...bool()
essaie de transformer son argument en booléen...