《流畅的python》阅读笔记 - 第一章:python数据模型

由于 《流畅的python》是进阶的python书籍,在阅读的时候有些内容还需要查阅相关书籍补充基础知识,所以在此记录一些理解.

一摞python 风格的纸牌

示例程序 1.1:

import collections          #导入collections库

Card = collections.namedtuple('Card', ['rank', 'suit'])

class FrenchDeck:
    ranks = [str(n) for n in range(2, 11)] + list('JQKA')
    suits = 'spades diamonds clubs hearts'.split()

    def __init__(self):
        self._cards = [Card(rank, suit) for suit in self.suits
                                        for rank in self.ranks]

        def __len__(self):
            return len(self._cards)

        def __getitem__(self,position):
            return self._cards[position]

知识点

  • collections.nametuple

python 的列表(list),元祖(tuple)等基础的容器除外,collections 库包含了其它的容器,collections 包含的内容比较多,可以使用print(collections.__all__)查看所有的子类,进一步了解.这里先介绍被使用的nametuple类.
在python基础中,list的元素的值是可以修改的,而元祖则无法修改,不过它们都只能通过下标来访问各个元素的值.nametuple()的在此的作用是创建一个类似字典,可以用名字来访问元素的值.
在这里插入图片描述
经测试,这里的元组名字可以修改为其他字符串,并不影响程序,但是返回的对象,即该语句等于号左边的 ‘Card’ 不可单独修改.因为后文用它来实例元组.

ranks = [str(n) for n in range(2, 10)] + list('JQKA')```

n in range(2,11) 创建了一个2到11的列表,srt(n)将本来是数值转换为字符,然后使用+号来连接它们,运行这段代码以后,ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']

 suits = 'spades diamonds clubs hearts'.split()

split()函数将字符串按空格分割,suits是一个含有4个元素的列表: ['spades', 'diamonds', 'clubs', 'hearts'],对应扑克牌的4个花色

self._cards = [Card(rank, suit) for suit in self.suits
                                        for rank in self.ranks]

这是一段python风格的代码,Card(rank, suit) for suit in self.suits for rank in self.ranks(其实是列表生成器,第二章有进一步说明)这里的两个 for..in..是嵌套循环,根据suit和rank来生成列表.我想它等同于以下程序:

for suit in self.suits:
    for rank in ranks:
        self._cards.append(Card(rank,suit))

__len__(),__getitem__()这种前后由2个下划线的命名方式是python的特殊方法,所以平时程序员就不要用这种风格定义自己的函数了,免得现在或以后和python的特殊方法冲突,python特殊方法使用和普通的方法不同,详见后文。

如何使用特殊方法

__len__()是一个特殊的方法,python规定len()来调用它,而不是和普通的方法一样,使用user_object.len(),在上文中,实例程中,程序告知python当用户使用 len()函数的时候,应该怎么做:

      def __len__(self):
            return len(self._cards)

这里,程序获知,对 self._cards 求长度,由于是对对象使用len函数,对象里面可能有很多内容,所以就通过这种方法来确定.

__getitem__()是另一个特殊的方法:

      def __getitem__(self,position):
            return self._cards[position]

它告知python,如果使用```object[n]的方式来访问的时候,应该怎么做,毕竟一个对象可能含有很多个列表,很明显,程序确定了就是访问self.cards``列表.

模拟数值类型

数值比如1,2,4,5,它们都可以进行四则运算等,对于程序员自定义的类型,比如一个类有两个数值变量,那么我们就需要告知python,当运行比如object_1 + object2的时候,应该具体怎么做,这可以用__add__()来实现,此外还有__mul__()等,详见《流畅的python》1.2.

本章小结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值