zoukankan      html  css  js  c++  java
  • python-函数之命名空间作用域

    第一类对象的概念:
    函数名可以赋值
    可以作为一个数据结构的元素
    可以作为一个函数的参数
    可以作为一个函数的返回值
    def func():
        print('in func')
        return 10
    def func2():
        print('in func2')
        return 20
    print(func)
    f = func
    print(f)
    t = func
    print(t)
    print(t())
    print(f())
    print(func())
    l = [func,func2]
    for i in l:
        i()
    
    l = [1,2,3]
    t = l
    print(t)
    
    def func():
        print('in func')
        return 10
    
    def func2(arg):
        arg()
        return arg
    
    f = func2(func)
    f()
    函数的名字
    namespace 命名空间,名称空间
    局部命名空间:每一个函数都拥有自己的命名空间
    全局命名空间:写在函数外面的变量名
    内置命名空间:python解释器启动之后就可以使用的名字
    python的解释器要运行起来
    加载顺序:
    先所有内置命名空间中的名字-->然后按照顺序加载全局命名空间中的名字
    局部命名空间中的名字:在调用函数的时候产生,并且随着调用结束而消失
    函数的嵌套定义:
    def func():
    def qqxing():
    print('qqxing')
    qqxing()

    func()
    例题
    def func2():
        print('in func2 now')
    
    def func():
        func2()
        n = 20
        print(n)
    
    func()
    
    例题:
    def func2():
        print('in func2 now')
        print('多写一行')
        if True:
            print('又多写了一行')
        return 'func2的返回值'
    
    def func():
        ret = func2()
        print(ret)
        n = 20
        print(n)
    
    func()
    函数的嵌套调用
    
    
    作用域:一个名字可以使用的区域
    全局作用域:内置名字空间和全局名字空间中的名字都属于全局作用域
    局部作用域:局部名字空间中的名字属于局部作用域
    局部作用域可以使用全局作用域中的变量
    而全局作用域不能使用局部作用域中的变量
    局部作用域中还可以嵌套更小的局部作用域
    作用域链:小范围作用域可以使用大范围的变量,但作用域链是单向的,不能反向应用
    
    
    def func():
        a = 10
        b = 20
        print(locals())     #保存了当前作用域中变量
        print(globals())
    # n = 10
    # m = 22
    # print(globals())    #保存了在全局作用域中的名字和值
    func()
    globals()  保存了在全局作用域中的名字和值
    locals() 中的内容会根据执行的位置来决定作用域中的内容
    如果在全局执行
    globals()和locals打印的结果会是一致的
    注意:
    小范围可以使用大范围的,但不能修改
    如果想要修改,使用global关键字 --尽量避免
    如果想要修改最近拥有该变量的外层函数:使用nonlocal ---不影响全局
    
    
    n = 1
    def fun():
        global n
        n = n+1
        return n
    
    fun()
    print(n)
    如果想要修改,使用global关键字 --尽量避免
    例题1:
    n = 0
    def func():
        n = 1
        def func2():
            nonlocal n
            n+=1
        func2()
        print(n)
    
    func()
    
    例题2:
    n = 0
    def func():
        n = 1
        def func2():
            n = 2
            def func3():
                nonlocal n
                n+= 1
            func3()
            print(n)
        func2()
        print(n)
    
    func()
    print(n)
    如果想要修改最近拥有该变量的外层函数:使用nonlocal ---不影响全局
    
    
    总结:
    函数的嵌套调用和函数的嵌套定义
    命名空间:三种:内置命名空间,全局命名空间和局部命名空间
    作用域:两种:全局和局部
    作用域链:名字的使用是从小范围到大范围的就近事件
    globals()和locals()方法
     
     
     
  • 相关阅读:
    二维动规思想,j 具有明显枚举特征
    二分法题目总结
    最大(小)值最小(大)化 (二分法变形)
    C/ C++ 输入输出流
    正序扫描字符串问题
    React(基础一)_react中的三大属性
    找位置
    STL vector
    STL stack
    打印日期
  • 原文地址:https://www.cnblogs.com/dwenwen/p/7783699.html
Copyright © 2011-2022 走看看