流畅的Python笔记

人工智能炼丹师
2021-03-24 / 0 评论 / 227 阅读 / 正在检测是否收录...

以代码和注释方式,记录《流畅的Python》的笔记,持续更新

第一章 Python的数据类型

魔术方法(magic methods)是形式为"xxx()"的函数为Python的内置函数,用于实现一些特定的功能

用魔术方法实现可迭代对象

class MyList():
    """
    通过实现'__getitem__()'和'__len__()' 完成
    """
    def __init__(self):
        self.data = range(0,100)
    def __getitem__(self, index):
        """
        实现该方法之后,对象变成可迭代和切片,e.g.
        print(MyList()[0])
        for x in MyList():
           print(x)
        """
        return self.data[index]
    def __len__(self):
        """
        实现该方法之后,可以用len求对象的长度,e.g.
        len(MyList())
        """
        return len(self.data)

用魔术方法实现运算符重载

class Vector():
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __repr__(self):
        """在print 对象的时候的输出格式,
           如果没有__repr__方法定义,会输出对象在内存中的地址
        """
        return "{}(x = {}, y = {})".format(self.__class__.__name__, self.x, self.y)
    def __add__(self, vector):
        """
        重载加法+运算符
        """
        x = self.x + vector.x
        y = self.y + vector.y
        return Vector(x, y)
    def __mul__(self, scalar):
        """
        重载乘法*运算符
        """
        return Vector(self.x * scalar, self.y * scalar)
print(Vector(1,2)) #Vector(x = 1, y = 2)
print(Vector(1,2) + Vector(3,4)) #Vector(x = 4, y = 6)
print(Vector(1,2)*0.5) #Vector(x = 0.5, y = 1.0)

第二章 序列构成的数组

两种生成序列的方法

# 利用生成器生成的序列(元组构建生成器)可以节约内存,不会在内存中创建所有需要的元素,当列表长度过长时,优先选择生成器方式
x_generator = (i for i in range(10000000)) # 生成器,type(x_generator)=<class 'generator'>
x_list = [i for i in range(10000000)] # 列表, type(x_list)=<class 'list'>

利用list[::-1]实现反转的原理

列表切片的常规用法,list[start:end:stride], list[::-1]省略了前两个,-1表示取值的步长,因此可以实现列表反转的功能

利用count实现列表/元组计数

l = [1, 1, 2, 3]
t = (1, 1, 2, 3)
print({x:l.count(x) for x in set(l)})
print({x:t.count(x) for x in set(t)})

对比 list、tuple、queue、deque(collections)

# TODO

第三章 字典和集合

几种不同的dict

from collections import defaultdict
from collections import OrderDict
# {} 内置字典
# OrderDict 是有序字典
# defaultdict #当key不在字段内,默认构建初始值

dict/set vs list

内部维护了散列表,以空间换时间。代码中涉及在大数组中查找key时,可以考虑为dict实现。

2

评论 (0)

取消
粤ICP备2021042327号