9.变量的作用域(global与nonlocal):
global 与 nonlocal
global:用于在函数内部声明一个或多个变量为全局变量。在函数外部定义的变量默认为全局变量,但在函数内部直接修改这些全局变量时,如果不使用global
关键字,Python 会将其视为局部变量并创建一个新的同名局部变量。使用global
关键字可以明确指出要修改的是全局变量。(作用域通常大多数使用global)
示例:
nonlocal:用于在嵌套函数中声明一个或多个变量为外层函数的局部变量(即非全局变量)。nonlocal
仅适用于Python 3,在Python 2中内嵌函数可以使用外层作用域中通过赋值的所有名称,但不能进行修改。在Python 3中,nonlocal
允许内嵌函数修改定义在语法上位于外层的函数的作用域中的一个或多个名称。
示例:
10.递归函数:
递归函数是指在函数定义中调用函数自身的函数。( 一种特殊的函数(自己调用自己) 必须有:递归出口)递归函数通常用于解决可以被分解为相似子问题的问题,例如计算阶乘或斐波那契数列等。
示例:
11.匿名函数:
Python 中的匿名函数是指没有命名标识符的函数,通常被称为lambda函数。与普通函数不同,它们是一种更加简洁的方式来编写小型临时函数。lambda函数使用lambda
关键字来定义,其语法如下:
12.闭包:
闭包是Python中的一种高级特性,指的是在函数内部定义了另外一个函数,并返回了这个内部函数作为函数对象,同时还保存了外层函数的状态信息。这个内部函数可以依赖外层函数的变量和参数,而且外层函数返回的是这个内部函数的引用。
重点:1.外部函数嵌套内部函数,2.外部函数返回内部函数,3.内部函数可以返回访问外部函数局部变量
-
定义函数和闭包:
fun1
是一个外部函数,它定义了一个空列表datas
和一个内部函数fun2
。fun2
在fun1
内部定义,它可以访问并修改fun1
中的datas
列表,即使在fun1
执行完毕后也可以继续访问和修改。
-
生成随机数:
- 每次调用
r = fun1()
后,r
实际上是指向fun2
函数的引用。 - 每次调用
r()
时,会向datas
列表中添加一个随机生成的整数,并打印当前datas
列表的内容。
- 每次调用
-
多次调用生成多个闭包:
- 在
r
和r1
分别存储了不同的闭包实例。 - 虽然它们都是由
fun1
生成的,但它们各自维护着独立的datas
列表。
- 在
-
打印闭包的内存地址:
id(r)
和id(r1)
打印了r
和r1
这两个闭包对象的内存地址。- 这表明虽然它们来自同一个函数
fun1
,但它们是独立的对象实例,各自拥有独立的状态(即各自的datas
列表)。
- 每次调用
r()
或r1()
都会生成新的随机数并打印,datas
列表中的内容会随之增加。 id(r)
和id(r1)
展示了两个闭包对象在内存中的地址,它们是不同的对象实例。
这里还有一个简单的闭包例子:
13.装饰器:
装饰器是Python的一个强大功能,它允许在不改变函数代码的情况下,增加额外的功能。它实际上是一个函数,接受一个函数作为参数,并返回一个新的函数。
装饰器的基本用法
装饰器通常使用@
符号来应用。这里有一个简单的例子来展示如何定义一个装饰器并使用它:
首先,举个例子这是原来的代码
下面是使用@
符号:
带参数的装饰器
如果你想要装饰的函数本身也接受参数,你可以通过*args
和**kwargs
来捕获这些参数,并在内部调用原始函数时使用它们:
-
定义装饰器
my_decorator
:my_decorator
是一个接受函数func
作为参数的装饰器。- 在
my_decorator
内部,定义了一个包装函数wrapper
,它接受任意数量的位置参数args
和关键字参数kwargs
。
-
包装函数
wrapper
:- 在
wrapper
函数内部,首先打印一条信息,表明函数调用前的操作。 - 然后调用原始函数
func
,并将args
和kwargs
传递给它,将返回值赋给result
。 - 最后再打印一条信息,表明函数调用后的操作。
- 将
func
的返回值result
返回给调用者。
- 在
-
应用装饰器
@my_decorator
:- 通过在
add
函数定义前加上@my_decorator
,将add
函数传递给my_decorator
并重新定义为wrapper
函数的返回值。
- 通过在
-
调用
add(5, 3)
:- 当你调用
add(5, 3)
时,实际上是调用了被装饰后的wrapper
函数。 wrapper
函数先打印"Something is happening before the function is called."
。- 然后调用原始函数
add
,计算并返回结果8
。 - 最后打印
"Something is happening after the function is called."
。 - 最终输出结果
8
。
- 当你调用