Python高级编程——速查笔记 第一、二章
这本《Python 高级编程》 是为数不多的python高级编程技巧、知识总结,刚刚读了两章就收获颇丰,在本人博客做MARKDOWN练习以及供未来速查相关资料。
Python高级编程 (速查笔记 第一、二章)
第一章
1. 编译器
- cPython 目前主要用这个,最新最先进的。
- Jython Java实现的解释器,方便python调Java类。
- IronPython .net 环境环境下 类似于jython 。
- PyPy 汇编练习项目,支持奇怪语法 不实用 。
2. 安装python
可选模块
- python-dev 编译C时候用到的python头文件
- python-profiler 非GPL模块 例如hotshot优化器
- gcc 包含C代码扩展时候用的软件包
- 定制python命令行模式下的行为 (略 p10)
- setuptools - 类似于python的 apt 工具 安装easyinstall工具时候会安装setuptools,方法
是下载es_setup.py 使用命令python es_setup.py setuptools
命令安装工具 在系统terminal
下使用easy_install xx
来安装其他包 - 使用VIM编辑器 (p19 略)
- 使用集成环境 (p19 略)
第二章 语法的最佳实践——低于类级
1. 列表推导式(List comprehensions)
- 使用“[]”包裹一个生成表达式 例如
[i*2 for i in range(10) if i%3==0 else i*3]
,生成表达式内可以生成一个列表 (有优化加成,运行速度快)
2. 迭代器 (Iterators)和生成器(generators)
- 迭代器 类内实现 .next 和 .__iter__ 这两个方法的类,就是迭代器,结束时候.next抛出 StopIteration异常,.__iter__返回这个类的实例。
调用时候使用 xxx.next() 模式来使用,或者 用for in 遍历 (句柄短,处理本函数耗时少)
- 生成器 一个函数使用 yeild 返回句柄,调用该方法返回值就是一个特殊的迭代器,它就是生成器 (缩短句柄,类似管道操作)(详细见 p29)
还可以用
somevar=(yeild)
模式来使用 .send(var) 代替.next() 给生成器内传递参数,并返回值
-
协同程序 使用 生成器 构造函数中 使用try except finally 语法写的,带.send .带close 那种生成器
-
生成器表达式 就是列表推导式中的[]方括号 改成()圆括号
-
itertools 模块 (构造各种生成器)
- islice: 窗口迭代器
itertools.islice(可迭代对象,阈值,参数2默认None)
返回迭代器
就像在一个列表中的滑动窗口。 - tee: 往返迭代器
itertools.tee(可迭代对象)
返回多个相同的迭代器,由于tee内部是缓存机制(一个迭代对象被消耗完 ,多个迭代器会同时被增加新值)适用于交替迭代和同步迭代,不适合依次迭代(消耗过多内存)。参考资料 - groupby 类似于 unix中的uniq
itertools.groupby(可迭代对象)
是一个同时返回两个值的迭代器,第一个值是KEY 第二个值是被分组好的可迭代对象 (P36) - 其他itertools 函数参考链接
- islice: 窗口迭代器
3.装饰器(Decorators)
就是一个以函数为参数的函数,其返回值仍然是个函数,作用是增强,或者改变 参数函数的功能。使用装饰器语法使得代码更易读。
- 使用如下方法 定义一个装饰器
def mydecorator(function):
def _mydecorator(*arg,**kw):
# 加入函数运行前做的事(AA)
res = function(*arg,**kw)
# 加入函数运行前做的事(BB)
return res
return _mydecorator
还可以在这个上面再包一层,让装饰器带函数 详见(p39)
- 参数检查 包裹层 用 in out 承载输入输出类型,函数运行前,检查传入函数与输入类型是否符合,
函数结束后,检查函数输出值是否与输出类型相同。不符合raiseError 在全局记录相关映射表格,可以查看RPC调用是否合法。(P41) - 缓存 利用hash算法 记录函数名 传入参数的哈希值,当做KEY,设定 value 和 time(判断过期与否) 两个值,下次访问命中就返回缓存之,否则调用函数并,更新缓存。(注意多级包装需要在调用时候添加括号)p43
- 代理 例子是用包裹层传递该函数所需要的的权限,利用 globals().get() 拿到当前user信息,比对用户的roles跟程序比对,如果不符合raise exception(p45)
- 上下文提供者 例如使用threading.Rlock 使用装饰器 并用 try: finally:语法来得到和释放锁
- 更多装饰器的资料
4.上下文管理器 (contextlib 和 with)
就是常用的 with file('/demo.txt') as f:...
这种就是上下文,实际上就是 try … finally 关闭资源。
定义时候 一个类 实现 __ enter__(self)
方法和 __exit__(self,excepion_type,exception_value,excepion_traceback)
就可以使用with协议,exit返回true将不抛出异常
- contextlib模块 引入
from contextlib import contextmanager
用dosomeprepare try: yeild except Exception e : dosomenote rasie e else: dosomeclose
语式来替代enter 和exit语句