Python嵌套函数、作用域查找机制与偏函数详解
本文深入解析Python中嵌套函数的定义与调用限制,详细阐述LEGB(Local-Enclosing-Global-Built-in)作用域查找规则及代码块级变量可见性。同时介绍偏函数(partial)如何通过预设参数生成新函数,优化代码复用。
本文通过具体实例,详细解析Python中嵌套函数的定义与调用方式、变量作用域的查找机制(LEGB规则),以及偏函数(partial)的应用技巧,供开发者参考学习。
内嵌函数(即嵌套函数):
- 定义方式:在现有函数的内部再次定义一个新的函数。
- 调用限制:若内嵌函数在父函数体内未被显式调用,则无法从外部直接访问或调用该内嵌函数。
def my_pr1():
print("第一层打印")
def my_pr2():
print("第二层打印")
my_pr2()#如果在函数体内不调用内嵌的函数,那么无法在外部调用
my_pr1()
作用域:
变量查找遵循 LEGB 规则,顺序为:local(局部作用域) --> enclosing(外层函数作用域) --> global(全局作用域) --> build-in(内建作用域)。
代码块级别的作用域特性:Python 不划分代码块(如 if、for)的独立作用域。
- 变量可见性:定义在代码块内的变量,在代码块外部依然可以被访问和调用。
if 1>0:
name="automan"
print(name)
上述代码运行结果:
automan
函数基本的作用域:
- 局部作用域:
- 在函数内部定义的变量属于局部变量,在函数外部无法直接访问。
a=50
def change(x):
x=6
change(a)
print("after change:",a)
上述代码运行结果:
after change: 50
def func3():
superman="automan"
print(superman)
运行结果:
NameError: name 'superman' is not defined
- 内嵌关系的函数的作用域:
- 对于存在内嵌关系的函数,其作用域查找依然严格遵循 LEGB 规则:local(局部作用域) --> enclosing(函数范围作用域)--> global(全局作用域)---> build-in(内建对象作用域)。
- 若当前函数内部存在目标变量,则优先使用当前函数内的变量值;
- 若当前函数内不存在,则向上层(父)函数中查找目标变量。若父函数中存在该变量,则使用父函数的变量值;【若父函数仍有父函数,查找过程会持续向上层传递】
- 若一直向上查找直至离开最外层函数体仍未找到,则在全局范围内搜索该变量。
- 若全局范围内仍未找到,则进一步在内建对象作用域中查找。
- 若以上所有作用域均未找到,则报错并抛出异常。
def func4():
superman="automan"
def haha():
print(superman)
haha()
func4()
运行结果:
automan
- 非内嵌关系的函数的作用域:
- 对于非内嵌关系的函数,其作用域查找同样遵循 LEGB 规则:local(局部作用域) --> enclosing(函数范围作用域)--> global(全局作用域)---> build-in(内建对象作用域)。
- 但由于这些函数之间不存在父子嵌套关系,当在当前函数作用域内找不到目标变量时,会直接跳过中间层级,前往全局作用域进行查找。
aotuman='金甲战士'
def f5():
print(aotuman)
def f4():
aotuman='max'
f5()
f4()
运行结果:
金甲战士
偏函数:
- 功能:通过预设某个函数的部分参数,返回一个具有部分固定参数配置的新函数。
- 优势:有效避免了在实际调用时重复输入相同的参数值。
import functools
print_t=functools.partial(print,end='\t')
print_t(1)
print_t(1)
print_t(1)
上述代码结果:
1 1 1
关于Python相关内容感兴趣的读者可查看本站专题:《Python函数使用技巧总结》、《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》
希望本文所述的嵌套函数、作用域及偏函数知识对大家学习Python程序设计有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









