迭代器,闭包,递归
迭代器
函数名的使用
函数名可以当作值赋值给变量
函数名可以当作元素放到容器里
返回函数名的时候不能加()
return aa
func()
func()的作用变成aa() 返回去执行aa函数
1 def func(): 2 def aa(): 3 print(2) 4 return None 5 return aa() # return None 6 func() # func() == None 7 输出值是 2 8 return aa() 9 先调用aa函数 return返回值是aa函数的返回值
闭包
1.首先有一个嵌套函数
2.在嵌套函数内部的函数使用外部(非全局)的变量
满足这两点要求的函数就是闭包
print(函数名.__closure__) 输出结果不是None就是闭包
可以将函数名当作返回值返回,在全局调用
python中,闭包会进行内存驻留,而普通函数在执行后用完了就销毁了
全局里存放会有污染和不安全的现象
装饰器的本质是闭包
闭包的弊端:会出现内存泄漏
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
def func(): name = 'eva' def inner(): print(name) print(inner.__closure__) #有cell 所以是闭包 return inner func()()
迭代器
可迭代对象
可以被for循环的就是可迭代对象
python协议 具有__iter__方法的就是可迭代对象
创建一个迭代器
a = 对象.__iter__
具有__iter__ 和 __next__方法的就是一个迭代器
1 li = [1,2,3] 2 a = li.__iter__() 3 print(a.__next__()) 4 print(a.__next__()) #一个一个取 5 print(a.__next__())
迭代器特性
惰性机制 一行一行往下走
不能从下向上走
一次性的 用完就没了
for循环的机制就是迭代器
1 li = [1,2,3,4,6,7,87,8,9,90,0,0,0,0,8,7,7,67,] 2 em = li.__iter__() 3 while 1: 4 try: 5 print(em.__next__()) 6 7 except StopIteration: 8 break 9 10 try 和 except是用来排错的 如果程序报错执行except下面的break
递归
两点要求:自己调用自己本身 有明确结束条件
def func(n): n+=1 print(n) if n == 5: return func(n) func(2) 输出结果为 3 4 5
递归的效率比较低,尾递归的用时和for的用时是一样的,比for慢
递归的应用场景:
在不明确要循环的次数的时候,可以用递归
递归操作文件目录