一、递归函数
在Python中,递归函数是指一个函数调用自身的过程。递归函数一般包括两个部分:基本情况和递归情况。
基本情况是指在递归过程中终止递归的条件。如果不满足基本情况,递归函数将进入递归情况,调用自身,并缩小问题的规模。
注:递归函数又有一个出口(结束条件)!
递归的深度(函数的条用次数)默认为1000,通过sys模块可以改变递归深度。
示例:
# n的阶乘和
def get_product(v):
if v == 1:
return 1
else:
return v * get_product(v - 1)
def get_sum(n):
if n == 1:
return 1
else:
return get_sum(n-1) + get_product(n)
print(get_sum(4)) # 输出4的阶乘和:33
二、变量的作用域(global、nonlocal)
在Python中,变量的作用域指的是变量的可访问范围。Python中有三种变量的作用域:全局作用域(global)、局部作用域(local)和非局部作用域(nonlocal)。
1、全局作用域(global):全局作用域是在整个程序中定义的变量可被访问的范围。在任何函数内部声明的变量,如果没有使用global关键字进行声明,那么该变量都是局部变量,只能在函数内部使用。而在函数外部声明的变量是全局变量,可以在整个程序中的任何地方访问。
示例:
x = 10 # 全局变量
def func():
y = 20 # 局部变量
print(x) # 可以访问全局变量x
print(y) # 可以访问局部变量y
func()
print(x) # 可以在函数外部访问全局变量x
print(y) # 报错,不能在函数外部访问局部变量y
2、局部作用域(local):局部作用域是在函数内部定义的变量可被访问的范围。在函数内部声明的变量只能在函数内部使用,无法在函数外部访问。
示例:
def func():
x = 10 # 局部变量
print(x) # 可以访问局部变量x
func()
print(x) # 报错,不能在函数外部访问局部变量x
3、非局部作用域(nonlocal):非局部作用域是在嵌套函数中声明的变量可被访问的范围。当在一个函数内部再定义一个函数时,内部函数可以访问外部函数的变量,但不能修改该变量的值。如果需要在内部函数中修改外部函数的变量,可以使用nonlocal关键字进行声明。
示例:
def outer_func():
x = 10 # 外部函数的变量
def inner_func():
nonlocal x # 声明使用外部函数的变量x
x = 20 # 修改外部函数的变量x的值
print(x) # 可以访问修改后的外部函数的变量x
inner_func()
print(x) # 可以在外部函数中访问修改后的变量x
outer_func()
总结:
- 全局作用域中的变量可以在整个程序中任何地方访问。
- 局部作用域中的变量只能在函数内部访问。
- 非局部作用域可以在嵌套函数中访问外部函数的变量,并使用nonlocal关键字修改该变量的值。
三、闭包
在Python中,闭包是指函数对象可以访问并修改定义在其外部作用域内的变量的能力。具体来说,闭包可以在内部函数中引用外部函数的变量,即使外部函数已经执行完毕,这些变量仍然可以被内部函数访问和修改。
闭包的特点:
- 内部函数可以引用外部函数的变量。
- 外部函数的变量在外部函数执行完后仍然可以被内部函数访问和修改。
- 内部函数可以作为外部函数的返回值返回或作为其他函数的参数传递。
示例:
import random
def fun1():
print("fun1")
d0 = []
def fun2():
d0.append(random.randint(1, 20))
print("fun2", d0)
return fun2
# 不同的变量名存储的值不共用
r1 = fun1()
r1()
r1()
r1()
r1() # fun2 [18, 4, 12, 2]
r2 = fun1()
r2() # fun2 [13]
四、装饰器
在Python中,装饰器是一种特殊的函数,用于修改其他函数的行为或功能。装饰器可以在不修改原函数源代码的情况下,对函数进行包装、修饰或扩展。装饰器通常用于添加额外的功能、验证输入参数、缓存结果等。
下面是一个简单的装饰器示例:
def decorator_function(original_function):
def wrapper_function():
print("Before executing the function")
original_function()
print("After executing the function")
return wrapper_function
@decorator_function
def hello():
print("Hello, world!")
hello()
在上面的示例中,decorator_function
是一个装饰器函数,它接受一个函数作为参数,并返回一个修饰后的函数。wrapper_function
是内部函数,包含了对原函数的修饰逻辑。@decorator_function
表示将hello
函数用decorator_function
装饰。
当执行hello()
时,实际执行的是wrapper_function
。在执行original_function()
之前和之后,打印了一些额外的信息。这样,我们就实现了在不修改hello
函数源代码的情况下,给它添加了额外的功能。
这只是一个简单的装饰器示例,实际中装饰器还可以传递参数、支持多层装饰等。装饰器是Python中非常强大和灵活的特性,可以帮助我们优雅地扩展和修改代码功能。