函数的嵌套和作用域链

1:

# 函数的嵌套调用
def max(a,b):
    return a if a>b else b
def Max(x,y,z):
    c = max(x,y)
    return max(c,z)
print(Max(5,2,0))

def max(a,b):
    return a if a>b else b
def Max(x,y,z):
    c = max(x,y)
    return c if c>z else z
print(Max(5,2,0))

 2:

#函数的嵌套定义
#内部函数可以使用外部函数的变量,但外不可使内
def outer():           # 1 定义outer,把outer放到命名空间
    def inner():       # 3 定义inner,若没有调用inner,则无法把inner放到命名空间,也就无法执行
        print('$$$$')  # 5 
    inner()            # 4 调用inner
outer()                # 2 调用outer


def outer():
    a = 1
    def inner():
        print(a)
        print('$$')
    inner()
outer()


def outer():
    Mia = 'beauty'
    def inner1():
        print('Mia')
        print('$$')
        Shaw = 'cutie'
        def inner2():
            print(Shaw)
            print('$$$$')
        inner2()
    inner1()
outer()


def outer():
    Mia = 'beauty'
    def inner1():
        print('Mia')
        print('$$')
        Shaw = 'cutie'
        def inner2():
            print(Shaw)
            print('$$$$')
        inner2()
    inner1()
outer()

 3:

a = 1
def outer():
    a = 1
    def inner1():
        b = 2
        print(a)
        print('$$')
        def inner2():
            global a  # 声明了一个全局变量,只是使全局空间的a可修改了,而局部空间的a不变
            #nonlocal a # 声明了一个上面第一个(从此位置从下往上找)局部变量
            a += 1    # 不可变数据类型的修改
            print('$$$$')
        inner2()
    inner1()
outer()
print('全局的a:',a)  # 对应global a
#print('全局的a:',a)  # 对应nonlocal a
# 关于 nonlocal
def outer():
    a = 1
    def inner1():
        a = 2
        def inner2():
            nonlocal a
            a += 1
            print(a)
        inner2()
    inner1()
outer()
print(a)

# nonlocal 只能用于局部变量 找上层中离当前函数最近一层的局部变量
# 声明了nonlocal的内部函数的变量修改会影响到 离当前函数最近一层的局部变量
# 对全局无效
# 对局部 也只是对 最近的 一层 有影响

4:函数是第一类对象,它符合函数的以下三个用法:函数名可以赋值,可以作为函数的参数,可以作为函数的返回值。

def func():  # 函数名就是内存地址
    print('love')
func()
func1 = func  # 函数名可以赋值
func1()

lis = [func,func1]  # 函数名可以作为容器类型(可变数据类型:集合,列表和字典)的元素
print(lis)    # 打印出它们的内存地址,是一样的
for i in lis:
    i()

def func():  # 函数名就是内存地址
    print('love')
def func2(f):
    f()
func2(func)  # 函数名可以作为函数的参数

def func():  # 函数名就是内存地址
    print('love')
def func2(f):
    f()
    return f    # 函数名可以作为函数的返回值
lalaland = func2(func)  # 有return返回就得有接
print(lalaland) 

猜你喜欢

转载自www.cnblogs.com/passengerlee/p/10350216.html