python装饰器、迭代器、生成器、闭包等等

闭包是什么
内层函数调用外层函数。
返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域

def outer():
    name = '好好听课'
    def inner():
        print("你要干嘛",name)
    return inner

fun = outer()
fun()

闭包+高阶函数=装饰器

为什么要用装饰器?
软件开发需要遵守以下原则:
开闭原则:
1.对已实现的功能模块不应该修改
2.对现有的功能的扩展开发

装饰器,python自带语法糖
例题:用装饰器实现程序计算程序计算时间

import time

def count_time(fun):
    def inner():
        start_time = time.time()
        fun()
        end_time = time.time()-start_time
        print(end_time)
    return inner

@count_time
def loop():
    for i in range(10):
        print(i)

loop()

迭代器

a =iter([3,1,2,33])
print(type(a))
print(a.__next__(),a.__next__(),a.__next__(),a.__next__())
<class 'list_iterator'>
3 1 2 33

可以看到a是一个迭代器的类,需要用next方法或循环取出迭代器中的值
map()函数返回的也是一个迭代器,可以用list()方法取出对应的值,上列中的a也可以用list(a)取出对应的值,返回的就是一个列表

生成器,生成器本质是一个计算算法,可以用循环迭代来取出你想要的数据,而列表等于一个固定存在内存里的数,直接通过地址去取数据list[n],复杂度为O(1),生成器需要用用一个循环去取出你想要的数据,复杂度为O(n)

b = [x**2 for x in range(5)]
#这是一个列表生成式
c = (x**2 for x in range(5))
#这是一个列表生成器,同样可以用next()方法去一个个取数
print(next(c))
print(c.__next__())

把()变成[]就变成了列表表达式
把列表表达式的【】变成()就变成了生成器,创建一个列表时,列表容量是有限的,所以我们在循环使用的时候一遍循环
一边计算去生成,就叫生成器,generator。
生成器保留的是算法,每次调用的时候就去计算,如果没有更多元素,就报错,也是可迭代对象

把函数变成生成器的方法,即把return变成yield

def add_one(x):
    yield x+1

相关推荐