文章目录
- 一,闭包函数
- 二,装饰器(重要)
- 三,递归
Python基础学习(1)基本知识
Python基础学习(2)序列类型方法与数据类型转换
Python基础学习(3)进阶字符串(格式化输出)
Python基础学习(4)散列类型(无序序列)
Python基础学习(5)流程控制
Python基础学习(6)函数基础与函数参数
Python基础学习(7)函数作用域与名称空间.
Python基础学习(8)函数进阶-闭包/装饰器
Python基础学习(9)迭代器/生成器
一,闭包函数
闭: 封闭 嵌套函数
包: 对数据进行的操作函数(就是内层函数)
条件:
1.必须是一个嵌套函数
2.外层函数必须返回内层函数
3.内层函数必须操作外层函数数据
# 大胃王比赛
food = 0# 挑战碗数
def f1():global foodfood += 1 # 需要修改每次吃完的次数# print(food)
f1()
print(food)
f1()
print(food)
# 没有封闭 很容易被修改
food = 0
print(food)
语法格式:def 外层函数名():def 内层函数名():代码块return 内层函数名 # 这里的返回值是外层函数
# 闭包
def food1():bowl=0def f():nonlocal bowlbowl+=5 # bowl=bowl+5return bowlreturn fa=food1() # 获取函数里的数据内存地址
print(a()) # 内层函数第一遍运行
print(a()) # 内层函数第二遍运行
bowl=0
print(a()) # 不会变了 在给函数被多次调用的过程中 让这些私有变量能够保持起持久性
# 判断 是否是闭包函数
print(a.__closure__) # cell 是闭包
print(food1.__closure__)#不是闭包
print(f.__closure__) # 报错 内层函数是闭包 但是因为被外层函数封闭起来了 无法直接查询
二,装饰器(重要)
掌握了闭包 相当于装饰器就掌握好了
因为装饰器最基本的样子就是闭包函数
装饰器: 在不修改源代码和调用方式的情况下 给函数添加功能
器: 工具
装饰: 添加功能
开放: 扩展功能(增加功能)
封闭:对修改源代码封闭
开发一款程序 这个程序应该是可拓展 但是不能修改
要是想修改源代码 肯定这个程序就会终止运行
import time
def play(food, s):print('饿了就点饿了么')print(f'这个夜宵{food}非常好吃')print(f'外卖还有多少{s}秒送达')time.sleep(s) # 程序休眠 执行时间def get_time(f):#装饰器装饰play(在不改变play的情况下)def calc(*args, **kwargs):start = time.time()f(*args, **kwargs)end = time.time()print(end - start)return calcfun = get_time(play)
fun('螺蛳粉', 3)
def 煎饼果子():print('我是煎饼果子')def 火锅():print('我是火锅')def 加工(f): # 准备加工的东西 f形参 哪个函数需要添加功能def 加料():f() # 加工的食材拿出来print('加包卫龙') # 添加的功能return 加料 # 原本的东西加工后的结果
装饰器是 Python 中一种强大且灵活的功能,它的作用主要包括以下几个方面:
-
代码复用:装饰器可以将一些通用的功能封装起来,然后应用到多个函数中,实现代码的复用,避免重复编写相同的代码。
-
增强函数功能:通过装饰器,可以在不修改原函数代码的情况下,为函数添加额外的功能,比如日志记录、性能统计、权限校验等。
-
解耦合:装饰器可以将函数的核心逻辑与其他功能进行解耦合,使得代码更加清晰、易于维护。
-
动态扩展:装饰器可以在运行时动态地为函数添加或修改功能,使得程序在不停止运行的情况下进行功能的扩展。
-
提高代码可读性:通过装饰器,可以将一些与核心逻辑无关的代码抽离出来,使得函数的功能更加清晰明了,提高代码的可读性。
-
面向切面编程(AOP):装饰器是实现面向切面编程的一种重要方式,可以在不修改原函数代码的情况下,为函数添加横切关注点,比如日志、事务管理等。
总的来说,装饰器是一种强大的工具,可以帮助我们实现代码复用、功能增强、解耦合、动态扩展等目的,提高代码的可维护性和可读性,是 Python 编程中常用的技术手段之一。
三,递归
递归函数: 定义一个函数 函数内部自己调用自己
并且这个操作可以停止
写递归的时候要有明确递归出口
def factorial(n):if n==0:return 1return n*factorial(n-1)
print(factorial(4))