函数名称空间与作用域

1.函数对象

函数名指向的值可以被当作参数进行传递。

  1.函数名可以被传递,当函数被打印出来的结果是函数名的内存地址,可以通过加括号()来调用这个函数.

  2.函数名可以当做参数被传递给其他函数,在作参数被传递的时候,一定要注意函数后面不能有括号

  3.函数名可以被当做函数的返回值

  4.函数名可以被当做容器类型的参数。

2.函数的嵌套调用

  在函数的内部调用其他函数,函数要想被调用,必须要变量名加冒号才可以访问到这个函数代码。

def index():     #第一步
    func()        #第四步
    print('index')   #第五步
def func():        #第二步
     print('func')  #第六步
index()            #第三步  
补充:同一级别的代码没有大小之分,按照从上往下的操作依次进行。

  通过镶嵌调用,可以将复杂的逻辑简单化。在整体的程序中只要定义好了某个函数,下面的代码中如果想使用这个功能,可以直接调用这个函数,能节省代码。

函数内定义函数的应用场景:

  写一个函数,该函数用户可以通过传参的不同控制函数执行不同的功能。

3.名称空间

1.名称空间是指存放名字的地方,可分为内置名称空间,全局名称空间和局部名称空间。

  (1).内置名称空间指的python解释器就提前给定义好的名字,如len(),max(),min()等。

  (2).全局名称空间指文件级别的代码,无论if,for,while 嵌套多少层,它们内部所创建的名字都是全局名称空间的。

  (3).局部名称空间指函数体内创建的名字都属于局部名称空间,如username()。

  一般存放的是变量名与变量值的内存地址所绑定关系的地方。想要访问到一个变量的值,必须要先去名称空间中拿到对应的名字,然后才能访问到变量的值。

2.名称空间的加载顺序

  (1)内置名称空间:只要python解释器启动就会立即创建,当python解释器关闭的时候,内置名称空间就会自动销毁。

  (2).全局名称空间:当右键点击py文件运行就会自动创建,py文件程序运行结束,全局名称空间就会自动销毁。

  (3).局部名称空间:函数被调用的时候自动创建  函数指向结束立即销毁(动态创建动态销毁)

3.名字的查找顺序

  局部名称空间-------->全局名称空间---------->内置名称空间

  需要注意的是:在全局无法查看局部的,在局部可以查看全局的,如下示例

max=1
def f1():
    max=2
    def f2():
        max=3    #  f2()函数中包括max=3,跟print处于同一级别
        print(max)  
    f2()
f1()
print(max)
>>>:3
# 补充:函数在定义阶段查找名字的顺序就已经固定了,不会因为函数的调用位置变化而改变。

4.作用域

作用域分为两种,一种是全局作用域,一种是局部作用域。

  全局作用域只能在全局起作用。内置名称空间和全局名称空间属于全局有效。

  局部作用域只能在局部起作用。局部名称空间属于局部有效(动态创建,动态销毁)。

#global  在局部修改全局的不可变类型,想修改多个可以用逗号隔开
# x = []    因为列表是可变类型
x = 1    #不可变类型
def func()
    global x    #修改全局变量,而不是创建局部名称空间
    x = 666
func()

#nonlocal   局部修改局部
def func():
    x = 1
    def index():
        nonlocal x   #想修改多个可以用逗号隔开
        x = 2
     index()
     print(x)
func()    
原文地址:https://www.cnblogs.com/blue-tea/p/11165373.html