You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.
 
 
 
 
 
 

3.4 KiB

% notions: tuples, immuables & mutables, passage par référence, % copie, retour multiples

\center Les tuples

Création de tuples

mon_tuple = tuple()  # un tuple vide
mon_tuple = ()  # aussi un tuple vide
mon_tuple = (1, 2)  # un tuple à deux éléments

Note

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

Indexation, test d’appartenance

>>> 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

Déstructuration

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

Quelques erreurs

>>> héro, side_kick, ennemi = couple
ValueError (3 != 2)

>>> (héro,) = couple
ValueError (1 != 2)

# Gare à la virgule:
>>> héro, = couple
ValueError (1 != 2)

Pièges

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)

On peut aussi déstructurer des listes

>>> fruits = ["pomme", "banane", "orange"]
>>> premier, deuxième, troisième = fruits

Retour multiple

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 :)

Les tuples sont immuables

>>> couple = ('Starsky', 'Hutch')
>>> couple[0] = 'Batman'
TypeError

Les méthodes count() et index() existent parce qu’elles ne modifient pas le tuple.

Les tuples sont immuables (2)

Les méthodes qui modifieraient le tuple n’existent pas:

>>> couple = ('Starsky', 'Hutch')
>>> couple.clear()
AttributeError

\center Mutables, immuables, et références

Mutables et immuables

  • Mutables: listes, ensembles, dictionnaires
  • Immuables: entiers, flottants, booléens, strings

Passage par référence

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

Exemple 1

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

Exemple 2

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]

Exemple 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é

Notes

  • on peut aussi utiliser la fonction native “max()”
  • on peut aussi utiliser une slice: autre_liste = liste[:]

Conclusion

Une fonction ne peut modifier la valeur de ses arguments qui s’ils sont mutables.

Toutes les copies doivent être explicites