python中,函数是允许嵌套的。
创建函数
不想让函数执行任何内容 可以使用pass语句。但此函数可以被调用,只是没有内容去执行而已。
函数的作用域 函数的被访问到的范围
函数 名称空间
每个文件模块都是一个全局作用域。
全局变量 : 位于函数的外部 或者函数内部的 global
本地变量: 函数内部的变量
global x
变量名解析:LEGB原则
local(function) --> Enclosing function locals --> Global(module) —> built-in(python)
作用域越小,优先级越高。
## python 闭包(工厂函数):
在python的嵌套函数中,定义在外层函数中但是却由内层函数所引用的变量在外层函数返回时,如果说外层函数直接返回的内层函数作为返回结果,那么我们再次调用内层函数时,可以仍然使用内层函数中所引用的外层函数中的变量,它实现了记忆的效果。这种特殊的方式在python中叫做闭包。
python 函数的参数
def functionName(arg1,arg2,…)
那么,考虑一下,如果我们在函数中修改传递过去的参数值,那么实际上它会不会改变呢?
对于不可变对象如下图中的m和n的值不会发生变化。
对于可变对象,如列表,则不一样,传递的参数相当于潜复制,在原处修改该变量。下图所示:
但是如果我们不想改变原来定义变量,可以传递单个的不可便元素。
### 参数匹配模型:
#位置参数,从左向右精确匹配。
#关键字参数指定传递的值,按关键字名称匹配:
#混用位置参数和关键字参数
会用上面两种方式(位置参数和关键字参数)时,位置参数只能是在关键字参数的左侧。(所有的位置参数,所有的关键字参数)
默认值参数:会有默认值和无默认值的参数时,无默认值参数需放在默认值参数的左边
可变参数:用于收集任意多基于位置或关键字的参数。
调用函数时候使用可变参数要求:
1.定义函数时使用 *参数 : 收集位置参数
2.定义函数时使用 **参数:收集关键字参数
Python2中位置参数只能位于可变参数的左侧。
默认值参数与可变参数混合使用:
*参数 与 **参数混合使用:
位置参数,默认值参数, * 参数 **参数的混合使用:
注意默认值参数不能放在**参数的后面 ,但是可以放在*参数的后面。
可变参数解包(参数分解):调用函数时候,使用*开头的参数,可用于将参数集合打散,从而传递任意多基于位置或关键字的参数。
回顾:变量的分解赋值
函数的分解参数(可变参数解包)如图:
定义是为了分解,调用是为了整合.
如果不使用可变参数,则必须使用使得某个集合或列表中的元素个数与函数参数的个数一致。如下图:
匿名函数 lambda
lambda args:expression
lambda起到了一个函数速写的作用
函数基础小结
函数:
1:名称
2:python闭包(工厂函数) :
3:def funcName(arg1,arg2,arg3,…)
4:参数传递形式:
位置参数: 从左向右精准匹配
关键字参数:案关键字名称匹配
混合上面两种方式时候:左边是所有位置参数,右边是所有关键字参数。
定义函数时候使用默认参数:有默认值的参数
混用有默认值和无默认值的参数时候:无默认值参数放在左边。
调用函数时候使用可变参数要求:
定义函数时候使用* 参数:收集位置参数
定义函数时候使用* *参数: 收集关键字参数
完结
下一篇 python函数式编程