day13 函数嵌套 定义 作用域 名称空间 * 与 ** 应用

2020-07-20  本文已影响0人  荭鲤鱼与緑鲤鱼与驴

Ⅰ  函数的可变长参数

    在形参中*与**的应用

    *  站在实参的角度:可变长指的是参数的个数不固定,如果参数的个数不固定,那么形参对应着要有能够接受溢出实参的功能;在形参名前面加*:那么*会把多余的位置实参存成元组,然后赋值给其后的形参名:

* 号的形参应用,y接收了4个参数

同时:func(1)  可以只传给x一个值,也就是说*y可以不被传值,但是x必须被传值

    **  在形参名前加** :  会把多余的关键字实参存成字典,然后赋值给气候的形参名:

这里需要注意 ** 只能接受关键字实参;或者不传值,那么输出的就是空字典

    在实参中用*与**

    在实参前加*:会把其后的值打散成位置实参(所有可以被for循环的都可以在前面加*):

需要注意:形参和实参内的元素需要对应,不能多也不能少

    在实参后面加**:会把其后的值打散成关键字实参(只能是字典(就目前水平)):

可以看出字典内的顺序和形参的顺序并不对应,单是值都是相同的,这就是昨天讲到的关键字实参传值

    形参与实参中混用*与**

    python中*后面默认跟args变量名,**后面跟kwargs:

总结来说: * 搭配形参就是压缩操作,  * 搭配实参就是解压操作

        命名关键字形参:在def func(x,y=222,*args,n=777,m,**kwargs):  需要注意的是默认形参只有一个y=222; 在*与**之间的n=777和m都属于关键字形参(不再属于默认形参和位置形参),只能使用关键字的方式进行传值:

其中n可以不被传值,因为形参定义有值,m必须使用关键传值,否则会报错

Ⅱ  函数对象

    函数对象指的是函数可以被当成变量去使用:

函数foo就等于foo的内存地址,可以直接打印foo函数就得到了他的内存地址

    函数可以被当成变量赋值给变量名:

可以将函数foo赋值给变量名f ,我们打印 f 会得到foo的内存地址

    函数可以被当作参数传给另一个函数:

我们将函数foo当作值传给函数res,然后我们打印res收到的值,得到是发foo的内存地址

    还可以当成一个函数的返回值:

我们将foo作为值传入res,然后res返回一个值到res(foo) ,我们将这个值赋值给变量名 a;a加() 运行了foo,证明了foo是和a同一个值

    函数可以当成容器类型的元素:

Ⅲ  函数的嵌套

    函数的嵌套调用:

调用foo;打印了foo的结果,然后调用func,再打印func

    函数的嵌套定义:

定义在函数内的函数特点:正常情况下只能在函数体内调用

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

    内置名称空间

    存放的是内置的名字如:print\input\len;生命周期:解释器启动则产生,解释器关闭则销毁

    全局名称空间

    存放的是顶级的名字(顶级的代码);生命周期python程序运行时则产生,python程序结束则销毁:

x=10在全局空间;x=111属于局部空间,所以打印x时输出的是局部空间的111

    局部名称空间

    函数内的名字;生命周期:调用函数时则产生,函数调用结束则销毁:

报错:在x赋值之前引用x(同在局部空间),如果将局部空间的赋值去掉,那么会正长打印全局变量10

名称的查找优先级

    从当前位置往外查找,如果当前在局部:局部==>全局==>内置

    从当前位置往外查找,如果当前在全局:全局==>内置

名称空间可以理解为一层套一层的关系,问题是其那套关系是在函数定义阶段成成的还是在调用阶段生成的????

    结论:名称空间的嵌套关系是函数定义阶段(及扫描语法时),就固定死的,与函数的调用位置无关

Ⅴ  作用域

    全局范围\全局作用域:内置名称空间+全局名称空间;特点:全局存活,全局有效

    局部范围\局部作用域:局部名称空间;特点:临时存活,局部有效

Ⅵ  了解知识  (global 和 nonlocal)

    global 作用:在局部变量可以修改全局的变量,需要事前声明

    nonlocal 作用:声明变量名是来自于外层函数(不包含全局空间)

end
上一篇下一篇

猜你喜欢

热点阅读