美文网首页
day13 函数嵌套 定义 作用域 名称空间 * 与 ** 应用

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

作者: 荭鲤鱼与緑鲤鱼与驴 | 来源:发表于2020-07-20 21:29 被阅读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

    相关文章

      网友评论

          本文标题:day13 函数嵌套 定义 作用域 名称空间 * 与 ** 应用

          本文链接:https://www.haomeiwen.com/subject/bfwykktx.html