函数名的使用 和 闭包 和 迭代器
函数名就是一个变量名
函数名可以作为参数传给函数
def my(): print('我是my') def proxy(fn): # 代理模式,装饰器 print('在处理之前') fn() print('在处理之后') proxy(my) # 在处理之前 # 我是my # 在处理之后
def func(): print('我是func') a =10 def inner(): print('我是inner') return inner func()() # 先运行func() 然后在返回值上加() # 结果为: 我是func 我是inner
闭包:在内层函数中访问外层函数的变量
闭包的作用:
1.可以保护你的变量不受侵害
2.可以让一个变量常驻内存
def outer(): a =10 # 对外界是不开放的,常驻内存,为了inner执行的时候有值 def inner(): print(a) inner() outer()
迭代器
dir(str) # dir 查看xx类型的数据可以执行哪些方法
可迭代对象(Iterable)可以使用__iter__()来获取到迭代器
迭代器(Iterator)里面有__next__()
特点
1.只能向前
2.几乎不占用内存,节省内存
3.惰性机制
for 循环内部机制:
1.首先获取到迭代器
2.使用whlie循环获取数据
3.it.__next__()来获取数据
4.处理异常 try:xxx except StopIteration
lst = ['小白','小李','小花','小明','小龙'] it = lst.__iter__() while True: try: el = it.__next__() print(el) except StopIteration: break
判断是否是迭代器
lst = ['小白','小李','小花','小明','小龙'] it = lst.__iter__() print('__iter__'in dir(it)) print('__next__'in dir(it)) # 可以通过dir来判断数据是否是可迭代的,以及数据是否是迭代器
官方方案
lst = ['小白','小李','小花','小明','小龙'] it = lst.__iter__() from collections import Iterable # 可迭代对象 from collections import Iterator # 迭代器 print(isinstance(lst,Iterable)) print(isinstance(lst,Iterator)) print(isinstance(it,Iterable)) print(isinstance(it,Iterator))