生成器(迭代器),过滤器以及修饰器是python中的特色,多用可以提高效率。
生成器(迭代器)
参考来源:https://www.cnblogs.com/wj-1314/p/8490822.html
通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间,在Python中,这种一边循环一边计算的机制,称为生成器:generator
生成器是一个特殊的程序,可以被用作控制循环的迭代行为,python中生成器是迭代器的一种,使用yield返回值函数,每次调用yield会暂停,而可以使用next()函数和send()函数恢复生成器。
生成器类似于返回值为数组的一个函数,这个函数可以接受参数,可以被调用,但是,不同于一般的函数会一次性返回包括了所有数值的数组,生成器一次只能产生一个值,这样消耗的内存数量将大大减小,而且允许调用函数可以很快的处理前几个返回值,因此生成器看起来像是一个函数,但是表现得却像是迭代器
常见的生成器:
如下就是一个生成器:
generator_ex = (x*x for x in range(10))
通过next(generator_ex )
或者generator_ex .__next__()
可以依次得到想要的结果,利用list(generator_ex)
可以一次得到全部的结果。
生成器也可以直接用在for循环中,例如:
for var in generator_ex :
print(var)
创建生成器的,利用yield
例如:
def fib(max):
n,a,b =0,0,1
while n < max:
yield b
a,b =b,a+b
n = n+1
return 'done'
for i in fib(6):
print(i)
运行过程是:利用关键字yield一次性返回一个结果,阻塞,重新开始。
itertools库的学习
还有大量的生成器(迭代器)在itertools库中
库的官网地址:https://docs.python.org/2/library/itertools.html#itertools.permutations
过滤器
过滤器的表达式为:filter(function, iterable),返回一个迭代器
例如:
fil=filter(lambda x:x>0, [1,2,5,4,-6,-9])
修饰器
修饰器相当于一个嵌套函数,例如:
#funA 作为装饰器函数
def funA(fn):
#...
fn() # 执行传入的fn参数
#...
return '...'
@funA
def funB():
#...
funB(args)
和下面的代码是等价的:
#funA 作为装饰器函数
def funA(fn):
#...
fn() # 执行传入的fn参数
#...
return '...'
def funB():
#...
funB=funA(funB)
funB(args)
更加深入可参考:http://c.biancheng.net/view/2270.html