zoukankan      html  css  js  c++  java
  • python全栈闯关--10-2、函数的嵌套和作用域

    1、全局作用域函数嵌套

    def three_max(a, b, c):
        t = two_max(a, b)  # 函数嵌套调用two_max
        return t if t > c else c
    def two_max(a, b):
        return a if a > b else b
    print(three_max(1, 2, 3))

    程序执行,按照从下往下的顺序,把变量、函数名加入到命名空间,如果还未加入到命名空间,就调用了函数,将会报错。

    如上程序,如果把three_max的调用,交换到two_max的前面,将会报错:NameError: name 'two_max' is not defined

    def three_max(a, b, c):
        t = two_max(a, b)  # 函数嵌套调用two_max
        return t if t > c else c
    print(three_max(1, 2, 3))  # NameError: name 'two_max' is not defined
    def two_max(a, b):
        return a if a > b else b

    2、内部函数使用外部函数

    a = 1
    def outer():
        a = 1
        def inner():
            a = 2
            def inner2():
                a = 3
                print("inner2:", a)  # 3
            inner2()
            print("inner:", a)  # 2
        inner()
        print("outer:", a)  # 1
    outer()
    print(a)

    嵌套定义时,每个局部都有自己的命名空间,互相不干扰

    子函数定义了和父函数相同的变量,其值都为独立的,修改不影响父函数

     global

    a = 1
    def outer():
        a = 1
        def inner():
            a = 2
            def inner2():
                global a  # 修改的是全局的变量数据
                a = 3
                print("inner2:", a)  # 3
            inner2()
            print("inner:", a)  # 2
        inner()
        print("outer:", a)  # 1
    outer()
    print(a) # 3

    global定义的变量,是全局命名空间的变量

    不影响局部的变量

    nonlocal

    a = 1
    def outer():
        # nonlocal a  # 只能对局部作用域变量有效,在最后一个局部报错SyntaxError: no binding for nonlocal 'a' found
        a = 1
        def inner():
            # nonlocal a
            a = 2
            def inner2():
                nonlocal a
                a = 3
                print("inner2:",a)  # 3
            inner2()
            print("inner:", a)  # 3 nonlocal找到上一层的变量进行了更改
        inner()
        print("outer:", a)  # 1
    outer()
    print(a)  # 定义nonlocal后,全局变量不变依然为1

    nonlocal寻找离当前函数最近的一层局部变量

    声明了nonlocal的局部变量的改动,会影响最近一层的函数的局部变量

    3、函数名总结

    1、函数名就是函数的内存地址,可以直接赋值;

    2、函数名可以作为容器的元素;

    3、函数名可以作为参数;

    4、函数名可以作为返回值;

    def func():
        print(123)
    
    # 函数名就是函数地址,可以直接赋值
    f1 = func
    f1()
    
    # 函数名可以做为容器的元素
    l = [func, f1]
    for i in l:
        i()
    
    # 函数名可以作为参数
    # 函数名可以作为返回值
    
    def func2(f):
        f()
        return f  # 函数名作为返回值
    
    f2 = func2(func)  # 函数名作为参数
    f2()
  • 相关阅读:
    android判断服务是否是运行状态
    Android调用OCR识别图像中的文字
    Java生成各种条形码
    android 实现摇一摇功能
    【读书笔记】Html5游戏开发
    SpeechLib 语音播报
    罗盘
    注释文档在线编辑及生成
    系统空闲时间判断&命名验证
    Asp.Net MVC中使用ACE模板之Jqgrid
  • 原文地址:https://www.cnblogs.com/zxw-xxcsl/p/11646906.html
Copyright © 2011-2022 走看看