Heim  >  Artikel  >  Backend-Entwicklung  >  Python-Lernreise

Python-Lernreise

巴扎黑
巴扎黑Original
2017-06-23 15:53:481199Durchsuche

In diesem Kapitel stellt der Autor kurz das Python-Datenmodell vor, hauptsächlich einige spezielle Methoden von Python. Zum Beispiel __len__, __getitem__. Und verwenden Sie ein Spielkartenprogramm, um diese Methoden zu erklären

Lassen Sie uns zunächst den Unterschied zwischen Tuple und Nametuple vorstellen:

Nametuple ähnelt ein Tupel-Datentyp. Neben der Möglichkeit, über Indizes auf Daten zuzugreifen, unterstützt es auch den Zugriff auf Daten über praktische Eigenschaftsnamen.

Der traditionelle Tupelzugriff ist wie folgt. Der Zugriff auf jedes Element muss über einen Index erfolgen. Diese Suchmethode ist sehr unintuitiv

tup1=(,,)
tup1[1]

Verwenden Sie nametuple, um Folgendes zu konstruieren:

tup2=namedtuple(,[,,])
t1=tup2(,,)
t1
t1.age
t1.height
t1.name
得到结果如下,namedtupel中tuple2是类型名,name,age,height是属性名字
从上面的访问可以看到,直接用t1.age的方法访问更加直观。当然也可以用索引比如t1[0]的方法来访问

namedtupe1 unterstützt auch iterativen Zugriff:

t t1:
    t
和元组一样,namedtupel中的元素也是不可变更的。如果执行t1.age+=1。将会提示无法设置元素

Traceback (letzter Aufruf zuletzt):

Datei „E:/py_prj/fluent_py.py“, Zeile 17, in < ;module>

t1.age+=1

AttributeError: can't set attribute

Schauen wir uns das Spielkartenbeispiel im an Buch, der Code Wie folgt:

collections namedtuple

Card=namedtuple(,[,])

FrenchDeck:
    ranks=[str(n) n range(2,11)] + list()
    suits=.split()
    __init__(self):
        self._cards=[Card(rank,suit) suit self.suits
rank self.ranks]
    __len__(self):
        len(self._cards)
    __getitem__(self, position):
        self._cards[position]

__name__==:
    deck=FrenchDeck()
    len(deck)
    deck[1]

Definiert zunächst das Kartentupel Karte, Rang repräsentiert die Kartennummer und Farbe repräsentiert die Kartenfarbe. Dann definiert FrenchDeck zunächst die spezifische Bedeutung von Rängen und Farbe. Initialisieren Sie self._cards in __init__.

__len__gibt die Länge von self._cards zurück. __getitem__ gibt den spezifischen Kartenwert zurück.

Das Ergebnis ist wie folgt: Die Länge der Karte beträgt 52, wobei Deck[1] Karte(Rang='3',Farbe='Pik') ist

Sie können sehen, dass len(deck) tatsächlich die Methode __len__ aufruft. deck[1] ruft __getitem__ auf

Aufgrund der __getitem__-Methode kann auch ein iterativer Zugriff wie folgt durchgeführt werden:

d deck:
    d

Da es iterierbar ist, dann wir kann den Mechanismus des zufälligen Kartenhandelns simulieren.

from random import choice
print choice(deck)

Ergebnis erhalten:

Karte(Rang='9', Farbe='Herzen')

Als nächstes ansehen Ein weiteres Beispiel zu Vektoroperationen. Beispielsweise gibt es Vektor 1, Vektor1(1,2) und Vektor 2, Vektor2(3,4). Dann sollte das Ergebnis von Vektor1+Vektor2 (4,6) sein. Vektor1 und Vektor2 sind beide Vektoren. Wie wird die Operation implementiert? Die Methode lautet __add__, __mul__

Der Code lautet wie folgt:

vector:
    __init__(self,x=0,y=0):
        self.x=x
        self.y=y
    __repr__(self):
        % (self.x,self.y)
    __abs__(self):
        hypot(self.x,self.y)
    __bool__(self):
        bool(abs(self))
    __add__(self,other):
        x=self.x+other.x
        y=self.y+other.y
        vector(x,y)
    __mul__(self, scalar):
        vector(self.x*scalar,self.y*scalar)
__name__==:
    v1=vector(1,2)
    v2=vector(2,3)
    v1+v2
    abs(v1)
    v1*3

Das Operationsergebnis lautet wie folgt:

Hier implementieren __add__, __mul__, __abs__ Vektoradditions-, Multiplikations- und Modulo-Operationen.

Erwähnenswert ist die __repr__-Methode. Diese Methode wird aufgerufen, wenn das Objekt gedruckt werden muss. Wenn Sie beispielsweise vector(1,2) drucken, erhalten Sie vector(1,2). Andernfalls handelt es sich um eine Zeichenfolge, die das Objekt darstellt: Die Funktionen von __repr__ und __str__ sind ähnlich

<br>

Das obige ist der detaillierte Inhalt vonPython-Lernreise. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn