首页 > 编程语言 > 详细

pythond_递归、回调函数、闭包、装饰器

时间:2021-03-26 21:37:14      阅读:28      评论:0      收藏:0      [点我收藏+]

一。递归

递归概念:在函数中调用函数本身

举例(方法一不使用递归,方法二使用递归。):

"""遍历目录:输出文件夹下的所有文件;需要了解python中的栈"""
import os


# 方法一:使用os.walk 完成
def print_all_files(file_path):
"""
文件操作
:param file_path: 路径
:return: 返回file_path目录下的所有文件信息
"""
for root, dirs, files in os.walk(file_path):
"""root =>目录的根路径 ;dirs =>根目录下的文件夹 ; files =>文件夹下文件信息"""
for filename in files:
# print(root,files)
print(os.path.join(root, filename))


# 方法二:使用递归 ;递归:在函数中调用函数本身
def print_all_files2(file_path):
"""
思路:1。获得file_path下的所有文件及文件夹;使用os.scandir(file_path)方法【python3.5中新增的方法,比os.listdir(file_path)效率更高,速度更快】
2.进行判断如果是文件直接返回,如果是文件夹继续递归调用 print_all_files2(文件夹) 方法
"""
for item in os.scandir(file_path):
# item可以是文件或者文件夹
if item.is_file():
print(item.path) #输出文件夹下的所有文件
elif item.is_dir():
# item.path 返回的是根目录下的所有文件夹
print_all_files2(item.path)
else:
print("出故障了")


# 递归:函数里面调用自身若干次如下:

def recoder(n):
print(f"这是第{n}层打印")
if n <= 1:
return None #结束递归,不结束就会无限递归
else:
n -= 1 #每递归一次,把层数-1
#调用自身
recoder(n)


if __name__ == ‘__main__‘:
p = r"E:\pythons_opens_devs"
print_all_files2(p)
recoder(10)

 

二。回调函数

概念:(回调模式)如果一个函数的参数是函数类型,那么我们可以把这个参数叫做回调函数

# 举栗:
# 比较两个数字的大小,并用不同风格输出。例如:比较 1 和 2 大小并输入 最小值,输出案例:1和2比较,最小的是1

def get_min(a, b, fuc):
# fuc是回调函数的引用
result = a if a < b else b
fuc(a, b, result) #回调
f() #普通调用


def call_back_print_en(a, b, _min):
print(f"compare {a} and {b},min = {_min}")

def f():
pass

if __name__ == ‘__main__‘:
get_min(1, 2, call_back_print_en)

 

三。闭包

概念:通过函数中定义函数的方法,获得函数里面的局部变量

""""
闭包也是一个函数

需求:检测任意函数的参数不运行函数
"""
import logging


# 例子1:
def f1(a, b):
pass


def f2(x, y):
pass


# 用闭包实现
def logger(func):
def log_func(*args):
print(f"{args}返回")
logging.basicConfig(filename="demo.log", level=logging.INFO)
logging.info(f"{func.__name__} is running, arguments is {args}")

# 返回log_func 不加括号,这里是闭包
return log_func # 把log_func函数的引用 传给 logger的调用者


# f1_logger = logger(f1)
# f2_logger = logger(f2)
#
# f1_logger(1,2)
# f2_logger(10,20)


# 例子2:
def outer_function(n):
num = n

def inner_function():
# 修改变量 num
# nonlocal 一般用在嵌套函数中
nonlocal num # global(全局) local(局部) nonlocal(不在本局部,但不是全局:即在其他局部,也就是他的上一级)
num -= 1
print(num)

# 不加括号,返回inner_function()函数的函数名(即引用)
return inner_function


# 一般情况,函数结束,函数里面所有局部变量都会被销毁
# 问:函数调用结束后,我怎么才能获得函数里面的局部变量?
# 回答:使用闭包(在函数里面再定义一个函数,把局部变量暴露给外部)
my_func = outer_function(3)
my_func()


# 例子3:写一个方法,实现 记录某个函数被调用的次数
#闭包实现:某个函数 当做内层函数,外部的函数加一个C变量用来统计内层函数调用的次数
def outer():
c = 0 #用来记录inner调用的次数

def some_funtion():
nonlocal c
c += 1
print(c)

return some_funtion


count_some_fution = outer()
count_some_fution() #1
count_some_fution() #2

 

四。装饰器

 

 

五。装饰器实现原理

pythond_递归、回调函数、闭包、装饰器

原文:https://www.cnblogs.com/newsss/p/14583959.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!