迭代器
python迭代器就是一个实现了迭代容器的实现对象
本身有两个方法:
__next__:返回容器下一个元素
__iter__:返回迭代器本身
生成器
generator生成器带有yield语句的函数都可以称之为生成器,生成器是可以进行迭代的。生成器可以用for或者next进行迭代。
generator还可以使用send进行值的传递。
装饰器
装饰器的作用就是使函数包装与方法包装(一个函数,接受函数并返回增强后的函数)
语法和实现方式:
作为一个函数
def mydecoretor(function):
def wrapped(*args,**kwargs):
#在调用函数前,做点什么
result = function(*args,**kwargs)
#函数调用之后,做点什么
#并返回结果
return result
return function
2. 作为一个类
如果装饰器需要复杂的参数化或者特定的依赖状态。可以写成类的形式。尽管绝大多数情况装饰器都是用函数来实现的。
class DecoratorAsClass:
def __init__(self, function):
self.function = function
def __call__(self, *args, **kwargs):
#在调用原始函数前,做点什么
result = self.function(*args, **kwargs)
#在调用原始函数后,做点什么
#并返回结果
return result
3. 参数化装饰器
def repeat(number = 3):
'''多次执行装饰函数。
返回最后一次原始函数调用的值作为结果
:param number:重复次数,默认为3
'''
def actual_decorator(function):
def wrapped(*args,**kwargs):
result = None
for _ in range(number):
result = function(*args,**kwargs)
return result
return wrapped
return actual_decorator
保存内省的装饰器
装饰器用法和有用的例子:
用法:
①参数检查
②缓存
③代理
④上下文提供者
上下文管理器
为了确保即使再出现错误的情况下也可以运行某部分代码:try......finally语句是很有用的。
这个语句的场景:
①关闭一个锁
②关闭一个文件
③创建一个临时代码补丁
④在特殊环境中运行受保护的代码
with语句给这些场景的代码块提供了一种简单的方式。即,即使该段代码出现错误,依然可以运行某部分的代码。
with 所求值的对象必须包含__enter__()方法和一个__exit__()方法。
紧跟with 后面的语句被求值以后,返回对象的__enter__()对象被执行,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块完全执行了之后,再执行__exit__()方法
#!/usr/bin/env python
# with_example01.py
class Sample:
def __enter__(self):
print "In __enter__()"
return "Foo"
def __exit__(self, type, value, trace):
print "In __exit__()"
def get_sample():
return Sample()
with get_sample() as sample:
print "sample:", sample
结果为:
In __enter__()
sample: Foo
In __exit__()
ps:__exit__方法的三个参数:
type:
value: integer division or modulo by zero
trace:
解释:with后面任何代码块异常抛出时,__exit__()方法就被执行了,与之关联的type,value和stack trace传给__exit__()方法,因此抛出的ZeroDivisionError异常被打印出来了
Python的with语句是提供一个有效的机制,让代码更简练,同时在异常产生时,清理工作更简单。