Python 中的闭包和迭代器
函数名的使用
1)函数的命名规范和变量名,函数名其实就是变量名
def main():
pass
main=1
print(main)
#这时会输出1
2)函数名可以存在列表中进行遍历
def main1():
print(1)
def main2():
print(2)
lst=[main1,main2]
for fuc in lst:
fuc()
#执行结果输出1,2
3)函数名可以作为参数传给另一个函数
def main1():
print('main1')
def main2(fnc):
fnc()
main2(fnc)
#运行结果:输出'main1'
4)函数可以做返回值
def main1():
return main2
def main2():
print('hello')
func=main1()
func()
#或者直接:main1()()
#运行结果:hello
闭包
- 闭包就是在内层函数中访问外层函数的变量
- 可以保护变量不受侵害
def outner():
a=10#内部可以修改,但是对外部不开放,无法修改,且存放于常驻内存
def inner():
nonlocal a
a=20
print(a)
return inner
fuc=outer()
3)查看一个函数是不是闭包
def func():
a=10
def inner():
print(a)
print(inner.__closure__)#如果打印None,不是闭包,如果不是None,就是闭包
func()
迭代器
- dir() 可以查看某类型的数据有哪些方法,所以带有__iter__,说明此对象可迭代,iterable(可迭代的)
- 可迭代对象可以使用__iter__(),获取到迭代器
- 几乎不占用内存,节省内存,惰性机制,必须
- 迭代器模拟for循环
lst=[1,2,3,4,5,6,7]
for i in lst:#底层使用的是迭代器
print(i)
#try,except,可以在程序发生异常时继续执行
it=lst.__iter__()#获取迭代器
while 1:
try:#尝试执行
i=it.__next__()#获取下一个元素
print(i)
except StopIteration:#处理错误
break
- 判断一个数据类型是否可迭代,可以通过dir来判断数据是否是可迭代的,以及数据类型是否是迭代器
from collections import Iterable #可迭代对象
from collections import Iterator#迭代器
print('__iter__' in dir(数据类型))#判断数据是否是可迭代的,True是,False不是
print(isinstance(对象,Iterable))#判断是否是迭代对象,True是,False不是
print(isinstance(对象,Iterator))#判断是否是迭代器,True是,False不是