迭代器,闭包,递归

迭代器

函数名的使用

函数名可以当作值赋值给变量

函数名可以当作元素放到容器里

返回函数名的时候不能加()

    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中,闭包会进行内存驻留,而普通函数在执行后用完了就销毁了

全局里存放会有污染和不安全的现象

装饰器的本质是闭包

闭包的弊端:会出现内存泄漏

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慢

递归的应用场景:

在不明确要循环的次数的时候,可以用递归

递归操作文件目录

原文地址:https://www.cnblogs.com/biulo/p/10538678.html