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

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

     

  • 相关阅读:
    Linux常用命令ifconfig的相关信息
    搭建路由实例
    httpclient以json形式参数调用http接口并解析返回的报文
    思考(机遇)
    php 对齐方法
    RequireJS简单介绍即使用
    一周小结(2016-06-06~2016-06-12)
    git介绍及使用
    一周小结(2016-05-30~2016-06-04)
    [转] Mou 一个Markdown工具 语法规则文档(最后)
  • 原文地址:https://www.cnblogs.com/catleer/p/6838811.html
Copyright © 2020-2023  润新知