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
相关推荐
kkpiece 2020-03-25
FlySky 2020-10-16
FlySky 2020-09-29
bizercsdn 2020-09-17
python0 2020-08-16
chenzulong 2020-08-16
LULUBAO 2020-07-08
一叶不知秋 2020-06-28
yogoma 2020-06-14
周小董 2020-06-10
hongxiangping 2020-06-09
xmwang0 2020-06-08
JJandYY 2020-05-31
Andrewjdw 2020-05-27
wklken的笔记 2020-05-27
zhuquan0 2020-05-26
chongtianfeiyu 2020-05-20
cas的无名 2020-05-19