Heim  >  Artikel  >  Backend-Entwicklung  >  Wie Python Namen Elementen einer Sequenz zuordnet (Code)

Wie Python Namen Elementen einer Sequenz zuordnet (Code)

不言
不言nach vorne
2018-10-23 16:14:242176Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Zuordnung von Namen zu Sequenzelementen (Code). Ich hoffe, dass er für Freunde hilfreich ist.

1. Anforderungen

Unser Code greift auf Listentupel über die Position zu (d. h. Index oder Index), aber manchmal ist die Codeänderung dadurch etwas schwer zu lesen . Wir möchten über den Namen auf Elemente zugreifen können und so die Abhängigkeit von der Position in der Struktur verringern.

2. Lösung

Im Vergleich zu gewöhnlichen Tupeln verursachtcollections.namedtuple() (benanntes Tupel) nur sehr wenig Overhead, um diese Annehmlichkeiten bereitzustellen. Tatsächlich handelt es sich bei „collections.namedtuple()“ um eine Factory-Methode, die eine Unterklasse des Standard-Tupeltyps in Python zurückgibt. Wir versehen es mit einem Typnamen und entsprechenden Feldern, und es gibt eine instanziierbare Klasse zurück, die Werte für die von Ihnen definierten Felder usw. übergibt.

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"

Ergebnis:

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

Obwohl eine Instanz von „namedtuple“ wie eine gewöhnliche Klasseninstanz aussieht, sind ihre Instanzen mit gewöhnlichen Tupeln austauschbar und alle gewöhnlichen Tupel werden von der Gruppe unterstützte Operationen unterstützt.

Die Hauptaufgabe benannter Tupel besteht darin, den Code von der Position der von ihm gesteuerten Elemente zu entkoppeln. Wenn Sie also eine große Liste von Tupeln aus einem Datenbankaufruf erhalten und auf Elemente nach ihrer Position zugreifen, stürzt der Code ab, wenn Sie dem Formular eine neue Spalte hinzufügen, aber wenn die zurückgegebenen Tupel zuerst in benannte Tupel umgewandelt werden und es wird kein Problem geben.

Um dieses Problem zu veranschaulichen, hier ein Code, der gewöhnliche Tupel verwendet:

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

Das Verweisen auf Elemente nach Position macht den Code oft weniger aussagekräftig und hängt auch stark von der Spezifität der Datensatzstruktur ab.

Die folgende Version verwendet benannte Tupel:

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

Eine mögliche Verwendung von benannten Tupeln ist als Ersatz für ein Wörterbuch. später Der Benutzer benötigt mehr Speicherplatz. Wenn Sie daher ein großes Datenentwurfswörterbuch erstellen möchten, ist die Verwendung von „namedtuple“ effizienter. Beachten Sie jedoch, dass „namedtuple“ im Gegensatz zu Wörterbüchern unveränderlich ist.

Wenn Sie Attribute ändern müssen, können Sie dies mit der Methode „namedtuple“ instance_replace() tun. Diese Methode erstellt ein neues benanntes Tupel und ersetzt die entsprechenden Werte.

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)

Ergebnis:

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

_Die Methode replace() hat einen subtilen Nutzen, und zwar kann sie als einfache Möglichkeit zum Ausfüllen benannter Elemente mit optionalem oder verwendet werden fehlende Felder. Erstellen Sie dazu zunächst ein Prototyp-Array mit den Standardwerten und verwenden Sie dann die Methode _replace(), um eine neue Instanz zu erstellen und die entsprechenden Werte zu ersetzen.

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)

Ergebnis:

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

Abschließend und ganz wichtig sollte angemerkt werden, dass, wenn unser Ziel darin besteht, eine effiziente Datenstruktur zu definieren und in Zukunft verschiedene Instanzeigenschaften zu ändern, wir die Verwendung von „namedtuple“ verwenden ist nicht die beste Wahl. Ziehen Sie stattdessen eine Klasse in Betracht, die das Attribut __slots__ verwendet.

Das obige ist der detaillierte Inhalt vonWie Python Namen Elementen einer Sequenz zuordnet (Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen