Python中不可不知的三大神器


生成器(迭代器),过滤器以及修饰器是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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值