码迷,mamicode.com
首页 > 其他好文 > 详细

函数的嵌套和作用域链

时间:2019-02-03 14:20:52      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:赋值   nonlocal   类型   不可变   外部   函数名   无效   lov   打印   

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) 

 

函数的嵌套和作用域链

标签:赋值   nonlocal   类型   不可变   外部   函数名   无效   lov   打印   

原文地址:https://www.cnblogs.com/passengerlee/p/10350216.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!