许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  《Fluent Python》笔记及代码示例(第1部分)

《Fluent Python》笔记及代码示例(第1部分)

阅读数 5
点赞 0
article_banner

第一章 数据模型

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

   Python 解释器碰到特殊的句法时,会使用特殊方法去激活一些基本的对象操作,这些特殊方法的名字以两个下划线开头,以两个下划线结尾(例如 __ getitem )。比如 obj[key] 的背后就是 __ getitem __ 方法,为了能求得 my_collection[key] 的值,解释器实际上会调用 my_collection. getitem __(key)。

纸牌例子(展示__ getitem len __ 这两个特殊方法)

   其中关于collections 标准库  可以参考该博客

import collections
import random
# 新建一个只有少量属性的Card类(一张牌)
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()
    #初始化方法,_cards是私有变量
    def __init__(self):
        self._cards=[Card(rank,suit) for rank in self.ranks
                                     for suit in self.suits]
    #长度
    def __len__(self):
    # 通过内置函数来实现特殊方法是最好的选择,内置函数的速度很快
        return len(self._cards)
    #实现了该方相当于对列表的操作都可在类上实现
    def __getitem__(self, item):
        return self._cards[item]

#在排序时为每一张牌定义权重
suit_values=dict(spades=3,hearts=2,diamonds=1,clubs=0)
def spades_high(card):
    rank_value=FrenchDeck.ranks.index(card.rank)
    return rank_value*len(suit_values)+suit_values[card.suit]



if __name__=='__main__':
    deck=FrenchDeck()
    # __len__方法
    #print(len(deck))
    # __getitem__方法
    #print(deck[0])

    #因为有了__getitem__方法,FrenchDeck可以直接被random.choice调用,来实现随机抽一张牌
    #print(random.choice(deck))

    #可以切片迭代
    #print(deck[:3])

    #对牌进行排序
    #sorted函数输入可迭代对象和排序规则
    for card in sorted(deck,key=spades_high):
        print(card)

在使用len()函数时,如果是 Python 内置的类型,比如列表(list)、字符串(str)、字节序列(bytearray)等,那么 CPython 会抄个近路,__ len __ 实际上会直接返回 PyVarObject 里的 ob_size 属性。PyVarObject 是表示内存中长度可变的内置对象的 C 语言结构体。直接读取这个值比调用一个方法要快很多。

   python中在很多时候特殊方法的调用都是隐式的。

特殊方法:
运算符无关:
在这里插入图片描述

运算符有关:
在这里插入图片描述


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删


相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空