当前位置: 首页 > news >正文

python中闭包与装饰器

目录

一、递归函数 

二、闭包

三、装饰器

 标准装饰器:​编辑

 语法糖:

被装饰的函数有参数:

 被装饰的函数有可变参数:

多个装饰器


 

一、递归函数 

递归函数是指在函数内部调用自身的函数。在Python中,可以使用递归函数来解决一些问题,比如遍历树形结构、计算阶乘、斐波那契数列等。递归函数通常包含两部分:基本情况(base case)和递归情况(recursive case)。基本情况是指递归函数应该在什么情况下停止递归,而递归情况则是指函数调用自身的情况。

下面是一个示例,展示如何使用递归函数来计算阶乘:

def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n - 1)

result = factorial(5)
print(result)  # 输出 120

在这个示例中,factorial 函数计算一个数的阶乘。当输入参数 n 等于0时,函数返回1作为基本情况。否则,函数将调用自身并返回 n * factorial(n - 1)。递归函数在 factorial(5) 中计算了 5 * 4 * 3 * 2 * 1,最终返回120。

需要注意的是,递归函数可能会导致堆栈溢出(stack overflow)的问题,所以在使用递归函数时需要确保基本情况能够终止递归,否则会出现无限递归的情况。

示例以及递归函数优缺点:

 

二、闭包

闭包(closure)是指在函数内部定义的函数,并且该内部函数可以访问外部函数中的局部变量。简而言之,闭包是一种函数,它可以捕获并维持其所在作用域的状态,即使这个作用域已经不再存在。

在Python中,闭包通常是通过在一个函数内部定义另一个函数,并且返回这个内部函数的方式来实现的。例如:

def outer_function():
    message = "Hello"

    def inner_function():
        print(message)
    
    return inner_function

my_function = outer_function()
my_function()  # 输出 "Hello"

在这个示例中,inner_function 是一个闭包,它可以访问外部函数 outer_function 中的 message 变量。当调用 outer_function 后,返回的函数 my_function 是一个闭包,可以在其被调用时访问 message 变量并打印出 "Hello"。

闭包的一个重要特点是,它可以捕获并记住其所在作用域的状态。这使得闭包可以在函数外部保持对其所需变量的引用,即使这些变量在外部函数执行完毕后并不再存在。

 示例:

 

三、装饰器

在Python中,装饰器(Decorator)是一种用于修改或包装函数或方法的工具。装饰器允许在不修改原函数代码的情况下,对函数进行功能扩展、修饰或包装,从而实现更灵活和可重用的代码结构。装饰器本质上是一个函数,它接受一个函数作为输入,并返回一个新的函数。

下面是一个简单的示例,演示了如何定义和使用装饰器:

# 定义一个装饰器函数
def my_decorator(func):
    def wrapper():
        print("Before calling the function")
        func()
        print("After calling the function")
    return wrapper

# 使用装饰器来装饰函数
@my_decorator
def say_hello():
    print("Hello!")

# 调用被装饰后的函数
say_hello()

在这个示例中,my_decorator 是一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数 wrapperwrapper 函数在调用被装饰函数之前和之后打印一些信息。通过在 say_hello 函数上方添加 @my_decorator,我们将 say_hello 函数传递给 my_decorator 装饰器函数,从而将其装饰。

当调用 say_hello() 时,实际执行的是被装饰后的函数,即 wrapper 函数。这样,装饰器的功能就被成功应用到了原始函数上。

 标准装饰器:

 

 语法糖:

被装饰的函数有参数:

 被装饰的函数有可变参数:

多个装饰器

多个装饰器的装饰过程,离函数最近的装饰器先装饰,然后外面的装饰器再进行装饰,由内到外的装饰过程。

 

相关文章:

  • DeepSeek助力Vue开发:打造丝滑的键盘快捷键
  • 使用 LLaMA-Factory 微调 llama3 模型
  • LeetCode热题100JS(74/100)第十四天|155|394|739|84|215
  • 【网络安全 | 漏洞挖掘】绕过管理员权限撤销的访问控制漏洞
  • Walrus 基金会完成 1.4 亿美元融资,由 Standard Crypto 领投
  • aab 转 apk
  • 笔试面试01 c/c++
  • 菜鸟的程序编程理解
  • PHP大马的使用
  • 【Spiffo】光速项目:LVGL v9框架下的MIPI简易相机_Part1
  • [数据结构]1.时间复杂度和空间复杂度
  • Resume全栈项目(二)(.React+Ts)
  • AI知识补全(四):微调 Fine-tuning 是什么?
  • Java-01-源码篇-并发编程-资源竞争
  • 《算法笔记》9.6小节 数据结构专题(2)并查集 问题 D: More is better
  • 【TVM教程】使用自定义调度规则(Sketch Rule)在 CPU 上自动调度稀疏矩阵乘法
  • 代码随想录算法训练营第十四天| 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度
  • ​​​​​​​深入解析外观模式(Facade Pattern)及其应用 C#
  • Python(request库)
  • c#难点整理3
  • 大连做网站制作/seo查询在线
  • 北京做网站比较好的公司/seo标题生成器
  • 用jquery做网站好吗/湘潭网站seo
  • 余姚市城乡建设局网站/上海seo顾问
  • 网站建设费用没有发票怎样入账/排名函数rank怎么用
  • 网站的反链要怎么做/社群推广平台