版权属于:
人工智能炼丹师
作品采用:
《
署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)
》许可协议授权
以代码和注释方式,记录《流畅的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[start:end:stride], list[::-1]省略了前两个,-1表示取值的步长,因此可以实现列表反转的功能
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)})
# TODO
from collections import defaultdict
from collections import OrderDict
# {} 内置字典
# OrderDict 是有序字典
# defaultdict #当key不在字段内,默认构建初始值
内部维护了散列表,以空间换时间。代码中涉及在大数组中查找key时,可以考虑为dict实现。
评论 (0)