四、Python函数 之 6、局部函数

6、局部函数

1)理解局部函数

说明:函数体内定义的函数。默认情况下,局部函数对外隐藏,只能在其封闭函数内使用

2)定义、使用局部函数

def foo():
    print('foo函数')
    
    def bar():    # 局部函数
        print('bar函数')   
    
    bar()
    
foo()
# bar()    # 无法访问

foo函数
bar函数

3)封闭函数返回局部函数

def foo():
    print('foo函数')
    
    def bar():    # 局部函数
        print('bar函数')   
    
    return bar

# foo() 函数的返回值是 bar 函数,因此此处可用 r 变量来保存 bar 函数
r = foo()
print(r, type(r))

foo函数
<function foo..bar at 0x000000B8B7CDA840> <class ‘function’>

# r 此处为函数
r()

bar函数

foo()()

foo函数
bar函数

4)局部函数的变量遮蔽

def test():
    name = 'python'
    def info():
        print('info函数')
        # 报错,下面代码为 info 局部函数再次定义 name 局部变量
        # 此时 name 变量会遮蔽 test 函数内的 name 局部变量
        print('第一次name:', name)    
        name = 'java'
        print('第二次name:', name)
        
    info()
    print('第三次name:', name)    
test()

info函数
UnboundLocalError: local variable ‘name’ referenced before assignment

解决方式:

def test():
    name = 'python'
    def info():
        print('info函数')
        
        nonlocal name     # 声明nama变量不是新的局部变量,而是引用所在封闭函数的局部变量
        print('第一次name:', name)
        
        name = 'java'
        print('第二次name:', name)
        
    info()
    print('第三次name:', name)     # name 值改变

test()

info函数
第一次name: python
第二次name: java
第三次name: java

比较:

  • nonlocal 和 global 功能相似,都用于避免变量被遮蔽
  • global 用于声明访问全局变量,nonlcal 用户声明访问局部函数所在的封闭函数之内的局部变量

猜你喜欢

转载自blog.csdn.net/qq_36512295/article/details/94209513