首页 > 代码库 > 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 一摞有风格的纸牌之一张纸牌