函数
函数对象
- 函数是第一类对象
- 函数名可以被引用
- 函数名可以当作参数使用
- 函数名可以当作返回值使用
- 函数名可以当作容器类型的元素
函数嵌套
-
嵌套调用:在函数内部中调用函数
-
嵌套定义:在函数内部中定义函数
名称空间
存放变量名称的空间,分为内置名称空间、全局名称空间、局部名称空间
-
内置名称空间:python中,提前定义的名字,存在内置名称空间中。例如:关键字、内置方法
-
全局名称空间:存放于文件级别的名字,就是全局名称空间
if / while / for 内部定义的名字,在执行之后都存放于全局名称空间
# if 的示例:
var = 4
if var > 5:
var = "var 大于5"
else:
var = "var 小于等于5"
print(var)# 打印结果:var 小于等于5# while 的示例:
num = 0
while num <= 3:
num += 1
print(num)# 打印结果:4# for 的示例
for i in range(2):
pass
print(i)# 打印结果:1 -
局部名称空间:函数内部定义的所有名字都是存放于当前函数的内置名称空间
如果想访问一个变量值,必须先访问对应的名称空间,获取到该变量的名称以及名称和值内存地址之间的关系。
生命周期
- 内置名称空间:python 解释器启动时生效,关闭时失效
- 全局名称空间:当前python文件执行生效,执行结束后失效
- 局部名称空间:函数调用时生效,函数体代码结束时失效
查找顺序
-
局部名称:局部 → 全局 → 内置函数
-
全局名称:全局 → 内置
内置再找不到就会报错
-
函数内部使用的名字,在定义阶段已经规定死了,与调用位置无关
作用域
-
全局作用域:全局可以调用的名字存在于全局作用域。内置名称空间和全局名称空间属于此处
-
局部作用域:局部可以调用的名字存在于局部作用域。局部名称空间属于此处
-
global:将局部名称空间的变量声明成全局变量
注意:global需要在函数内部声明,若在函数外声明,则函数依然无法操作
# 这种情况不能修改x1的值
x1 = 1
def func1():
x1 = 2
func1()
print(x1) # 打印结果:1# 使用global 后,可以修改x2的值
x2 = 1
def func2():
global x2 # 先声明成全局变量
x2 = 2
func2()
print(x2)# 打印结果:2# global 若在函数外声明,无法操作变量
global x3
x3 = 1
def func2():
x3 = 2
func3()
print(x3)# 打印结果:1 -
nonlocal:在局部名称空间声明局部变量。
nonlocal 声明后的变量会从当前函数的外层函数开始一层层去查找该变量。若是一直到最外层函数都找不到,则会抛出异常。
def f3():
x = 4
def f1():
y = 2
def f2():
nonlocal x
x = 3
f2() # 调用f2(),修改f1作用域中名字x的值
print(x) # 在f1作用域查看x。打印结果:3
f1()
print(x) # 打印结果:3
f3()def f3():
x = 4
def f1():
x = 2
def f2():
nonlocal x
x = 3
f2() # 调用f2(),修改f1作用域中名字x的值
print(x) # 在f1作用域查看x。打印结果:3
f1()
print(x) # 打印结果:4
f3()