Python 3程序开发指南(第2版 修订版)
过程型程序设计快速入门
- for in
- try except as
数据类型
- sys.float_info.epsilon
- seq[start:end]实际上代表[start, end)区间,s[:]相当于s[0:len(s)]
- 不一致:当使用负数step时,start默认为-1:s[::-2]
- strTemplate.format(agr0, arg2, name1=value1,...)
- {0} {1} {2} ...
- {name1} {name2} ... //混用时编号参数在前面,命名参数放到后面
- 使用当前作用域范围内的局部变量? **locals() //locals()返回一个字典,**将其拆分
组合类型
- 序列:bytearray、bytes、list、str、tuple
- collections.namedtuple
- 列表拆分:first, *rest = [1,2,3,4]
- 列表理解:[expr for i in L]
- 集合:set
- 集合理解:{expr for i in s}
- 映射:3.0 dict、collections.defaultdict,3.1 collections.OrderedDict
- setdefault:防止d[k]+=1这样的语法第一次调用时抛出KeyError
控制结构与函数
模块
OOP
文件处理
- bytes.fromhex ?
- f.seekable()
高级程序设计技术
- 生成器:实现者使用yield惰性返回,调用者for in获取之
- 重置当前值:generator.send(val), val作为yield表达式的结果接受
- 动态导入模块:最原始的方法
- code = open(filepath, "r", encoding="utf8").read()
- module = type(sys)(name)
- sys.modules[name] = module
- exec(code, module.__dict__)
- 装饰器:高阶函数,original_func --> wrapped_func(这里一个主要的理解障碍在于*args, **kwargs参数的语法)
- 函数注释:__annotations__
- Functor:__call__
- 上下文管理器:with expr as var: suite
- expr返回的结果必须实现__enter__ __exit__,如open()返回的文件对象
- 描述符*:__get__ __set__ __delete__
- __slots__ = ()
- 类修饰器:class --> class'
- nonlocal
- ABC(抽象基类)
- 元类(?)
FP
- functools.partial
- @coroutine:为协程调用内置的next(),使其执行到第一个yield处并等待
- 构成流水线*
调试、测试与Profiling
- p366 Python 3的优点之一是区分str与bytes?
- Python 3.0异常链的支持:raise NewException(...) from err
进程与线程
网络
数据库
正则表达式
- 负前瞻:(?!e)
- m.span(g):返回组g在文本中匹配的起始接受索引位置(start,end)
分析简介
PyParsing
- 要素:Literal()、Supress()、Keyword()(必须全词匹配)
- Word("abc")匹配abacus?
- CharsNotIn() SkipTo() Regex()
- Forward() 空的要素?
- 量化:Optional()、ZeroOrMore()、OneOrMore()、Group()、Combine()
- 处理BNF的惯用法:
- 不要写成item | Empty(),而是Optional(item)
- 变量列表:var_list = variable + ZeroOrMore(Supress(",")+variable)
- 设置动作:.setParseAction(lambda tokens: ...)
- 分析一阶逻辑*:
- 例:(forall x: exists y: true) -> true & ~true -> true
- ParseElement.enablePackrat()
PLY
- t_TOKENNAME p_bnf_rule ...
GUI