前面所看到的函数都是在全局范围内定义的,它们都是全局函数。Python 还支持在函数体内定义函数,这种被放在函数体内定义的函数称为局部函数。
在默认情况下,局部函数对外部是隐藏的,局部函数只能在其封闭(enclosing)函数内有效其封闭函数也可以返回局部函数,以便程序在其他作用域中使用局部函数。
# !/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/01
# @Author : Laopi
#定义函数,这个函数包含局部函数
def get_math_func(type,nn):
#定义一个计算平方的局部函数
def square(n): #①
return n*n
#定义一个计算立方的局部函数
def cube(n): #②
return n*n*n
#定义一个计算阶乘的局部函数
def factorial(n): #③
result = 1
for index in range(2,n+1):
result*=index
return result
#调用局部函数
if type =='square':
return square(nn)
elif type == 'cube':
return cube(nn)
else:
return factorial(nn)
print(get_math_func("square",4)) #16
print(get_math_func("cube",4)) #64
print(get_math_func("factorial",4)) #24
上面程序中第一行def get_math_func(type,nn)代码定义了get math func函数,接下来程序的①,②,③号代码定义了3个局部函数,而get_math_func()函数则根据参数选择调用不同的局部函数.
如果封闭函数没有返回局部函数,那么局部函数只能在封闭函数内部调用,如上面程序所示。另外,还会出现一种情况,如果封闭函数将局部函数返回,且程序使用变量保存了封闭函数的返回值,那么这些局部函数的作用域就会被扩大。因此程序完全可以自由地调用它们,就像它们都是全局函数一样。
局部函数内的变量也会遮蔽它所在函数内的局部变量。
def test():
#局部变量name
name = '软件测试划水老师傅'
def testinner():
#访问testinner函数所在test函数内的name局部变量
print(name)#软件测试划水老师傅
name = '测试老痞'
testinner()
test()
运行上面代码,会导致如下错误:
![]()
该错误是由局部变量遮蔽局部变量导致的,在testinner()函数中定义的name局部变量遮蔽了它所在test()函数内的name局部变量,因此导致程序中第6行代码报错。
为了声明 testinner()函数中的“name = '测试老痞'”赋值语句不是定义新的局部变量,只是访问它所在test()函数内的name局部变量,Python提供了nonlocal关键字,通过nonlocal语句即可声明访问赋值语句只是访问该函数所在函数内的局部变量。将上面程序改为如下形式。
def test():
#局部变量name
name = '软件测试划水老师傅'
def testinner():
nonlocal name
#访问testinner函数所在test函数内的name局部变量
print(name)#软件测试划水老师傅
name = '测试老痞'
testinner()
test()
增加上面程序中的nonlocal name代码之后,接下来testinner()函数中的name = '测试老痞'就不再是定义新的局部变量,而是访问它所在函数(test()函数)内的name局部变量。
nonlocal和前面介绍的global功能大致相似,区别只是global用于声明访问全局变量,而nonlocal用于声明访问当前函数所在函数内的局部变量。
1414

被折叠的 条评论
为什么被折叠?



