#1深入迭代器Interator
'''
(1)迭代集合元素,迭代单个没有意义
(2)只能向前迭代,迭代不能返回
(3)线程不安全(比如可变元素迭代完后更改值)
(4)迭代没有索引下标可以通过enumerate()自行创建索引
(5)用几个迭代几个(惰性求值)
'''
setlist=["a","b","c","d","e"]
setllist=iter(setlist)
try:
while True:
varl=setllist.__next__()
print(varl)
except StopIteration:
pass
for din,ke in enumerate(setlist):
print(din,ke)
'''
(1)使用iter()创建迭代器
(2)在for里面in后面的对象自动调用iter(for做好了异常处理)
(3)在函数里重写__iter__()方法和__next__()方法
'''
'''
2,生成器(Generator)
'''
#(1) 推导时使用括号就变成了生成器
lst=[1,2,3]
ss1=(x+1 for x in lst)
#中括号返回列表解析
lst=[1,2,3]
ss1=[x+1 for x in lst]
#(2)生成器函数(yield)
#每一次到yield停止,(暂停时变量封装在生成器中)
#下次调用再次循环
def yields():
print("生成前")
for a in range(10,0,-1):
yield a
print("生成后")
gety=yields()
print(gety.__next__())
'''
3.函数及闭包
'''
#(1)函数是第一类对象func是引用则func(1,2)是在调用函数(函数名是函数的引用)
#(2)多个引用可以指向同一个函数(也是对象)
def func(a,b):
return a+b
add=func#这是将函数对象赋值给add
print(func(1,2))#这是在调用函数
print(add(1,2))
#(函数对象的引用也可也当作参数)callable("对象")是否可以调用
"""
嵌套函数(闭包)
jj返回值的是按照顺序查找的
(1)本地不被global(声明全局变量)声明的变量
(2)外围空间 上层函数(多次由内而外查找)
(3)再到全局 本函数空间
(4)内置模块 其他调用的模块中
"""
def diao():
jj="在这里"
def strs():
jj="不在这里"
return jj#*****
return strs
def he(f):
return f()
print(he(diao()))
'''
1,装饰器,和语法糖
(1)装饰器修饰函数
(2)装饰器是函数的一种运行环境
(3)装饰器是一个闭包
(4)语法糖简化修饰器
'''
def doupi(fn):
def jiaduopi(*args):
print("豆皮")
return fn(*args)+10
return jiaduopi
def xiangcai(fn):
def jiaxiangcai(*args):
print("香菜")
return fn(*args)+5
return jiaxiangcai
@xiangcai
@doupi
def dioguo(a,b):
print("地锅50元")
return a*b
#平常方法(顺序是由内向外计算)
xx=xiangcai(doupi(dioguo))
print("测试",xx(1,3))
#使用语法糖方法
print(dioguo(1,3))
第七节课,迭代器interator,生成器Generator,函数闭包,装饰器,语法糖
最新推荐文章于 2020-10-16 19:50:39 发布