首页 > 技术文章 > 第一阶段:遍历,闭包

lhTest 2021-11-23 17:51 原文

废话不多说。先上总结

遍历:就是对函数的内部方法重新调用函数自己

闭包:外部函数返回内嵌函数

举例对一个文件夹进行遍历取出里面所有的文化和文件夹

遍历1.1

我们先看一个很简单的函数(使用os.walk内置函数)

import os
def test_A(osptah):
for root,item,files in os.walk(osptah):
for file in files:
print(os.path.join(root,file))

好了,看下结果

 

 

遍历1.2

自己编写函数实现遍历文件

代码(注意看内部方法调用函数自己)

def test_B(ospath):
for i in os.scandir(ospath):
if os.path.isfile(i):
print(os.path.join(ospath,i))
elif os.path.isdir(i):
test_B(i)

结果

 

 OK这就是遍历是不是很简单,下面开始介绍闭包

闭包1.1

代码

def test_A(func):
# 这就是闭包函数
def wrapper(args):
print(func.__name__)
func()
print('args的元素是%s结束'%args)
# 返回内部函数
return wrapper

def first_A():
print('我是first_A')

def first_B():
print('我是first_B')
if __name__ == '__main__':
# 要理解的是使用test_A(first_A)返回的结果是wrapper这个地址然后赋值给了A
A=test_A(first_A)
# 要理解的是使用test_A(first_B)返回的结果是wrapper这个地址然后赋值给了B
B=test_A(first_B)
A('A')
B("B")

结果

 

 OK上面就是闭包了,接下来再看看不返回内部函数有啥区别

闭包1.2

不返回内部函数代码

def test_A(n):
num=n
def test_B():
print(num)
if __name__ == '__main__':
test_A(5)

结果

 

返回内部函数代码

def test_C(n):
num = n

def test_B():
print(num)

return test_B
if __name__ == '__main__':
# test_A(5)

b=test_C(5)
b()

结果

 

 咦,是不是发现有点意思了,那我们再看下一个

闭包1.3

代码

def test_C():
n=0
def test_B():
nonlocal n
n=n+1
print(n)
return test_B
if __name__ == '__main__':
# 当使用闭包时,变量并不会随着函数的调用结束而销毁
# 也就是可以保持程序上一次运行后的状态然后继续执行。
t=test_C()
t()
t()
t()

结果

 

 OK这个呢就是咱们的结论

1.内嵌函数必须引用一个定义在闭合范围内(外部函数里)的变量——内部函数引用外部变量

2.外部函数必须返回内嵌函数——必须返回那个内部函数

闭包的作用:可以保持程序上一次运行后的状态然后继续执行。

推荐阅读