Maison  >  Article  >  développement back-end  >  Comment Python mappe les noms en éléments d'une séquence (code)

Comment Python mappe les noms en éléments d'une séquence (code)

不言
不言avant
2018-10-23 16:14:242176parcourir

Le contenu de cet article explique comment Python mappe les noms aux éléments de séquence (code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

1. Exigences

Notre code accède aux tuples de liste par position (c'est-à-dire index ou indice), mais parfois cela rend le code modifié. . Nous voulons pouvoir accéder aux éléments par leur nom, réduisant ainsi la dépendance à la position dans la structure.

2. Solution

Par rapport aux tuples ordinaires, collections.namedtuple() (nommé tuple) n'ajoute que très peu de frais généraux pour offrir ces commodités. En fait, collections.namedtuple() est une méthode d'usine qui renvoie une sous-classe du type tuple standard en Python. Nous lui fournissons un nom de type et les champs correspondants, et il renvoie une classe instanciable, transmettant les valeurs des champs que vous avez définis, etc.

from collections import namedtuple
Subscriber=namedtuple('Subsciber',['addr','joined'])
sub=Subscriber("1782980833@qq.com","2018-10-23")
print(sub)
print(sub.addr)
print(sub.joined)
print(len(sub))
addr,joined=sub
print(addr)
print(joined)
#下面错误,以为你namedtuple是不可变的
#sub.joined="2019"

Résultat :

Subsciber(addr='1782980833@qq.com', joined='2018-10-23')
1782980833@qq.com
2018-10-23
2
1782980833@qq.com
2018-10-23

Bien qu'une instance de nomméetuple ressemble à une instance de classe ordinaire, ses instances sont interchangeables avec les tuples ordinaires et prennent en charge toutes les opérations prises en charge par les tuples ordinaires.

Le rôle principal des tuples nommés est de découpler le code de la position des éléments qu'il contrôle. Ainsi, si vous obtenez une grande liste de tuples à partir d'un appel à la base de données et que vous accédez aux éléments par leur position, alors si vous ajoutez une nouvelle colonne au formulaire, le code plantera, mais si les tuples renvoyés sont d'abord convertis en tuples nommés et il n'y aura aucun problème.

Pour illustrer le problème, voici du code utilisant des tuples simples :

def compute_cost(records):
    total=0.0
    for rec in records:
        total+=rec[1]*rec[2]
    return total

Le référencement des éléments par position rend souvent le code moins expressif et également une structure spécifique très dépendante des enregistrements.

Ce qui suit est la version utilisant des tuples nommés :

from collections import namedtuple
Stock=namedtuple('Stock',['name','shares','price'])
def compute_cost(records):
    total=0.0
    for rec in records:
        s=Stock(*rec)
        total+=s.shares*s.price
    return total

3 Analyse Une utilisation possible de

namedtuple est en remplacement d'un. dictionnaire , ce dernier nécessite plus d’espace de stockage. Par conséquent, si vous souhaitez créer un grand dictionnaire de conception de données, il sera plus efficace d'utiliser NameTuple, mais veuillez noter que contrairement aux dictionnaires, NameTuple est immuable.

Si vous devez modifier des attributs, vous pouvez le faire en utilisant la méthode nomméetuple instance_replace(). Cette méthode crée un nouveau tuple nommé et remplace les valeurs correspondantes.

from collections import namedtuple
Subscriber=namedtuple('Subsciber',['addr','joined'])
sub=Subscriber("1782980833@qq.com","2018-10-23")

print(sub)

sub=sub._replace(joined="2018-10-24")
print(sub)

Résultat :

Subsciber(addr='1782980833@qq.com', joined='2018-10-23')
Subsciber(addr='1782980833@qq.com', joined='2018-10-24')

_La méthode replace() a une utilisation subtile, c'est-à-dire qu'elle peut être utilisée comme un moyen simple de remplir des fonctionnalités qui sont facultatif ou manquant Un tuple nommé de champs. Pour ce faire, créez d'abord un tableau prototype contenant les valeurs par défaut, puis utilisez la méthode _replace() pour créer une nouvelle instance et remplacer les valeurs correspondantes.

from collections import namedtuple
Subscriber=namedtuple('Subsciber',['addr','joined','age'])
sub=Subscriber("",None,0)

def dict_to_stock(s):
    return sub._replace(**s)

a={"addr":"111111@qq.com","joined":"1111-11-11","age":11}
a=dict_to_stock(a)
print(a)

b={"addr":"111111@qq.com","joined":"1111-11-11"}
b=dict_to_stock(b)
print(b)

Résultat :

Subsciber(addr='111111@qq.com', joined='1111-11-11', age=11)
Subsciber(addr='111111@qq.com', joined='1111-11-11', age=0)

Enfin, et c'est assez important, il faut noter que si notre objectif est de définir une structure de données efficace, diverses instances seront modifiées dans le futur , alors utiliser nametuple n'est pas le meilleur choix. Au lieu de cela, vous pouvez envisager une classe qui utilise l'attribut __slots__.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer