目录
一、递归函数
二、闭包
三、装饰器
标准装饰器:编辑
语法糖:
被装饰的函数有参数:
被装饰的函数有可变参数:
多个装饰器
一、递归函数
递归函数是指在函数内部调用自身的函数。在Python中,可以使用递归函数来解决一些问题,比如遍历树形结构、计算阶乘、斐波那契数列等。递归函数通常包含两部分:基本情况(base case)和递归情况(recursive case)。基本情况是指递归函数应该在什么情况下停止递归,而递归情况则是指函数调用自身的情况。
下面是一个示例,展示如何使用递归函数来计算阶乘:
def factorial(n):if n == 0:return 1else: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_functionmy_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
是一个装饰器函数,它接受一个函数作为参数,并返回一个新的函数 wrapper
。wrapper
函数在调用被装饰函数之前和之后打印一些信息。通过在 say_hello
函数上方添加 @my_decorator
,我们将 say_hello
函数传递给 my_decorator
装饰器函数,从而将其装饰。
当调用 say_hello()
时,实际执行的是被装饰后的函数,即 wrapper
函数。这样,装饰器的功能就被成功应用到了原始函数上。
标准装饰器:
语法糖:
被装饰的函数有参数:
被装饰的函数有可变参数:
多个装饰器
多个装饰器的装饰过程,离函数最近的装饰器先装饰,然后外面的装饰器再进行装饰,由内到外的装饰过程。