递归
返回值能够作为参数传递
!!!函数的内部自己调用自己
!!!必须有出口
1,2,3数字的累加和
def sum_number(num): if num == 1: return 1 result = num + sum_number(num - 1) return result if __name__ == "__main__": print(sum_number(3))
递归必须有停止条件
递归必须改变其状态并向停止条件靠近
递归必须递归地调用自己
闭包
概念:在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包
构成条件:
在函数嵌套(函数里面在定义函数)的前提下
内部函数使用了外部函数的变量(还包括外部函数的参数)
外部函数返回了内部函数的函数名
def outer(name1): print(f"{name1}:在吗") def inner(name2): print(f"{name2}:我不在") return inner if __name__ == "__main__": func = outer("张三") func("小红")
闭包能够保护我们的数据
修改外部函数变量
def outer(): num = 10 def inner(): nonlocal num # 声明使用外部函数变量num不重新定义 num = 100 print(f"调用inner之前:{num}") inner() print(f"调用inner之后:{num}") return inner if __name__ == "__main__": func = outer() func()
装饰器
定义:装饰器是python的一个重要部分。简单地说:他们是不改变函数功能的基础上,给函数增加一些功能,他们有助于让我们的代码更简短,也更有范儿。
装饰器的本质也是一个闭包函数
def outer(game): def inner(username, password): print("开启外挂") data = game(username, password) # 被装饰的函数 print("关闭外挂") return data return inner @outer # 一旦艾特这个play_war3就会放在game中,函数代码会放在game()中 def play_war3(username, password): print(f"username:{username},password:{password}\n---登录成功") print("欢迎来到艾泽拉斯") return "获得无尽之刃" @outer def play_cs(): print("follow me B塞") if __name__ == "__main__": print(play_war3(123456, 123456)) # play_cs() demo = outer(play_war3) demo(123456, 123456)
如果想看这个的整体运行过程,请读者自行复制代码,放在pycharm中,用debug自行查看。