% Programmation avec Python (chapitre 3) % Dimitri Merejkowsky
\center \huge Rappels chapitre 2
vide = []
deux_éléments = ["pomme", 42]
for fruit in ["pomme", "banane", "poire"]:
print(fruit)
Index valides: de 0 à (taille - 1)
>>> fruits = ["pomme", "banane", "poire"]:
>>> fruits[1]
"banane"
>>> fruits[2] = "orange"
>>> fruits
["pomme", "banane", "orange"]
>>> fruits = ["pomme", "banane", "poire"]:
>>> len(fruits)
3
>>> "mandarine" in fruits
False
Définition:
def dire_bonjour():
print("Bonjour")
\vfill
Appel:
>>> dire_bonjour()
Bonjour
def dire_bonjour(prénom):
print("Bonjour", prénom)
\vfill
>>> dire_bonjour("Bob")
Bonjour Bob
def dire_bonjour(prénom, enthousiaste=False):
message = "Bonjour " + prénom
if enthousiaste:
message += "!"
print(message)
\vfill
>>> dire_bonjour("John", enthousiaste=True)
Bonjour John!
>>> dire_bonjour("John", enthousiaste=False)
Bonjour John
>>> dire_bonjour("John")
Bonjour John
def additionner(x, y):
return x + y
>>> a = 3
>>> b = 4
>>> c = additionner(a, b)
>>> c
7
def dire_bonjour(prénom):
# prénom est une variable locale
print("Bonjour " + prénom)
dire_bonjour("Dimitri")
print(prénom)
# salutation est une variable globale
salutation = "Bonjour "
def dire_bonjour(prénom):
print(salutation + prénom)
dire_bonjour("Dimitri")
def dire_bonjour(prénom):
print("Bonjour " + prénom)
prénom = "Dimitri"
dire_bonjour(prénom)
\center \huge None
None
est un “objet magique” natif en Python. Il est toujours présent, et il est unique.
Un peu comme True
et False
qui sont deux objets qui servent à représenter tous les booléens.
L’interpréteur intéractif n’affiche rien quand la valeur est None
>>> a = 42
>>> a
42
>>> b = None
>>> b
En réalité, toutes les fonctions pythons retournent quelque chose, même quand
elle ne contiennent pas le mot-clé return
.
def ne_renvoie_rien():
print("je ne fais qu'afficher quelque chose")
>>> resultat = ne_renvoie_rien()
"je ne fais qu'afficher quelque chose"
>>> resultat
La plupart des fonctions que nous avons vues échouent si on leur passe None en argument:
>>> len(None)
TypeError: object of type 'NoneType' has no len()
>>> None < 3
TypeError: '<' not supported between instances of
'NoneType' and 'int'
>>> int(None)
TypeError: int() argument must be a string,
a bytes-like object or a number,
not 'NoneType'
>>> str(None)
'None'
def trouve_dans_liste(valeur, liste):
for element in liste:
if element == valeur:
return element
return None
>>> trouve_dans_liste(2, [1, 2, 3])
2
>>> trouve_dans_liste(False, [True, False])
False
>>> trouve_dans_liste(1, [3, 4])
def trouve_dans_liste(liste, valeur):
for element in liste:
if element == valeur:
return element
None est Falsy, et on peut vérifier si une variable vaut None avec is None
# hypothèse: `ma_valeur` n'est pas None
mon_element = trouve_dans_liste(ma_valeur, ma_liste)
if mon_element is None:
print("élément absent de la liste")
if not mon_element:
# Peut-être que l'élément n'était pas dans la liste,
# ou peut-être y était-il, mais avec une valeur falsy
...
\center \huge Les dictionnaires
Un dictionaire est une association entre des clés et des valeurs.
# dictionaire vide
>>> {}
# une clé, une valeur
>>> {"a": 42}
# deux clés, deux valeurs
>>> {"a": 42, "b": 53}
# les clés sont uniques:
>>> {"a": 42, "a": 53}
{"a": 53}
Note: tous les dictionnaires sont truthy, sauf les dictionnaires vides.
Avec []
, comme pour les listes, mais avec une clé à la place d’un index.
>>> scores = {"john": 10, "bob": 42}
>>> scores["john"]
10
>>> scores["bob"]
42
>>> scores["charlie"]
KeyError
Avec in
, comme le listes:
>>> scores = {"john": 10, "bob": 42}
>>> "charlie" in scores
False
Comme pour les listes: on assigne la nouvelle variable:
>>> scores = {"john": 10, "bob": 42}
>>> scores["john"] = 20
>>> scores
{"john": 20, "bob": 42}
Même méchanisme que pour la modification des clés existantes
>>> scores = {"john": 10, "bob": 42}
>>> scores["charlie"] = 30
>>> scores
{"john": 20, "bob": 42, "charlie": 30}
rappel: ceci ne fonctionne pas avec les listes!
>>> ma_liste = ["a", "b"]
>>> ma_liste[1] = "c" # ok
["a", "c"]
>>> ma_liste[3] = "d"
IndexError
Avec for ... in ...
, comme pour les listes
scores = {"john": 10, "bob": 42}
for nom in scores:
# `nom` est assigné à "john" puis "bob"
score_associé_au_nom = scores[nom]
print(nom, score_associé_au_nom)
Avec del
- un nouveau mot-clé:
>>> scores = {"john": 10, "bob": 42}
>>> del scores["bob"]
>>> scores
{"john": 10}
>>> fruits = ["pomme", "banane", "poire"]
>>> del fruits[1]
>>> fruits
["pomme", "poire"]
>>> mon_entier = 42
>>> mon_entier += 3
>>> mon_entier
45
>>> del mon_entier
>>> mon_entier == 45
NameError: name 'mon_entier' is not defined
On peu aussi supprimer des fonctions:
def ma_fonction():
print("bonjour")
del ma_fonction
>>> ma_fonction()
NameError: name 'ma_fonction' is not defined
Les variables globales d’un programme Python sont dans un dictionnaire,
accessible avec la fonction native globals()
:
$ python3
>>> globals()
{
...
'__doc__': None,
'__name__': '__main__',
...
}
On reparlera de __doc__
et __name__
un autre jour ...
$ python3
>>> a = 42
>>> globals()
{
...
'__doc__': None,
'__name__': '__main__',
...
'a': 42
}
$ python3
>>> a = 42
>>> del globals()["a"]
>>> a
NameError: name 'a' is not defined
On peut accéder aux variables locales d’une fonction avec locals()
def ma_fonction():
a = 42
b = 3
c = a + b
print(locals())
>>> ma_fonction()
{'a': 42, 'b': 3, 'c': 45}
En revanche, il n’est pas conseillé de modifier le dictionaire renvoyé par locals()
...
\center \huge Les tuples
Un tuple est un ensemble ordonné et immuable d'éléments. Le nombre, l’ordre et la valeur des objets sont fixes.
# Un tuple vide
()
# Un tuple à un élément
(1,) # notez la virgule
# Un tuple à deux éléments, aussi appelé couple
(1, 2)
Sauf pour le tuple vide, c’est la virgule qui fait le tuple
Note: tous les tuples sont truthy, sauf les tuples vides.
Comme les listes, les tuples peuvent contenir des éléments de types différents:
# Un entier et une string
mon_tuple = (42, "bonjour")
# Un entier et un autre tuple
mon_tuple = (21, (True, "au revoir"))
Avec []
et l’index de l'élément dans le tuple:
mon_tuple = (42, "bonjour")
mon_tuple[0]
42
mon_tuple[1]
"bonjour"
Interdit!
mon_tuple = (42, "bonjour")
mon_tuple[0] = 44
TypeError: 'tuple' object does not support item assignment
Avec in
>>> mon_tuple = (42, 14)
>>> 42 in mon_tuple
True
>>> 14 in mon_tuple
True
>>> 13 in mon_tuple
False
Créer plusieurs variables en une seule ligne:
>>> couple = ("Batman", "Robin")
>>> héro, side_kick = couple
>>> héro
'Batman'
>>> side_kick
'Robin'
>>> héro, side_kick, ennemi = couple
ValueError (3 != 2)
>>> (héro,) = couple
ValueError (1 != 2)
# Gare à la virgule:
>>> héro, = couple
ValueError (1 != 2)
f(a, b, c) # appelle f() avec trois arguments
f((a, b, c)) # appelle f() avec un seul argument
# (qui est lui-même un tuple à 3 valeurs)
f(()) # appelle f() avec un tuple vide
(a) # juste la valeur de a entre parenthèses
(a,) # un tuple à un élément, qui vaut la valeur de a
>>> fruits = ["pomme", "banane", "orange"]
>>> premier, deuxième, troisième = fruits
>>> premier
"pomme"
>>> deuxième
"banane"
>>> troisième
"orange"
On dit aussi: unpacking
Pour simplifier des conditions:
# Avant
if (
ma_valeur == "nord" or
ma_valeur == "sud" or
ma_valeur == "ouest" or
ma_valeur == "est"):
print("direction", ma_valeur)
\vfill
# Après
if ma_valeur in ("nord", "sud", "est", "ouest"):
print("direction", ma_valeur)
def tire_carte():
valeur = "10"
couleur = "trèfle"
return (valeur, couleur)
v, c = tire_carte()
print(v, "de", c)
# 10 de trèfle
Ce n’est pas une nouvelle syntaxe, juste de la manipulation de tuples!
\center \huge Atelier
Retour au pendu, mais cette fois nous voulons implémenter la gestion des high scores!
\center \huge Consignes pour travailler chez vous
pendu-1.zip
dans la section Cours/Ateliers/Labos du site de l’ECLpython3.py pendu.py
main()
en appelant correctement les autres fonctions définies dans le ficher.