函数的嵌套,名称空间,以及做用域

函数的嵌套,名称空间,以及做用域

一、调用函数的三种形式

def func():
    print('from func')
func()#第一种函数名加括号


def max_2(x,y):
    if x > y:
        return x
    else:
        return y
res = max_2(10,3)
print(res)#表达式去调用


def max_2(x,y):
    if x > y:
        return x
    else:
        return y
res = max_2(10,max(2,3))
print(res)#函数做为参数的形式

二、函数的嵌套

def func1():
    print('from func1')

def func2():
    func1()
    print('from func2')

func2()
>>>from func1
from func2

三、函数的名称空间

  • 什么是名称空间?python

    名称空间就是用来存放名字的空间。函数

  • 名称空间的做用code

    若是你想访问一个变量值,必须先访问对应的名称空间,拿到对应的内存地址的绑定关系blog

  • 名称空间的分类生命周期

    一、内置名称空间:内存

    就是python解释器一启动就可使用的名字,好比print,len,max,input等等咱们以前也并无定义过,能够直接拿来使用的名字,这些名字就存储在内置名称空间中作用域

    二、全局的名称空间:input

    存放文件级别的名字,就是全局名称空间,是在程序从上到下被执行的过程当中依次加载进内存的,放置了咱们设置了全部变量名和函数名,if,while,for,内部定义的名字执行以后都存放在全局名称空间class

    三、局部名称空间变量

    就是在函数内部定义的全部名字,注意的是当调用函数的时候,才会产生这个名称空间,随着函数执行的结束,命名空间就消失

  • 生命周期:

    一、内置名称空间

    在python解释器启动的时候生效,关闭python解释器的时候失效

    二、全局名称空间

    当你启动这个py 文件的时候生效,当前页面代码执行结束以后失效

    三、局部名称空间

    当你调用函数的时候生效,函数一旦调用完毕就失效

  • 名称空间的使用范围

    一、在局部能够全局名称,内置名称

    x = 1
    def func():
        print(x)#使用了全局名称x,以及使用了内置名称print
    
    func()
    >>>1

    二、在全局可使用内置名称空间,但不可以使用局部名称空间

    x = 1
    def func():
        a = 1
        print(x)#使用了全局名称x,以及使用了内置名称print
    
    func()
    print(a)#NameError: name 'a' is not defined
            #此时a已经消失了

    三、在内置不可以使用局部和全局的名称

    x = 1
    def func():
        x = 2
        print(x)#使用了局部名称x
        def func1():
            x = 3#我本身有就用我本身的,没有就去找上一级,若是上一级都没去找内置,若是内置都没有那就保存
            print(x)
        func1()
    
    func()
    >>>2
    >>>3
    
    x = 1
    def func():
        x = 2
        print(x)#使用了局部名称x
        def func1():
            print(x)#我本身没有就用上一级的x=2
        func1()
    
    func()
    >>>2
    >>>2
    
    x = 1
    def func():
        print(x)
        def func1():
            print(x)#我本身没有就用上一级的,上一级也没有就再找上一级
        func1()
    
    func()
    >>>1
    >>>1
    x = 1
    
    def index(arg = x):#默认参数,此时已经将x=1赋值给arg
        print(x)
        print(arg)
    
    x = 2
    index()
    >>>2
    >>>1

四、做用域的分类

一、全局做用域

全局能够调用的名字就存在于全局做用域

内置名称空间+全局名称空间

二、局部做用域

局部能够调用的名字就存放于局部做用域

局部名称空间

对于不可变类型,在局部能够查看全局做用域中的变量。可是不能直接修改,

若是想要修改,须要在程序中添加一个global变量,那么这个变量在局部的全部操做将对全局的变量有效

x = 1
def func():
    global x#声明此时的x就是全局变量
    x =2
    print(x)


func()
print(x)
>>>2
>>>2

#在局部修改外部函数的变量

def func():
    x = 1
    def func1():
        nonlocal x
        x = 3

    func1()
    print(x)#经过nonlocal就能够修改离他当前最近的一个外层变量的值,此时不会打印x=1,会打印x=3

func()
>>>3

加油吧,亚峰gogogo

相关文章
相关标签/搜索