可变长参数,函数的嵌套以及对象,名称空间及作用域

可变长的参数

可变长指的是参数的个数不固定,站在实参的角度,实参是用来为形参赋值的如果实参的个数不固定,那么必须要有对应的形参能够接收溢出的实参

1.在形参名前加*:*会把溢出的位置的实参存成元组,然后赋值给形参名。(是以元组的形式)

2.在形参名前加**:**会把溢出的关键字实参存成字典,然后赋值其后的形参名
   注意:位置实参要在关键字实参的前面

3.在实参前加*:*会把输入的值打散成位置实参(输入值通常为列表或是元组)

4.在实参前加**:**会把其后的值打散成关键字实参(输入值为字典)

def index(x,y,z,a,b,c):
     print('====>index',x,y,z,a,b,c,)
def wrapper(*args,**kwargs): #聚拢
     index(*args,**kwargs)    #打散,并通过位置与关键字参数一一赋值
wrapper(1,2,3,a=111,b=222,c=333) #此时的传参其实就是给index传参

函数对象

1.可以被赋值
如 f=foo 只是代表foo的内存地址绑定给f,此时可以通过f()调用函数

2.可以当做参数传给一个函数
即是把函数名当做参数,从外部函数导入,然后内部函数得到这个函数名就可以进行调用

3.可以当做一个函数的返回值
即是把函数名当做另一个函数的返回值返回到全局,然后可以在全局通过调用函数加()的形式调用那个返回值的函数名

4.可以当做容器类型的元素
在列表或是其他能存放多个值得数据类型存放该函数名,然后通过索引或是关键字取值,加上()就可以调用

函数的嵌套

1.函数的嵌套调用
def bar():
    print('from bar')
def foo():
    print('from foo')
    bar()
foo()
调用foo的函数,识别到bar()调用的语法,然后产生对函数bar的调用

2.函数嵌套的定义
def f1():
    print('from f1')
     def f2():
         print('from f2')
    f2()
f1()
f2函数定义在f1函数内部,则必须要在f1函数内部才可以调用到f2,因为在全局空间找不到f2的变量名,只能通过调用f1函数,才能在f1的局部名称空间找到f2的函数名从而产生调用

名称空间:就是存放名字的地方

1.内置名称空间:存放的是内置的名字,如print/input/len
              生命周期:解释器启动则产生,解释器关闭则销毁

2.全局名称空间:存放的是顶级的名字
              生命周期:python程序运行时则产生,python程序结束则销毁

3.局部名称空间:函数内的名字
              生命周期:调用函数时则产生,函数调用结束则销毁

名字查找的优先级

从当前位置往外查找,如果当前是在局部:局部名称空间——>全局名称空间——>内置名称空间

从当前位置往外查找,如果当前是在全局:全局名称空间——>内置名称空间

一层套一层,从局部到全局到内置的一个打印

全局范围/全局作用域:内置名称空间+全局名称空间

           特点:全局存活,全局有效

局部范围/局部作用域:局部名称空间

           特点:临时存活,局部有效

案例总结:

当外部变量是不可变类型,函数内的局部不能发生更改(除了调用内置函数)。

当外部变量是可变类型时,函数局部可以根据索引或是关键字去外部找到内存地址,或是外部将内存地址导入进来,发生更改。

global  直接映射全局变量进入局部空间,即是映射的位置在内多少层的函数,都是直接映射到全局变量

nonlocal 函数是内函数的变量名可以映射最近的外层函数的同样变量名,但是不能映射到全局,不然会报错。

你可能感兴趣的:(可变长参数,函数的嵌套以及对象,名称空间及作用域)