总结
1.什么是返回值
-
返回值指的是函数返回的结果;
-
return执行完毕后面的语句将不会再执行;
-
如果一个函数里面有两个return,前面return执行完毕,后面的return也不会执行;
2.函数的隐式返回和显示返回
-
Python函数都有返回值,如果有return语句,是显式返回;
-
如果没有return语句,默认返回None,是隐式返回;
3.函数多值返回
-
如果返回多个值通过逗号分开,会把值进行压缩,封装成一个元组;
-
如果返回一个列表,得到的就是一个列表;
4.什么是嵌套函数
-
嵌套函数的内部函数只能在包含它的函数的直接父级调用,也就是只能在包含它的外部函数中调用;
-
嵌套函数层数不宜过深,一般3层以内即可,太深不够直观,容易造成代码混乱;
5.函数作用域
-
作用域指的是,一个标识符的作用范围就是这个标识符的作用域;
-
在函数里面定义的变量(即局部作用域)只能在函数体内部被访问,函数外部不能访问;
-
在函数外部定义的变量(即全局作用域)能在函数体外部被访问,也能在函数体内部被访问;
6.函数的闭包
-
闭包:内部函数引用了外部函数的变量,这就是闭包的定义;
-
如果函数体想访问变量,只能在变量定义之后才能访问;
-
如果要访问函数体内部的函数,可以先把内部函数的函数名作为外部函数的返回值,把外部函数的引用赋值给变量,再调用变量;
7.关键字
-
global关键字:可以指定变量为全局变量,但是global关键字会污染全局变量,也就是会覆盖之前全局变量的值,所以最好慎用;
-
nonlocal关键字:可以申明内部函数的变量引用的是外部函数变量的值(作用域在外部函数),不是全局作用域的值,因此不会污染全局作用域;
8.函数默认值的作用域
-
同一个函数的生命周期相同,函数的默认值会绑定在函数的整个生命周期上,不会因为函数内部对默认值的操作而发生改变;
-
可以使用浅拷贝copy(简写[:])来清空默认值,那每次调用函数,默认值都为初始值;
-
也可以通过参数值判断来给默认值重新赋值,那每次调用函数,默认值都为初始值;
9.函数销毁
- 可以通过 del 函数名 的方式来删除函数,再调用函数时,就会报错不存在;
课后补充:
问题:闭包的具体使用?
答:闭包的理解就是在函数a里面再嵌套一个函数b等,那么函数b里面都可以引用函数a的变量,然后函数a返回值是函数b,这样就形成了闭包,这样就相当于说,这个函数b就是一个封闭的函数,只能在a函数中使用。
闭包的具体使用最好的例子就是后面的装饰器(21节:https://www.9xkd.com/user/plan-view.html?id=1603899338)
问题:嵌套函数的作用?
嵌套函数很方便,比如:一个函数里面有很多相同代码,但是其他地方不需要用,这个时候不需要定义公用函数,可以直接在这个地方定义一个内部函数,方便仅在当前这个函数里面公用;
子函数里面可以直接引用上层函数的变量,也可以直接引用全局变量;
嵌套还有一个好处就是,在各个函数里面定义的变量,另外的函数互相不会影响(嵌套一般也不要嵌套很多层,最好不超过3层);
问题:关于global关键字具体怎么使用呢?
答:global关键字的作用就是把局部变量修改为全局变量,它会覆盖原有的全局变量,所以我们要慎用global,能不用就不用,避免造成全局污染;
如下举个例子讲解一下,如下图所示:
fun2中变量c现在是局部变量,我们如果通过global声明c之后,就全局都可以调用c了,也就相当于c变成了全局变量;
fun3中,如果一个函数已经声明了一个局部变量c,并且赋值了999。然后在这个函数里面,再使用global 声明一个全局变量c,那么后面的子级函数和外部引用c都是引用的全局变量c的值;
但是如果我们在同级函数中引用c的话,引用的依旧是局部变量c的值。
是不是感觉有点乱,所以,我们为了避免混乱,建议不要声明了局部变量后,又吧它改为全局变量的形式。也就是说在同一级中,不要声明了局部变量c后,然后又声明全局变量c,如下,这样是错的:
问题:nonlocal关键字的具体使用?
答:如下图所示:nonlocal关键字用来标识变量所在的命名空间,用在嵌套函数中,表示外层;
在外层的变量a为全局变量,不属于嵌套函数,所以,用不能在函数外面使用nonlocal a,这样会报错(总之nonlocal不能引用全局变量);
在fun1中b属于嵌套函数中的外层函数的变量,所以,在fun2中使用nonlocal修改b是没有问题的;
nonlocal是可以隔层的,不一定需要是直接的父层,例如:我在fun1中定义的b,在fun3中的nonlocal也可以声明修改b,当然fun2中也可以修改,并且如果是在fun3中修改b,那使用时就会以fun2中的b的执行结果为初始值(也就是初始值不在是fun1中b的值了);
nonlocal的作用就是在嵌套函数中使用,对上级函数的变量进行申明修改;