一.第一类对象
第一类对象 -> 函数名 -> 变量名
1.特征:
函数对象可以像变量一样进行赋值
还可以作为列表的元素进行使用
还可以作为返回值返回
还可以作为参数进行传递
def warpper(): def inner(): print("666") print("inner") return inner ret = warpper() # warpper() 返回值是inner 也就是inner 调用再加() print(ret()) ret()
二.闭包
闭包 -> 函数的嵌套 内层函数对外层函数中的变量的使用
1. 初级的闭包
f warpper(): name = "zhou" # 局部变量常驻在内存 def inner(): print(name) # 在内层函数中使用了外层函数的局部变量 return inner ret = warpper() # ret = inner ret()
2.闭包的优点
1.保护变量不被侵害. (如果需要的变量在全局,任何函数都能调用)
2.让变量常驻内存.(个人理解 当ret = warpper()时 是把warpper函数剥去,这样name就类似全局中的变量,就常驻内存了)
3.查看闭包
__closure__ : 返会东西就是闭包,返回None就不是闭包
def wapper(): name = "alex" def inner(): print("123") print(inner.__closure__) # 查看是否闭包,有内容就是闭包,返回None就不是闭包 return inner wapper()
三.迭代器
一个数据类型中包含了__iter__函数表示这个数据是可迭代的
1.判断迭代器和可迭代对象的方案
1.dir(数据):返回这个数据可执行的所有操作
用dir来查看, __iter__ 有这个就是可迭代的
__iter__ __next__ 有这两个就是 迭代器
2.官方的判断
在 collections中 导入 Iterable Iterator 包
isinstance(对象,Iterable) 判断是不是可迭代的
isinstance(对象,Iterator) 判断是不是迭代器
3.关系
可迭代包含迭代器 也就是迭代器一定是可迭代的,可迭代的不一定是迭代器.
from collections import Iterator ,Iterable lst = [] t = lst.__iter__() #迭代器一定可迭代 可迭代的不一定是迭代器 print(isinstance(lst,Iterable)) # xxx是否是xxx类型的 print(isinstance(t,Iterator)) #判断是不是迭代器
2.模拟for循环
用 __iter__ 拿到迭代器
用 __next__ 来拿下一个
lst = ["贾樟柯", "李安", "杨德昌", "王家卫"] # for i in lst: # print(i) t = lst.__iter__() #拿到迭代器 是一个地址 while 1 : try: print(t.__next__()) #循环着拿数据 except StopIteration: # 拿完的时候会遇到Stopiteration错误 break
3.特征
1.省内存
2.惰性机制
3.只能向前,不能后退