python cookbook笔记
1,数据结构和算法
1.1,元组拆包
1.2,元组拆包*args
1.3,collections.deque:队列,保留最后几个元素
1.4,heapq.nlargest(),heapq.nsmallest():最大,最小几个元素
1.5,heapq.heappush(),heapq.heappop():优先级队列
1.6,collections.defaultdict:一键多值字典
1.7,collections.OrderedDict:有序字典,类似pd.Series
1.8,通过zip(d.values(), d.keys())计算字典k的values的最小值,最大值,排序
1.9,对字典使用集合操作
1.10,去重保持元素顺序不变:用集合 + 生成器,可哈希和不可哈希实现时有差异
1.11,切片slice和indices
1.12,collections.Counter()找出出现次数最多,类似Series.value_counts()
1.13,字典列表的排序:operator.itemgetter,lambda
1.14,原生不支持比较操作的实例间的排序:operator.attrgetter,lambda
1.15,itertools.groups():
1.16,筛选序列:列表推导,生成器推导,filter
1.17,创建字典子集:字典推导
1.18,具名元组:比字典更高效
1.19,归约函数 + 生成器表达式:避免创建临时列表带来的大开销
1.20,collections.Chainmap:多个映射合并为一个映射
2,字符串和文本
2.1,re.split
2.2,startswith, endswith
2.3,fnmatch, fnmatchcase, glob
2.4,文本查找:find, startswith, endswith, re
2,5,文本替换:re.sub, re.subn
2.6,文本查找和替换时不区分大小写:re.IGNORECASE,re.sub的支撑函数
2.7,贪婪匹配.*和懒惰匹配.*?
2.8,re.DOTALL可以让.匹配换行符
2.9,用unicodedata.normalize规范unicode文本
2.10,正则表达式处理unicode字符
2.11,去除文本内容:strip,replace,sub,生成器表达式高效处理文本
2.12,
2.13,对齐文本:ljst, rjust, center, 以及format的^, >, <
2.14,字符串拼接和合并:join,+,format
2.15,
2.16,
2.17,
2.18,
2.19,
2.20,
3,数字、日期和时间
3.1,
3.2,
3.3,
3.4,
3.5,
3.6,
3.7,
3.8,
3.9,
3.10,
3.11,
3.12,
3.13,
3.14,
3.15,
4,迭代器和生成器 *****
4.1,手动对访问迭代器:next()
4.2,委托迭代:交给另一个iterable背后的itertor
4.3,用generator实现itertor
4.4,实现经典版的iterable + itertor
4.5,反向迭代协议__reversed__:可以用generator实现
4.6,有额外状态的生成器:用类实现
4.7,itertools.islice():可以对iterator使用切片,iterator由于没有__getitem__无法使用普通切片,也不知道__len__
4.8,itertools.dropwhile():跳过开头元素。明确跳过个数可以用islice(items, 3, None)跳过3个
4.9,itertools.permutations(it, n):前n元素的排列。itertools.combinations(it, n):前n元素的组合不可重复。itertools.combinations_with_replacement(it, n):前n元素的组合可重复。
4.10,enumerate():索引-值对迭代
4.11,zip(),itertools.zip_longest():同时迭代多个容器
4.12,itertools.chain():依次迭代多个容器,不会产生新序列,省空间
4.13,用生成器实现管道
4.14,yield from扁平化处理嵌套序列
4.15,heapq.merge():对不同类型的容器进行排序后依次迭代,注意与itertools.chain()的区别
4.16,iter() + 哨符值,可以取代while
5,文件IO
5.1,open读写文件,模式,encoding,newline,unix和windows到换行符
5.2,print('', file=f)
5.3,print的sep,end
5.4,open读写二进制
5.5,执行文件不存在时才写入的操作,可以用open + 'x'取代os.path.exists
5.6,创建类似文件的对象:io.StringIO(),io.BytesIO(),,主要有read/write/getvalue方法
5.7,gzip.open,bz2.open读写压缩文件
5.8,functools.partial() + iter,可以实现对固定大小内容进行迭代
5.9,二进制数读取到可变缓冲区:f.readinto(buff)
5.10,mmap内存映射:看起来就像bytearray,对文件进行内存映射不会将整个文件读到内存中,而是保留一段虚拟内存,按需映射到内存中
5.11,os.path:basename,dirname,expanduser,splitext
5.12,os.path:exists,isfile,isdir,islink,realpath,getsize,getmtime
5.13,os.path.listdir
5.14,
5.15,
5.16,
5.17,
5.18,
5.19,
5.20,
5.21,
6,数据编码与处理
6.1,
6.2,
6.3,
6.4,
6.5,
6.6,
6.7,
6.8,
6.9,
6.10,
6.11,
6.12,
6.13,
7,函数 *****
7.1,*args,**kwargs
7.2,仅限关键字参数,可以放在*args后面,或者放*后面
7.3,函数注释:def fun(x: int, y: int) -> int
7.4,函数返回多个值:即返回元组
7.5,有默认参数的函数,注意防御可变参数
7.6,lambda:参数,微型函数,回调
7.7,lambda绑定变量的值:只有输入参数可变,其余参数运行时才绑定
7.8,functools.partial():冻结参数,为某些函数提供默认值
7.9,只有一个方法的类,可以考虑用闭包代替
7.10,回调函数绑定额外状态的方法:类,闭包,协程,类 + functools.partial / lambda
7.11,内联回调
7.12,访问闭包内的变量
8,类与对象 *****
8.1,obj == eval(repr(obj))
8.2,__format__特殊方法
8.3,上下文管理器:先触发__enter__,再触发with代码块,最后触发__exit__
8.4,__slots__特殊方法:节省内存,属性只允许是__slots__范围内的
8.5,私有属性:对子类隐藏属性可以使用双下划线
8.6,@property属性管理,@property让函数变属性
8.7,多重继承:指定父类,super()
8.8,继承时涉及到property的场景
9.9,描述符(类的属性笔记中,版本一的描述符)
8.10,property装饰的只读属性多次调用会多次计算,可以对其进行缓存
8.11,简化构造函数,有点类似namedtuple
8.12,抽象基类的继承,注册等
8.13,描述符:初始化时无需输入名字,允许输入限制条件。简化约束步骤(无需输入name)有三种方法:描述符种生成自增name,类装饰器,元类
8.14,抽象基类
8.15,委托属性访问,委托实现代理,委托实现继承(有什么用?)
8.16,使用classmethod定义备选构造函数
8.17,实例化时不执行构造函数__init__()
8.18,mixin技术:类继承实现,类装饰器实现
8.19,带有状态的对象或状态机
8.20,getattr(),operator.methodcaller()
8.21,访问者模式:递归实现
8.22,访问者模式:非递归实现
8.23,环状内存中管理数据
8.24,运算符重载,total_ordering
8.25,创建缓存实例(有什么用?)
9,元编程 *****
9.1,双层装饰器
9.2,from functools import wraps:不用wraps(func)的话,func.__name__拿到的是内层装饰器wrapper名称
9.3,访问原始函数:obj.__wrapped__
9.4,三层装饰器:可以接受参数的装饰器,参数在装饰时修改
9.5,三层装饰器:可以接受参数的装饰器,参数可以通过设置被装饰函数的属性修改
9.6,二层装饰器:能接受可选参数
9.7,通过装饰器实现类型检查
9.8,类的方法是装饰器,例如property
9.9,类是装饰器:需要实现__call__,__get__
9.10,装饰器作用到类和静态方法上:需要放在@classmethod和@staticmethod下面
9.11,通过装饰器为被包装的函数添加参数
9.12,利用装饰器给类定义打补丁
9.13,元类
9.14,元类
9.15,元类
9.16,*args和**kwargs上强制规定一种参数签名
9.17,元类
9.18,通过编程方式定义类
9.19,元类
9.20,元类
9.21,property工厂函数
9.22,contexlib.contextmanager
9.23,exec在局部函数中的作用域问题
9.24,python源代码
9.25,python源代码
10,模块和包
10.1,模块导入
10.2,模块导入,__all__控制
10.3,相对名称导入:from . import module
10.4,一个package含有多个module,惰性导入
10.5,
10.6,
10.7,
10.8,
10.9,
10.10,
10.11,
10.12,
10.13,
10.14,
10.15,
11,网络和web编程
11.1,
11.2,
11.3,
11.4,
11.5,
11.6,
11.7,
11.8,
11.9,
11.10,
11.11,
11.12,
11.13,
12,并发
12.1,
12.2,
12.3,
12.4,
12.5,
12.6,
12.7,
12.8,
12.9,
12.10,
12.11,
12.12,
12.13,
12.14,
13,实用脚本和系统管理
13.1,fileinput.input读取文件
13.2,SystemExit()异常退出
13.3,argparse
13.4,getpass.getpass()
13.5,os.get_terminal_size()获取终端大小
13.6,subprocess.check_output(),subprocess.Popen()
13.7,shutil:copy,copy2,copytree,move
13.8,shutil:make_archive(),unpack_archive(),tarfile/zipfile/gzip/bz2
13.9,os.walk()
13.10,configoarser读取配置文件
13.11,logging:basicConfig,config.fileConfig,getLogger
13.12,logging:给库添加日志记录
13.13,秒表计时器
13.14,内存和CPU使用量设定限制
13.15,加载web浏览器
14,测试、调试和异常
14.1,unittest
14.2,unittest
14.3,unittest
14.4,unittest
14.5,unittest
14.6,处理多个异常:except按照列出的顺序检查,可以用mro打印异常的类层次结构
14.7,捕获所有异常:exception,注意针对异常原因做日志记录或报告
14.8,自定义异常
14.9,引发异常来响应另一个异常:raise...from...,raise...from None
14.10,重新抛出上一个异常
14.11,警告信息:warning.warn
14.12,崩溃问题进行调试
14.13,程序性能分析和计时统计
14.14,程序优化:函数/尽量减少属性访问/频繁访问的变量改为局部变量/减少装饰器属性描述符/用内建容器/减少不必要数据结构
15,C语言扩展
15.1,
15.2,
15.3,
15.4,
15.5,
15.6,
15.7,
15.8,
15.9,
15.10,
15.11,
15.12,
15.13,
15.14,
15.15,
15.16,
15.17,
15.18,
15.19,
15.20,
15.21,