python特殊方法
from math import hypot
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __repr__(self): # 交互式控制台和调试程序,表示字符串,__str__被str()调用
return 'Vector(%r, %r)' % (self.x, self.y)
def __abs__(self):
return hypot(self.x , self.y)
def __bool__(self): # 如果不存在__bool__,那么bool(x)会调用x.__len__(),如果0,返回False,否则True
return bool(abs(self))
def __add__(self, other):
x = self.x + other.x
y = self.y + other.y
return Vector(x, y)
def __mul__(self, scalar):
return Vector(self.x * scalar)
其他Python魔术方法指南
列表
board = [['_'] * 3 for i in range(3)]
board = [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
# 一个谜题
t = (1, 2, [30, 40])
t[2] += [50, 60]
# 会发生什么呢?
t = (1, 2, [30, 40, 50, 60]) # 同时报元组不可修改的错
sorted(list, key=str.lower, reverse=True)
import bisect #二分的方法查找插入
bisect.bisect()
bisect.insort()
# 当列表不是首选时,其他的数据结构array, set, deque
from array import array #数组
from random import random
floats = array('d', (random() for i in range(10*7))) #类型码d是双精度浮点数组
floats.tofile()
floats.fromfile()
# 内存视图,在数据结构之间共享内存
numbers = array.array('h', [-2, -1, 0])
memv = memoryview(numbers)
len(memv) -> 5
from collections import deque
dq = deque(range(10), maxlen=10)
dq.rotate(3) # 队列旋转
dp.appendleft(-1)
dp.extend([11, 22])
dp.extendleft([8, 9])
# 其他queue queue, multiprocessing, asyncio, heapq