Que sont les “uplets nommé” en Python?
La lecture de la les changements en Python 3.1, j'ai trouvé quelque chose... inattendu:
Le sys.version_info tuple est maintenant un nommé tuple:
Je n'ai jamais entendu parler d'uplets nommé avant, et j'ai pensé éléments pourraient être indexées par des numéros (comme dans les tuples et les listes) ou par les touches (comme dans les dicts). Je n'aurais jamais pensé qu'ils pourraient être indexés dans les deux sens.
Donc, mes questions sont les suivantes:
- Ce que sont nommés les tuples?
- Comment les utiliser?
- Pourquoi/quand dois-je utiliser nommé tuples au lieu de la normale n-uplets?
- Pourquoi/quand dois-je utiliser des tuples à la place de uplets nommé?
- Est-il une sorte de "liste" (une mutable version de l'nommé tuple)?
Vous devez vous connecter pour publier un commentaire.
Nommé tuples sont fondamentalement facile à créer, léger types d'objet. Nommé tuple instances peuvent être référencés à l'aide de l'objet comme variable de déférence ou de la norme n-uplet de la syntaxe. Ils peuvent être utilisés de la même manière à
struct
ou d'autres types d'enregistrements, à l'exception qu'ils sont immuables. Ils ont été ajoutés dans la version 2.6 de Python et Python 3.0, mais il est recette pour la mise en œuvre en Python 2.4.Par exemple, il est courant de représenter un point comme un n-uplet
(x, y)
. Cela conduit à un code comme suit:À l'aide d'un nommé tuple il devient plus lisible:
Cependant, nommé n-uplets sont toujours compatible avec la normale de n-uplets, donc la suite sera encore du travail:
Ainsi, vous devez utiliser uplets nommé à la place de n-uplets n'importe où vous pensez object notation permet de rendre votre code plus pythonic et plus facilement lisible. Personnellement, j'ai commencé à les utiliser pour représenter très simple des types de valeur, en particulier lorsque les passant en paramètres de fonctions. Il rend les fonctions plus lisible, sans voir le contexte de la n-uplet d'emballage.
En outre, vous pouvez également remplacer ordinaire immuable classes qui n'ont pas de fonctions, seuls les champs avec eux. Vous pouvez même utiliser votre nommée tuple types de classes de base:
Cependant, comme avec n-uplets, les attributs nommés tuples sont immuables:
Si vous voulez être en mesure de modifier les valeurs, vous avez besoin d'un autre type. Il y a une recette pratique pour mutable recordtypes qui vous permettent de définir de nouvelles valeurs pour les attributs.
Je ne suis pas au courant de toute forme de "liste" qui vous permet d'ajouter de nouveaux champs, cependant. Vous pouvez utiliser un dictionnaire dans cette situation. Nommé tuples peuvent être convertis à l'aide de dictionnaires
pt1._asdict()
qui renvoie{'x': 1.0, 'y': 5.0}
et peut être utilisé avec tous les habituelles fonctions de dictionnaire.Comme l'a déjà noté, vous devriez consultez la documentation pour plus d'information à partir de laquelle ces exemples ont été construits.
__slots__
namedtuple est un usine fonction pour faire un n-uplet de la classe. Avec cette classe, nous pouvons créer des tuples qui sont rachetables par nom aussi.
namedtuple is a factory function for making a tuple class.
c'est probablement la seule bonne réponse ici 😛Un nommé n-uplet est un n-uplet.
Il fait tout ce qu'un n-uplet peut.
Mais il est plus que juste un n-uplet.
C'est une sous-classe spécifique d'un tuple qui est créé par programmation à votre cahier des charges, avec le nom des champs et une longueur fixe.
Ce, 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 n-uplet est utilisé sans les casser. Ceci est connu comme Liskov substituabilité:
Ce instancie c':
Nous pouvons inspecter et utiliser ses attributs:
Explication plus approfondie
À comprendre nommé tuples, vous devez d'abord savoir ce qu'est un n-uplet est. Un tuple est essentiellement immuable (ne peut pas être modifié sur place en mémoire) de la liste.
Voici comment vous pourriez utiliser un tuple:
Vous pouvez développer un tuple avec itérable déballage:
Nommé tuples sont des n-uplets qui permettent à leurs éléments pour être accessible par un nom au lieu de simplement l'index!
Vous faire un namedtuple comme ceci:
Vous pouvez également utiliser une chaîne unique avec les noms séparés par des espaces, un peu plus lisible utilisation de l'API:
Vous pouvez tout faire tuples peuvent le faire (voir ci-dessus) ainsi que d'effectuer 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 simple raccourci. Les traiter comme des classes. Définir le niveau de module, de sorte que les cornichons et les autres utilisateurs peuvent les trouver.L'exemple de travail, sur le module global niveau:
Et cela démontre l'échec de la recherche de la définition:
De les utiliser quand il améliore votre code de la sémantique des n-uplet d'éléments exprimés dans votre code. Vous pouvez les utiliser à la place d'un objet si vous autrement utiliser un objet immuable attributs de données et aucune fonctionnalité. Vous pouvez également une sous-classe pour ajouter des fonctionnalités, par exemple:
Il serait probablement une régression à passer de l'utilisation nommé tuples les tuples. En avance dans la conception de centres de décision de savoir si le coût de l'extra code est la valeur de l'amélioration de la lisibilité lorsque le n-uplet est utilisé.
Il n'y a pas de mémoire supplémentaire utilisé par des n-uplets rapport à n-uplets.
Vous êtes à la recherche pour une fente objet qui implémente toutes les fonctionnalités d'une manière statique de la taille de la liste ou un sous-classé liste qui fonctionne comme un nom de n-uplet (et qu'en quelque sorte des blocs de la liste de changement dans la taille.)
Une étendue aujourd'hui, et peut-être même de Liskov substituables, l'exemple de la première:
Et à utiliser, il suffit de sous-classe et de définir
__slots__
:namedtuples sont d'une grande fonctionnalité, ils sont parfaits conteneur de données. Lorsque vous avez à "stocker" les données d'utilisation des n-uplets ou les dictionnaires, comme:
ou:
Le dictionnaire approche est écrasante, depuis dict sont mutables et plus lents que les n-uplets. D'autre part, les tuples sont immuables et léger, mais le manque de lisibilité pour un grand nombre d'entrées dans les champs de données.
namedtuples sont le parfait compromis pour les deux approches, l'une grande lisibilité, lightweightness et l'immutabilité (en plus ils sont polymorphes!).
ntuple.foo
vsntuple[1]
ce dernier est beaucoup plus rapide. Plus sur: stackoverflow.com/questions/2646157/...nommé tuples permettre la compatibilité ascendante avec le code qui vérifie la version comme ceci
tout en permettant à l'avenir de code pour être plus explicite en utilisant cette syntaxe
namedtuple
est l'un des moyens les plus faciles à nettoyer votre code et de le rendre plus lisible. Il s'auto-documents ce qui se passe dans le tuple. Namedtuples instances sont tout aussi efficace en terme de mémoire que régulièrement des tuples, comme ils n'ont pas par exemple les dictionnaires, les rendant plus rapide que les dictionnaires.
Sans nommer chaque élément du tuple, il lirait comme ceci:
Il est donc beaucoup plus difficile de comprendre ce qui se passe dans le premier exemple. Avec un namedtuple, chaque champ a un nom. Et vous pouvez y accéder par son nom plutôt que de la position ou de l'index. Au lieu de
p[1]
, on peut l'appeler p.la saturation. Il est plus facile à comprendre. Et il a l'air plus propre.La création d'une instance de la namedtuple est plus facile que de créer un dictionnaire.
Quand pourriez-vous utiliser namedtuple
plus facile. Donc, si vous avez besoin de référencer les éléments du tuple, puis
la création comme namedtuples tout à fait logique.
maintient l'ordre à la différence du dictionnaire.
namedtuple que dictionnaire. Et référencer l'élément nommé dans le
tuple semble plus propre que d'un dictionnaire.
p.hue
plutôt que dep['hue']
.La syntaxe
comme dans une liste
['x', 'y', 'z']
ou chaînex y z
(sans virgule, justeles espaces) ou
x, y, z
.True
, invalide fieldnames sont automatiquementremplacé par position nom. Par exemple,
['abc', 'def', 'ghi','abc']
est converti à['abc', '_1', 'ghi', '_3']
, l'élimination de lamot-clé
'def'
(puisque c'est un mot réservé pour définir des fonctions)et le double de fieldname
'abc'
.True
, la définition de la classe est impriméavant d'être construit.
Vous pouvez toujours accéder à namedtuples par leur position, si vous le souhaitez.
p[1] == p.saturation
. - Il encore déballe comme un n-uplet.Méthodes
Tous les régulière tuple méthodes sont pris en charge. Ex: min(), max(), len(), dans, pas, de concaténation (+), d'un index, d'une tranche, etc. Et il ya quelques autres pour namedtuple. Remarque: ces commencent tous par un trait de soulignement.
_replace
,_make
,_asdict
._replace
Retourne une nouvelle instance de l'nommé n-uplet de remplacer les champs indiqués avec de nouvelles valeurs.
La syntaxe
Exemple
Avis: Les noms de champ ne sont pas dans les citations; elles sont les mots clés ici.
Rappelez-vous: n-Uplets sont immuables, même si elles sont namedtuples et ont la
_replace
méthode. Le_replace
produit unnew
instance; elle ne modifie pas l'original ou de remplacer l'ancienne valeur. Vous pouvez bien sûr enregistrer le nouveau résultat à la variable.p = p._replace(hue=169)
_make
Fait une nouvelle instance à partir d'une séquence existante ou itératif.
La syntaxe
Exemple
Ce qui s'est passé avec le dernier? L'élément à l'intérieur de la parenthèse doit être l'objet iterable. Si une liste ou un tuple à l'intérieur de la parenthèse fonctionne, mais la séquence de valeurs sans enfermant comme un objet iterable renvoie une erreur.
_asdict
Retourne une nouvelle 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 est également le nom de la liste qui est similaire à nommé tuple mais mutable
https://pypi.python.org/pypi/namedlist
_
!Qu'est-ce que namedtuple ?
Comme son nom l'indique, namedtuple est un tuple avec le nom. Dans standard n-uplet, nous avons accès aux éléments à l'aide de l'indice, alors que namedtuple permet à l'utilisateur de définir un nom pour les éléments. Ce qui est très pratique en particulier pour l'élaboration csv (valeurs séparées par des virgules) de travail et les dossiers complexes et vaste ensemble de données, d'où le code est incorrect avec l'utilisation d'indices (pas si pythonic).
Comment les utiliser ?
Lecture
Scénario intéressant en CSV Traitement :
En Python à l'intérieur il y a une bonne utilisation de conteneur appelé nommé tuple, il peut être utilisé pour créer une définition de la classe et dispose de toutes les fonctionnalités de l'original tuple.
Utilisant nommé tuple sera directement appliquée à la valeur par défaut de la classe template pour générer une classe simple, cette méthode permet à beaucoup de code pour améliorer la lisibilité et il est également très pratique lors de la définition d'une classe.
Essayez ceci:
Fondamentalement,
namedtuples
sont faciles à créer, léger types d'objet.Ils se tournent de n-uplets en pratique des conteneurs pour des tâches simples.
Avec
namedtuples
, vous n'avez pas à utiliser entier indices pour accéder aux membres d'un tuple.Exemples:
Code 1:
Code 2:
D'une autre façon (une nouvelle façon) pour utiliser nommé n-uplet est à l'aide de NamedTuple à partir de la frappe du package: Type d'indicateurs dans namedtuple
Prenons l'exemple de la top réponse dans ce post pour voir comment l'utiliser.
(1) Avant d'utiliser le nommé tuple, le code ressemble à ceci:
(2) Maintenant, nous utilisons le nom de n-uplet
hériter de la NamedTuple de classe et de définir le nom de la variable dans la nouvelle classe. test est le nom de la classe.
créer des instances de la classe et de leur affecter des valeurs
utiliser les variables d'instances de calculer
Tout le monde a déjà répondu, mais je pense que j'ai encore quelque chose d'autre à ajouter.
Namedtuple pourrait être intuitivement considéré comme un raccourci pour définir une classe.
Voir une lourdeur et de la façon conventionnelle de définir un
class
.Comme pour
namedtuple
red_duck[0]
oulen(red_duck)
oufor x in red_duck: print(x)
. En outre, appelé les tuples sont immuables, de sorte que ces opérations ne fonctionne pas:red_duck[0] = 2
,red_duck.foo = 'bar'
. Depuis qu'ils sont immuables, nommé tuples peuvent être utilisés commedict
clés.