% notions: tuples, immuables & mutables, passage par référence, % copie, retour multiples
\center Les tuples
mon_tuple = tuple() # un tuple vide
mon_tuple = () # aussi un tuple vide
mon_tuple = (1, 2) # un tuple à deux éléments
C’est la virgule qui fait le tuple, pas les parenthèses (on n’utilise les parenthèse que pour l’esthétique)
\vfill
(1)
# pas un tuple, juste le nombre 1 (entre parenthèses)
(1,)
# un tuple à un élément
1,
# le *même* tuple
>>> couple = ('Starsky', 'Hutch')
>>> couple[0]
'Starsky'
>>> couple[1]
'Hutch'
>>> couple[3]
IndexError
>>> 'Starsky' in couple
True
>>> 'Batman' in couple
False
Rien de nouveau en principe :p
Créer plusieurs variables en une seule ligne
>>> couple = ("Batman", "Robin")
>>> héro, side_kick = couple
>>> héro
'Batman'
>>> side_kick
'Robin'
On dit aussi: unpacking
>>> 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)
>>> fruits = ["pomme", "banane", "orange"]
>>> premier, deuxième, troisième = fruits
Retourner plusieurs valeurs:
def tire_carte(():
valeur = "10"
couleur = "trèfle"
return (valeur, couleur)
(v, c) = tire_carte()
print("{} de {}", v, c)
# 10 de trèfle
\vfill
En fait c’est juste une manipulation de tuples :)
>>> couple = ('Starsky', 'Hutch')
>>> couple[0] = 'Batman'
TypeError
Les méthodes count()
et index()
existent
parce qu’elles ne modifient pas le tuple.
Les méthodes qui modifieraient le tuple n’existent pas:
>>> couple = ('Starsky', 'Hutch')
>>> couple.clear()
AttributeError
\center Mutables, immuables, et références
En Python, on ne manipule jamais les objets directement, on ne manipule que des références sur ces objets.
x = 3 # x est une référence vers l'objet 'entier 3'
x = "hello" # x référence une string
def ajoute_trois(x):
x = x + 3 # crée une nouvelle référence
mon_entier = 42
ajoute_trois(mon_entier)
# 'mon_entier' vaut toujours 42
def ajoute_trois(l):
l.append(3)
# Ne crée pas de nouvelle référence
# Appelle une méthode qui modifie 'l' sur place
ma_liste = [1, 2]
ajoute_trois(ma_liste)
# 'ma_liste' vaut maintenant [1, 2, 3]
def get_max(liste):
autre_liste = liste.copy()
autre_liste.sort()
return autre_liste[-1]
ma_liste = [1, 3, 2]
x = get_max(ma_liste)
# x = 3
# `ma_liste` n'a pas changé
autre_liste = liste[:]
Une fonction ne peut modifier la valeur de ses arguments qui s’ils sont mutables.
Toutes les copies doivent être explicites