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的官方文档:

image

官方文档此处是采用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 框架的描述,它规范了这门语言自身构建模块的接口,这些模块包括但不限于序列、迭代器、函数、类和上下文管理器。

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

 

转载于:https://www.cnblogs.com/catleer/p/6838811.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值