高级处理机制
1. 描述符代理类
2. 迭代 / yield __iter__ / next() 事先生成自己维护序号返回 yield使用时才生成
注,第3行在python 3.x以的版本中的方法,next()符号改用__next__代替
2.1 自定义迭代器的实现
注,21行由于self.idx越界导致异常,所以正常工作的迭代器应该有异常处理机制,本文将在后续内容中说明如何使用异常机制。
2.2 yield 解释器阻断
在上一节使用的,当调用iter()时,解释器会在内存中生成本所要迭代对象内存实体,之后用next遍历此对象。当对象长度很大时,且需要逻辑生成时,如此处理太过缓慢。所以后续提出了yield阻断方式。
此思路的示例,系统自带的 range / 与xrange。当调用 range(1,100)时,系统生成一个1-100 的内存实体。而当调用xrange (1,100) 时,只有当调用相应序号的元素时,才会生成实体。
3. try 机制
由于python由解释器动态处理内存,源文件只相当于解释器的数据,所以错误完全可控,try机制比c++要轻量很多。通过测试代码是否异常可以简化很多逻辑判断,同时一般的逻辑处理部分不会太杂乱。如上面的迭代器部分,可以改用
注,在for中通过try机制来处理循环迭代,程序通过异常来交互特殊情况,使逻辑更加简单清晰。
3.1 异常机制的处理结构
注,except是程序异常时会跳入的分支,else是程序正常时进入的分支,finally是所以整个代码块最终要进入的分支,
主要用来释放try语句中用到的资源。这三个部分都是可选存在的。
- 当try内部代码较多时,不一定只有一种异常,可以用多个except捕捉,也可以用一个except捕捉多个。
注,12行表示,捕捉未指定的其它类型异常
注,可以指明多个异常用同一个逻辑处理
- 捕捉异常实体
3.2 with 将try中用到的资源用with 去监控,省去finally的控制收尾
上面提到用finally去为程序做收尾,保证无论在什么情况下,资源可以正常的释放。但在这种情况下,需要手动维持资源。比如在流程中打开的文件之类,如果try出错,在异常跳出前要在finally中显示关闭。这样很容易导致资源泄漏,此时,可以将这些符号交给with对象处理。
注,两部分代码的功能相同,但是明显把对象交给with管理要比try...finally...简单清晰的多。
但是,with的管理基于对像实现了__enter__() / __exit__() / __context__()方法。所以,大部分情况下,还得使用try...finally...控制。
4. 模块导入 import / reload
程序中导入模块是基于把模块中代码执行(解释)一遍,之后记入将模块名记入名词空间。重复import不会多次执行,reload会重新导入模块。
5. 编译加速 compile (string, file, type) type 类型声明
eval 可求值表达式,生成的代码被eval调用
exec 可执行语句组,生成的代码被exec调用
single 可执行语句,生成的代码被exec调用
注,第4行其实也没报错。
6. 传递函数 用关联函数实体的符号,做参数
7. 偏函数 为函数指定特定参数,改变接口
8. 装饰函数 用其它函数包装自定义函数,并且将自定义符号关联到包装函数的返回值
所谓装饰,就是被装饰函数做为参数传入装饰函数执行,并被装饰函数的符号重新关联到装饰函数的返回值上。
- Debugger: pdb
- Logger: logging
- Profilers: profile, hotshot, cProfile