Créer un tuple en python

Résolu/Fermé
JFL - Modifié le 25 janv. 2022 à 15:11
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 - 26 janv. 2022 à 12:02
Bonsoir,
qui pourrait me dire la différence dans la création en Python de 3 tuples suivants qui donnent le même résultat, je ne comprends pas pourquoi on utilise une méthode plutôt que l'autre . Merci beaucoup.


a = tuple(("apple", "banana", "cherry"))
b = (("apple", "banana", "cherry"))
c = ("apple", "banana", "cherry")

print(type(a),a, type(b),b,type(c),c)





Configuration: Windows / Firefox 96.0
A voir également:

2 réponses

mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
Modifié le 25 janv. 2022 à 15:10
Bonjour,

Toutes ces syntaxes sont, pour l'exemple fourni, équivalentes, mais ce n'est pas toujours le cas. Dans ce qui suit
a
,
b
,
c
, etc désignent des variables de n'importe quel type.
  • La syntaxe minimale pour un tuple est
    a, b, c
    . Cependant, elle peut être insuffisante dans certain cas, et c'est pourquoi je préconise plutôt la syntaxe suivante.
    • Si on veut définir un tuple d'un élément selon cette syntaxe, on écrit
      a,
      selon cette écriture.
  • En ajoutant des parenthèses autour, i.e.
    (a, b, c)
    tu délimites le tuple. Cette syntaxe autorise la définition de structures contenant des tuples imbriqués, e.g.
    ((a, (b1, b2), c), (d1, d2, d3))
    .
    • Si l'on veut défini un tuple d'un élément, on écrit
      (a, )
      .
  • tuple(...)
    est un peu différent, c'est une fonction qui construit un tuple à partir d'un itérable (par exemple une liste ou un chaîne de caractère). Il retourne un tuple dont les éléments correspondent aux valeurs qu'on obtient en itérant sur cet itérable. Et c'est là que les différences arrivent. Par exemple prenons pour itérable la chaîne de caractère
    "abc"
    :
    • tuple("abc")
      vaut
      ('a', 'b', 'c')
      et donc ne vaut pas
      ("abc", )
      . Ainsi, si tu veux construire le tuple d'un élément contenant la chaîne
      "abc"
      , il faut écrire
      "abc", 
      ou
      ("abc", )
      .
    • tuple("abc", "def")
      n'a pas de sens, car tuple reçoit deux itérables alors que cette fonction n'en attend qu'un. C'est là que les parenthèses peuvent être importantes. Par exemple,
      tuple(("abc", "def"))
      a du sens et on pourrait plus simplement écrire
      ("abc", "def")
      . Bref, si on veut passer un tuple à une fonction, les parenthèses ont leur importance (et évidemment cette remarque reste vraie si la fonction attend plusieurs paramètres).
    • Quand tu écris
      tuple((a, b, c))
      , tu dis à python de construire un tuple à partir d'un itérable, qui se trouve ici être le tuple
      (a, b, c)
      . Quand tu écris
      tuple([a, b, c])
      , tu dis à python de construire un tuple à partir d'un itérable, qui se trouve ici être la liste
      [a, b, c]
      .


Donc pour résumer :
  • (a, b, c)
    construit un tuple à partir de valeurs données (variables ou constantes). On peut écrire indifféremment
    a, b, c
    , sauf si cela est ambigu, e.g. on veut passer si le tuple est imbriqué dans une autre structure ou est passé en paramètre d'une fonction.
    • Pour ma part, j'écris systématiquement
      (a, b, c)
      plutôt que
      a, b, c
      , quelle que soit la situation.
  • tuple(it)
    construit un tuple à partir d'un itérable
    it
    .


Dernier point important, les comprehension-tuples.
  • Tu sais peut être qu'on peut créer une liste à partir d'un générateur (e.g.
    range
    ) avec la syntaxe
    l = [x for x in range(10)]
    . On parle de comprehension-list. On obtient bien une liste, comme le montre
    type(l)
    .
  • Si tu écris
    g = (x for x in range(10))
    tu n'obtiens pas un tuple, mais un générateur. Si tu veux obtenir un tuple à partir d'un générateur, il faut écrire
    t = tuple(x for x in range(10))
    .


Bonne chance
1
Un grand merci pour ta réponse extrêment claire et détaillée.
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
26 janv. 2022 à 12:02
Merci pour ce retour très positif, bonne continuation !
0