高级处理机制

来源:互联网 发布:淘宝兼职平面模特 编辑:程序博客网 时间:2024/06/05 06:31

高级处理机制

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

 

0 0
原创粉丝点击