写在前面
流畅的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 框架的描述,它规范了这门语言自身构建模块的接口,这些模块包括但不限于序列、迭代器、函数、类和上下文管理器。
写到这里,我已经明白,目前我对上述模块的认知度几乎为零~~