Python函数进阶:对象特性、嵌套定义、名称空间与作用域详解
本文深入解析Python中函数作为对象的核心特性,包括引用、传参、返回值及容器存储。详细阐述函数嵌套定义与调用的执行逻辑,并系统讲解内置、全局、局部三种名称空间的加载与查找顺序。最后通过global和nonlocal关键字演示作用域变量的修改机制,帮助开发者掌握Python函数的高级用法。
函数的对象
在Python语言中,万物皆对象,函数也不例外。这意味着函数可以被赋值给变量,可以作为参数传递给其他函数,也可以作为返回值返回,甚至可以作为元素存储在容器中。理解这一特性是掌握Python函数式编程的基础。
函数对象的四大功能
引用
def f1():
print('from f1')
f1() #调用函数
print(f1)
print('*'*50)
f = f1 # 将函数名f1赋值给f
f() # f也可以调用函数
print(f)
from f1
<function f1 at 0x000001FB05534620>
**************************************************
from f1
<function f1 at 0x000001FB05534620>
函数名本质上是一个变量名,它指向函数体所在的内存地址。因此,函数名不仅可以接收函数执行后返回的值,还可以像普通变量一样进行赋值操作。例如,将函数名赋值给另一个变量后,新变量同样可以调用该函数。
当做参数传给一个函数
def f1():
print('from f1')
def f2(a):
return a
f3 =f2(f1)
f3()
print(f3)
from f1
<function f1 at 0x00000275FA914620>
可以当做函数的返回值
def f1():
print('from f1')
def f2():
return f1
f3 =f2()
f3()
print(f3)
from f1
<function f1 at 0x0000014931304620>
可以当做容器类型的元素
def f1():
print('from f1')
l = [1,2,3,f1]
l[3]()
from f1
函数的嵌套
函数的嵌套定义
在函数内部定义另一个函数称为嵌套定义。需要注意的是,内部定义的函数只能在外部函数的作用域内被调用,无法在外部函数之外直接使用内部函数,否则会导致NameError。
函数的嵌套调用
from math import pi
def circle(r,action):
if action == 'p':
def perimeter():
return 2 * pi * r
res = perimeter()
elif action == 'a':
def area():
return pi * r**2
res = area()
else:
return ' '
return res
result = circle(2,'p')
print(result)
12.566370614359172
名称空间与作用域
名称空间
名称空间是内存中用于存储变量名与变量值绑定关系的区域,即存放变量名的空间。根据生命周期和可见性的不同,Python中的名称空间主要分为三种类型。
内置名称空间
内置名称空间存放了Python解释器内置的所有名字,例如数据类型int、float以及内置函数len等。这些名字在解释器启动时即可直接使用。
len() int()
内置名称空间的生命周期从解释器启动时开始,直到解释器关闭时失效。它是始终存在的,且优先级最高。
全局名称空间
全局名称空间用于存放除了内置名称和局部名称之外的所有名字。例如,在脚本顶层定义的变量x、函数func、列表l等都会存储在此空间中。
全局名称空间的生命周期从文件执行时开始,直到文件执行结束后失效。它贯穿整个脚本的运行过程。
局部名称空间
局部名称空间用于存放函数调用期间,函数体内部产生的名字。每个函数调用都会创建一个新的局部名称空间,用于隔离该函数的局部变量。
def f1():
x = 1
def f2(): # f2就是局部名称空间
pass
f2()
局部名称空间的生命周期从函数调用时开始,直到函数执行结束后失效。每次调用函数都会重新创建和销毁该空间。
加载顺序 (考试必考)
名称空间的加载顺序固定为:内置名称空间 -> 全局名称空间 -> 局部名称空间。这意味着内置名字最先加载,局部名字最后加载。
查找顺序 (考试必考)
当访问一个变量时,Python会按照当前名称空间 -> 全局名称空间 -> 内置名称空间的顺序进行查找。如果当前处于局部作用域,则查找顺序为局部 -> 全局 -> 内置。这种机制确保了局部变量优先于全局和内置变量。
作用域
作用域指的是变量或函数起作用的范围。作用域关系在函数定义阶段就已经确定,而不是在调用阶段确定。
作用域关系在函数定义阶段就已经确定好了
不同的函数之间可能存在相同名字的变量,但它们属于不同的作用域,彼此互不影响。例如,全局变量和局部变量即使名字相同,也是两个独立的变量。
全局作用域
全局作用域适用于全局名称空间和内置名称空间。在全局作用域中,可以访问内置名字和全局名字,但通常不建议修改内置名字。
局部作用域
局部作用域仅适用于局部范围。在局部作用域中定义的变量,只能在当前函数内部访问,外部无法直接获取。
x =100
def f1():
x =1
print(x) # 定义阶段
f1()
global 局部修改全局 (了解,面试常用)
x =100
def f1():
global x
x =1
# print(x)
f1()
print(x)
nonlocal 把局部改成外部
xxxxxxxxxx9 1 def f1():2 x =13 def f2():4 nonlocal x 5 x =36 f2()7 print(x)8f1()93pythono
总结
以上所述是小编给大家介绍的python函数的对象、函数嵌套、名称空间和作用域,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持! 如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









