Les tuples nommés sont essentiellement des types d'objet légers et faciles à créer. Les instances de tuple nommées peuvent être référencées à l'aide d'un déréférencement de variable de type objet ou de la syntaxe de tuple standard. Ils peuvent être utilisés de la même manière que d' struct
autres types d'enregistrement courants, sauf qu'ils sont immuables. Ils ont été ajoutés dans Python 2.6 et Python 3.0, bien qu'il existe une recette pour l'implémentation dans Python 2.4 .
Par exemple, il est courant de représenter un point comme un tuple (x, y)
. Cela conduit à un code comme celui-ci:
pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)
from math import sqrt
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
En utilisant un tuple nommé, il devient plus lisible:
from collections import namedtuple
Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)
from math import sqrt
line_length = sqrt((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)
Cependant, les tuples nommés sont toujours rétrocompatibles avec les tuples normaux, donc les éléments suivants fonctionneront toujours:
Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)
from math import sqrt
# use index referencing
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
# use tuple unpacking
x1, y1 = pt1
Ainsi, vous devez utiliser des tuples nommés au lieu de tuples partout où vous pensez que la notation d'objet rendra votre code plus pythonique et plus facilement lisible . Personnellement, j'ai commencé à les utiliser pour représenter des types de valeurs très simples, en particulier lors de leur transmission en tant que paramètres aux fonctions. Il rend les fonctions plus lisibles, sans voir le contexte de l'empaquetage de tuple.
De plus, vous pouvez également remplacer les classes immuables ordinaires qui n'ont pas de fonctions , seulement des champs avec elles. Vous pouvez même utiliser vos types de tuple nommés comme classes de base:
class Point(namedtuple('Point', 'x y')):
[...]
Cependant, comme pour les tuples, les attributs des tuples nommés sont immuables:
>>> Point = namedtuple('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
AttributeError: can't set attribute
Si vous souhaitez pouvoir modifier les valeurs, vous avez besoin d'un autre type. Il existe une recette pratique pour les types d'enregistrement mutables qui vous permettent de définir de nouvelles valeurs pour les attributs.
>>> from rcdtype import *
>>> Point = recordtype('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
>>> print(pt1[0])
2.0
Je ne connais cependant aucune forme de "liste nommée" qui vous permette d'ajouter de nouveaux champs. Vous pouvez simplement utiliser un dictionnaire dans cette situation. Les tuples nommés peuvent être convertis en dictionnaires à l'aide de pt1._asdict()
quels retours {'x': 1.0, 'y': 5.0}
et peuvent être utilisés avec toutes les fonctions de dictionnaire habituelles.
Comme déjà indiqué, vous devriez vérifier la documentation pour plus d'informations à partir desquelles ces exemples ont été construits.
__slots__
typing.NamedTuple
qui permet des indications de type et est particulièrement pratique pour le sous-classement.namedtuple est une fonction d'usine pour créer une classe de tuple. Avec cette classe, nous pouvons également créer des tuples appelables par leur nom.
la source
namedtuple is a factory function for making a tuple class.
c'est probablement la seule bonne réponse ici: PUn tuple nommé est un tuple.
Il fait tout ce qu'un tuple peut.
Mais c'est plus qu'un simple tuple.
Il s'agit d'une sous-classe spécifique d'un tuple créé par programme selon vos spécifications, avec des champs nommés et une longueur fixe.
Cela, par exemple, crée une sous-classe de tuple, et en plus d'être de longueur fixe (dans ce cas, trois), il peut être utilisé partout où un tuple est utilisé sans rupture. Ceci est connu sous le nom de substituabilité Liskov.
Nouveau dans Python 3.6 , nous pouvons utiliser une définition de classe avec
typing.NamedTuple
pour créer un tuple nommé:Ce qui précède est le même que ci-dessous, sauf que ce qui précède a en outre des annotations de type et une docstring. Ce qui suit est disponible en Python 2+:
Cela l'instancie:
Nous pouvons l'inspecter et utiliser ses attributs:
Explication plus approfondie
Pour comprendre les tuples nommés, vous devez d'abord savoir ce qu'est un tuple. Un tuple est essentiellement une liste immuable (ne peut pas être modifiée sur place en mémoire).
Voici comment utiliser un tuple standard:
Vous pouvez développer un tuple avec un déballage itérable:
Les tuples nommés sont des tuples qui permettent d'accéder à leurs éléments par leur nom au lieu d'un simple index!
Vous créez un tuple nommé comme ceci:
Vous pouvez également utiliser une seule chaîne avec les noms séparés par des espaces, une utilisation légèrement plus lisible de l'API:
Vous pouvez faire tout ce que les tuples peuvent faire (voir ci-dessus) ainsi que les opérations suivantes:
Un intervenant a demandé:
Les types que vous créez avec
namedtuple
sont essentiellement des classes que vous pouvez créer avec un raccourci facile. Traitez-les comme des cours. Définissez-les au niveau du module, afin que les cornichons et les autres utilisateurs puissent les trouver.L'exemple de travail, au niveau du module global:
Et cela montre l'échec de la recherche de la définition:
Utilisez-les pour améliorer votre code afin d'exprimer la sémantique des éléments de tuple dans votre code.
Vous pouvez les utiliser à la place d'un objet si vous utilisez autrement un objet avec des attributs de données immuables et aucune fonctionnalité.
Vous pouvez également les sous-classer pour ajouter des fonctionnalités, par exemple :
Ce serait probablement une régression pour passer de l'utilisation de tuples nommés à des tuples. La décision de conception initiale se concentre sur la question de savoir si le coût du code supplémentaire impliqué vaut la lisibilité améliorée lorsque le tuple est utilisé.
Il n'y a pas de mémoire supplémentaire utilisée par les tuples nommés par rapport aux tuples.
Vous recherchez un objet à fente qui implémente toutes les fonctionnalités d'une liste de taille statique ou une liste de sous-classes qui fonctionne comme un tuple nommé (et qui empêche en quelque sorte la liste de changer de taille.)
Un exemple maintenant étendu, et peut-être même substituable par Liskov, du premier:
Et pour l'utiliser, il suffit de sous-classer et de définir
__slots__
:la source
Les nommés sont une excellente fonctionnalité, ils sont un conteneur parfait pour les données. Lorsque vous devez "stocker" des données, vous utilisez des tuples ou des dictionnaires, comme:
ou:
L'approche par dictionnaire est écrasante, car les dicts sont mutables et plus lents que les tuples. En revanche, les tuples sont immuables et légers mais manquent de lisibilité pour un grand nombre d'entrées dans les champs de données.
les nommés sont le compromis parfait pour les deux approches, elles ont une grande lisibilité, légèreté et immuabilité (en plus elles sont polymorphes!).
la source
ntuple.foo
vsntuple[1]
ce dernier est beaucoup plus rapide. Pour en savoir plus: stackoverflow.com/questions/2646157/…les tuples nommés permettent une compatibilité descendante avec le code qui vérifie la version comme celle-ci
tout en permettant au futur code d'être plus explicite en utilisant cette syntaxe
la source
namedtuple
est l'un des moyens les plus simples de nettoyer votre code et de le rendre plus lisible. Il auto-documente ce qui se passe dans le tuple. Les instances de namedtuples sont aussi efficaces en mémoire que les tuples ordinaires car elles n'ont pas de dictionnaires par instance, ce qui les rend plus rapides que les dictionnaires.
Sans nommer chaque élément du tuple, il se lirait comme suit:
Il est tellement plus difficile de comprendre ce qui se passe dans le premier exemple. Avec un tuple nommé, chaque champ a un nom. Et vous y accédez par nom plutôt que par position ou index. Au lieu de
p[1]
, nous pouvons l'appeler p.saturation. C'est plus facile à comprendre. Et ça a l'air plus propre.Il est plus facile de créer une instance du nomméuple que de créer un dictionnaire.
Quand pourriez-vous utiliser namedtuple
p.hue
plutôt quep['hue']
.La syntaxe
['x', 'y', 'z']
ou une chaînex y z
(sans virgule, juste un espace) oux, y, z
.True
, les noms de champs invalides sont automatiquement remplacés par des noms de position. Par exemple,['abc', 'def', 'ghi','abc']
est converti en['abc', '_1', 'ghi', '_3']
, éliminant le mot-clé'def'
(puisque c'est un mot réservé pour définir les fonctions) et le nom de champ en double'abc'
.True
, la définition de classe est imprimée juste avant d'être construite.Vous pouvez toujours accéder aux couples nommés par leur position, si vous le souhaitez.
p[1] == p.saturation
. Il déballe toujours comme un tuple ordinaire.Les méthodes
Toutes les méthodes de tuple standard sont prises en charge. Ex: min (), max (), len (), in, not in, concaténation (+), index, slice, etc. Et il y en a quelques autres pour namedtuple. Remarque: tout cela commence par un trait de soulignement.
_replace
,_make
,_asdict
._replace
Renvoie une nouvelle instance du tuple nommé remplaçant les champs spécifiés par de nouvelles valeurs.La syntaxe
Exemple
Remarque : les noms de champ ne sont pas entre guillemets; ce sont des mots-clés ici. Rappelez - vous : les tuples sont immuables - même s'ils sont nommés tuples et ont la
_replace
méthode. Le_replace
produit unenew
instance; il ne modifie pas l'original ni ne remplace l'ancienne valeur. Vous pouvez bien sûr enregistrer le nouveau résultat dans la variable.p = p._replace(hue=169)
_make
Rend une nouvelle instance à partir d'une séquence existante ou itérable.
La syntaxe
Exemple
Que s'est-il passé avec le dernier? L'élément entre parenthèses doit être l'itérable. Ainsi, une liste ou un tuple à l'intérieur de la parenthèse fonctionne, mais la séquence de valeurs sans entourer comme un itérable renvoie une erreur.
_asdict
Renvoie un nouveau OrderedDict qui mappe les noms de champ à leurs valeurs correspondantes.
La syntaxe
Exemple
Référence : https://www.reddit.com/r/Python/comments/38ee9d/intro_to_namedtuple/
Il existe également une liste nommée qui est similaire à un tuple nommé mais mutable https://pypi.python.org/pypi/namedlist
la source
_
!Qu'est-ce qui est nommé tuple?
Comme son nom l'indique, namedtuple est un tuple avec un nom. Dans le tuple standard, nous accédons aux éléments à l'aide de l'index, tandis que namedtuple permet à l'utilisateur de définir le nom des éléments. Ceci est très pratique, en particulier pour le traitement de fichiers csv (valeurs séparées par des virgules) et pour travailler avec des ensembles de données complexes et volumineux, où le code devient compliqué avec l'utilisation d'indices (pas si pythoniques).
Comment les utiliser?
En train de lire
Scénario intéressant dans le traitement CSV:
la source
En Python, à l'intérieur, il existe une bonne utilisation du conteneur appelé tuple nommé, il peut être utilisé pour créer une définition de classe et possède toutes les fonctionnalités du tuple d'origine.
L'utilisation de tuple nommé sera directement appliquée au modèle de classe par défaut pour générer une classe simple, cette méthode permet à beaucoup de code d'améliorer la lisibilité et elle est également très pratique lors de la définition d'une classe.
la source
Une autre façon (une nouvelle façon) d'utiliser le tuple nommé est d'utiliser NamedTuple à partir du package de saisie: Tapez les astuces dans namedtuple
Prenons l'exemple de la première réponse dans ce post pour voir comment l'utiliser.
(1) Avant d'utiliser le tuple nommé, le code est le suivant:
(2) Maintenant, nous utilisons le tuple nommé
héritez de la classe NamedTuple et définissez le nom de la variable dans la nouvelle classe. test est le nom de la classe.
créer des instances à partir de la classe et leur attribuer des valeurs
utiliser les variables des instances pour calculer
la source
Essaye ça:
Fondamentalement, il
namedtuples
est facile de créer des types d'objets légers. Ils transforment les tuples en conteneurs pratiques pour des tâches simples. Avecnamedtuples
, vous n'avez pas besoin d'utiliser des indices entiers pour accéder aux membres d'un tuple.Exemples:
Code 1:
Code 2:
la source
Tout le monde y a déjà répondu, mais je pense que j'ai encore quelque chose à ajouter.
Namedtuple pourrait être intuitivement considéré comme un raccourci pour définir une classe.
Découvrez une manière lourde et conventionnelle de définir a
class
.Pour ce qui est de
namedtuple
la source
red_duck[0]
orlen(red_duck)
orfor x in red_duck: print(x)
. De plus, les tuples nommés sont immuables, donc ces opérations échoueront:red_duck[0] = 2
,red_duck.foo = 'bar'
. Puisqu'ils sont immuables, les tuples nommés peuvent être utilisés commedict
clés.