递归、回调、闭包

函数中调用函数:如果调用的是自身,叫递归

"""
遍历目录:请用递归方法输出某文件夹下的所有文件的绝对路径
"""
import os


def print_all_files(file_path):
    for root, dirs, files in os.walk(file_path):
        for filename in files:
            print(os.path.join(root, filename))


def print_all_files2(file_path):
    """
    思路:获得file_path下的所有文件及文件夹    # os.scandir(file_path)  os.listdir(file_path)
    如果是文件,直接输出
    如果是文件夹,递归调用print_all_files2(文件夹)
    """
    for item in os.scandir(file_path):
        if item.is_file():
            print(item.path)  # 输出文件夹下的所有文件
        elif item.is_dir():
            print("~~~~~~")
            print_all_files2(item.path)  # 有多少个文件夹,print_all_files2函数就被调用多少次


def recoder(n):
    print(f"这是第{n}层录屏")
    if n == 1:
        return None  # 结束递归,因为不结束就会无限递归
    else:
        n -= 1  # 每递归一次,把层数-1
        recoder(n)  # 第n层递归


if __name__ == '__main__':
    p = "C:/Users/10795/PycharmProjects/python_advance_programming"
    print_all_files2(p)
    recoder(4)

函数中调用函数:如果调用的是其他函数,叫普通调用

函数中调用函数:如果借用参数调用的别的函数,叫回调

def get_min(a, b, func):  # 来: 传来的函数func; 回:我把参数回传给你——func
    # func是回调函数的引用
    result = a if a < b else b
    func(a, b, result)  # 回调
    f()  # 普通调用


def f():
    pass


# 回调函数一
def call_back_print_en(a, b, _min):
    print(f"compare {a} and {b},min={_min}")


# 回调函数二
def call_back_print_zh(a, b, _min):
    print(f"{a} 和 {b}比较,{_min}最小")


if __name__ == '__main__':
    get_min(1, 2, call_back_print_zh)

闭包:两个函数,外函数和内函数,外函数返回内涵书的引用,内涵书调用外函数的参数

"""
闭包也是一个函数

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


def f1(a, b):
    print("hello")


def f2(x, y):
    pass


# 用闭包实现
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}")

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


f1_logger = logger(f1)  # def f1(a,b):pass
f2_logger = logger(f2)  # def f2(x,y):pass
f1_logger(1, 2)
f2_logger(10, 20)
logger(f1)(1, 2)


def outer_function(n):
    num = n

    def inner_function():
        # nonlocal 一般用在嵌套函数中
        nonlocal num  # global(全局) local(局部)  nonlocal(不在本局部,但不是全局)
        print("hello")
        num -= 1

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


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


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

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

    return some_function


count_some_function = outer()
count_some_function()  # 1
count_some_function()  # 2
count_some_function()  # 3


你可能感兴趣的:(Python之测试开发,python,开发语言)