Ⅰ 函数的可变长参数
在形参中*与**的应用
* 站在实参的角度:可变长指的是参数的个数不固定,如果参数的个数不固定,那么形参对应着要有能够接受溢出实参的功能;在形参名前面加*:那么*会把多余的位置实参存成元组,然后赋值给其后的形参名:
* 号的形参应用,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
网友评论