Maison  >  Article  >  développement back-end  >  parcours d'apprentissage de Python

parcours d'apprentissage de Python

巴扎黑
巴扎黑original
2017-06-23 15:53:481207parcourir

Dans ce chapitre, l'auteur présente brièvement le modèle de données Python, principalement certaines méthodes spéciales de Python. Par exemple, __len__, __getitem__. Et utilisez un programme de cartes à jouer pour expliquer ces méthodes

Tout d'abord, introduisons la différence entre Tuple et nametuple :

Nametuple est similaire à un type de données tuple. En plus de pouvoir accéder aux données à l'aide d'index, il prend également en charge l'accès aux données à l'aide de noms de propriétés pratiques.

L'accès traditionnel aux tuples est le suivant. L'accès à chaque élément doit être trouvé via index. Cette méthode de recherche est très peu intuitive

tup1=(,,)
tup1[1]

Utilisez nametuple pour construire :

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

namedtupe1 prend également en charge l'accès itératif :

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

Traceback (dernier appel le plus récent) :

Fichier "E:/py_prj/fluent_py.py", ligne 17, dans < ;module>

t1.age+=1

AttributeError : impossible de définir l'attribut

Jetons un coup d'œil à l'exemple de carte à jouer dans le book, le code Comme suit :

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]

Définit d'abord le tuple de la carte Card, le rang représente le numéro de la carte et la couleur représente la couleur de la carte. Ensuite, FrenchDeck définit d’abord la signification spécifique des rangs et des couleurs. Initialisez self._cards dans __init__.

__len__ renvoie la longueur des self._cards. __getitem__ renvoie la valeur spécifique de la carte.

Le résultat est le suivant, la longueur de la carte est de 52, où le deck[1] est Card(rank='3',suit='spades')

Vous pouvez voir que len(deck) appelle en fait la méthode __len__. deck[1] appelle __getitem__

Grâce à la méthode __getitem__, un accès itératif peut également être effectué, comme suit :

d deck:
    d

Puisqu'il est itérable, alors nous peut simuler le mécanisme de distribution aléatoire de cartes.

from random import choice
print choice(deck)

Obtenez le résultat :

Card(rank='9', suit='hearts')

Regarder ensuite Un autre exemple, concernant les opérations vectorielles. Par exemple, il existe le vecteur 1, vecteur1(1,2) et le vecteur 2, vecteur2(3,4). Alors le résultat de vecteur1+vecteur2 devrait être (4,6). Vector1 et vector2 sont tous deux des vecteurs, comment mettre en œuvre l'opération ? La méthode est __add__, __mul__

Le code est le suivant :

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

Le résultat de l'opération est le suivant :

Ici, __add__ ,__mul__,__abs__ implémentent respectivement les opérations d'addition, de multiplication et de modulo vectorielles.

Il convient de mentionner la méthode __repr__. Cette méthode est appelée lorsque l'objet doit être imprimé. Par exemple, lors de l'impression de vector(1,2), vous obtenez vector(1,2). Sinon, c'est une chaîne représentant l'objet : . Les fonctions de __repr__ et __str__ sont similaires

.

<br>

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn