递归
建议先去看看Python如何实现栈
概念 所谓递归,就是在函数内部,去调用自己
def recoder(n):
print(f"这是第{n}次调用")
if n <= 1:
return None
else:
n -= 1
recoder(n)
if __name__ == '__main__':
recoder(10)
这就是一个递归函数。
需求 遍历目录:输出文件夹下的所有文件的绝对路径
代码演示
def print_all_files(file_path):
"""
思路:获得file_path下的所有文件及文件夹 os.scandir(file_path) os.listdir(file_path)
如果是文件,直接输出
如果是文件夹,递归调用print_all_files(文件夹)
"""
for item in os.scandir(file_path):
if item.is_file():
print(item.path)
elif item.is_dir():
print_all_files(item.path)
if __name__ == '__main__':
p = "E:/平台开发学习"
print_all_files(p)
回调函数
概念 如果一个函数的参数是函数类型,那么我们就可以把这个参数叫做回调函数
需求 比较两个数的大小,并用不同风格输出 例如
- compare 1 and 2 ,min = 1
- 1和2比较,最小的是1
代码演示
def get_min(a, b, func):
"""
:param a:数字1 回传给func
:param b:数字2 回传给func
:param func:回调函数 传来的func
:return:
"""
result = a if a < b else b
func(a, b, result)
def call_back_print_en(a, b, _min):
print(f"compare {a} and {b} ,min={_min}")
def call_back_print_cn(a, b, _min):
print(f"{a}和{b}比较,最小的是{_min}")
if __name__ == '__main__':
get_min(1, 2, call_back_print_en)
get_min(3, 8, call_back_print_cn)
总结 函数中调用函数:
- 如果调用的是自身,叫递归
- 如果调用的是别的函数,叫普通调用
- 如果借用参数调用的别的函数,叫做回调
回调函数中的参数,至少有一个是在函数中的参数,例如代码中的a,b
闭包
概念 闭包也是一个函数 他是把一个函数“包”起,把里面的函数封闭在外面的函数
需求 不运行函数,检测任意函数的参数
代码演示
def f1(a, b):
print("f1执行")
def f2(x, y):
print("f2执行")
def logger(func):
def log_func(*args):
logging.basicConfig(filename="demo.log", level=logging.INFO)
logging.info(f"{func.__name__} is running, arguments is {args}")
return log_func
f1_logger = logger(f1)
f2_logger = logger(f2)
f1_logger(1, 2)
f2_logger(10, 20)
def outer_function(n):
num = n
def inner_function():
nonlocal num
num -= 1
return inner_function
my_func = outer_function(5)
my_func()
def outer():
count = 0
def some_function():
nonlocal count
count += 1
print(count)
return some_function
c = outer()
c()
c()
c()
总结
闭包可以将函数里的局部变量保存
|