闭包是什么
内层函数调用外层函数。
返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域
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__())
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