首页 > 代码库 > 1-1 一摞有风格的纸牌之一张纸牌

1-1 一摞有风格的纸牌之一张纸牌

写在前面

流畅的Python第一章的主题是讲数据模型。Python中的数据模型是指什么呢?Honestly,我也不知道。

虽然潜意识中认为所谓数据模型是指对数据的处理及构建,那具体的处理和构建方式又是什么呢?希望学习到后期,我能对这个概念深入且能手到擒来地侃侃而谈。

一摞有风格的纸牌

流畅的Python中给出的第一个例子是一摞有序的纸牌:

import 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包,这个包导入的作用是什么呢?看着这段代码,我完全不知道。好在,作者在书中给出了答案,是采用collections中的namedtuple构建一个简单的类来表示一张纸牌。

关于namedtuple的作用,作者的解答是:用以构建只有少数属性但是没有方法的对象,比如数据库条目。实践出真知,目前我用的Python版本是3.6,直接去看Python的官方文档:

技术分享

官方文档此处是采用sqlite3的数据库,目前我的本机有安装mysql,采用mysql来实践一下对数据库的处理:

import pymysql
from collections import namedtuple
EmployeeRecord = namedtuple(‘EmployeeRecord‘, ‘name, age, title, department, paygrade‘)

conn=pymysql.connect(
    host=‘127.0.0.1‘,
    port=3306,
    user=‘root‘,
    passwd=‘你的数据库密码‘,
    db=‘fluet_python‘, # 你的数据库中的数据库名称
)
cur = conn.cursor()

# insert a new record,首先要有这张表employees
# 如果没有,可以采用这条语句创建
# cur.execute("创建表的sql语句")
cur.execute("insert into employees values(‘cat‘,‘24‘,‘tester‘,‘TG‘,‘9000‘)")
# select a record
cur.execute(‘SELECT name, age, title, department, paygrade FROM employees‘)
# print(cur.fetchall())
for emp in map(EmployeeRecord._make, cur.fetchall()):
    print(emp.name, emp.title)
    # print(emp)

cur.close()
conn.commit()
conn.close()
>>>
cat tester

关于数据库的连接需要自行百度,代码段中打印的cur.fetchall()[返回查询的所有结果]。 那么,这段代码中的问题又来了~~map()函数是干嘛的?以前的书又白看了

map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。那么,在map(EmployeeRecord._make, cur.fetchall())中,EmployeeRecord._make是一个函数,cur.fetchall()是一个列表,打印emp会得到如下结果:

>>>
EmployeeRecord(name=‘cat‘, age=24, title=‘tester‘, department=‘TG‘, paygrade=‘9000‘)

那么,又来了~EmployeeRecord._make的作用是什么呢?官方解释:Class method that makes a new instance from an existing sequence or iterable。

举例如下:

from collections import namedtuple

# 构建一个Point类
Point = namedtuple(‘Point‘, [‘x‘, ‘y‘])
t = [11, 12]
# 将一个存在的列表t实例化
p = Point._make(t)
print(p)

# 返回一个新的OrderedDict字段名称并映射到相应的值
d = Point._asdict(p)
print(d)

# 列出p中已命名的元组字段名称清单
f = p._fields
print(f)

Color = namedtuple(‘Color‘, ‘red green blue‘)
Pixel = namedtuple(‘Pixel‘, Point._fields + Color._fields)
print(Pixel(11, 22, 128, 255, 0))

>>>
Point(x=11, y=12)
OrderedDict([(‘x‘, 11), (‘y‘, 12)])
(‘x‘, ‘y‘)
Pixel(x=11, y=22, red=128, green=255, blue=0)

这段代码来自Python官方文档。

现在,我们看完了一摞有风格的纸牌中一张纸牌是怎么生成的,明天继续看一摞纸牌是怎么生成的。

写在后面

关于数据模型,作者给出了如下答案:

数据模型其实是对 Python 框架的描述,它规范了这门语言自身构建模块的接口,这些模块包括但不限于序列、迭代器、函数、类和上下文管理器。

写到这里,我已经明白,目前我对上述模块的认知度几乎为零~~

 

1-1 一摞有风格的纸牌之一张纸牌