装饰器迭代器生成器

装饰器

装饰器的本质:一个闭包函

装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展

import time
def timer(func):
    def inner():
        start = time.time()
        func()
        print(time.time() - start)
    return inner

@timer   #==> func1 = timer(func1)
def func1():
    print('in func1')


func1()
装饰器
import time
def timer(func):
    def inner(*args,**kwargs):
        start = time.time()
        re = func(*args,**kwargs)
        print(time.time() - start)
        return re
    return inner

@timer   #==> func2 = timer(func2)
def func2(a):
    print('in func2 and get a:%s'%(a))
    return 'fun2 over'

func2('aaaaaa')
print(func2('aaaaaa'))
带参数返回值的装饰器

迭代器

满足for循环,代表可迭代。字符串、列表、元组、字典、集合都可以被for循环,说明他们都是可迭代的

可以被迭代要满足的要求就叫做可迭代协议。可迭代协议的定义非常简单,就是内部实现了__iter__方法

迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法。

L1 = [1,2,3,4,5,6]
I2 = iter(L1)
print I2
I2.next()
I2.next()
I2.next()
使用内置工厂函数生成迭代器

生成器

一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,

yield相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行。

生成器Generator:

  本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)

  特点:惰性运算,开发者自定义

import time
def genrator_fun1():
    a = 1
    print('现在定义了a变量')
    yield a
    b = 2
    print('现在又定义了b变量')
    yield b

g1 = genrator_fun1()
print('g1 : ',g1)       #打印g1可以发现g1就是一个生成器
print('-'*20)   #我是华丽的分割线
print(next(g1))
time.sleep(1)   #sleep一秒看清执行过程
print(next(g1))
生成器函数
#列表解析
sum([i for i in range(100000000)])#内存占用大,机器容易卡死
 
#生成器表达式
sum(i for i in range(100000000))#几乎不占内存
列表表达式和生成器表达式

 

posted @ 2019-04-08 13:17  pypypy  阅读(174)  评论(0编辑  收藏  举报