python函数
形参:定义中的参数列表成为形式参数,只是一种符号表达
实参:调用时写的参数是实际参数,是实实在在传入的值
可变位置参数:在参数前加一个星号*
可变关键字参数:在参数前加两个星号**
混合使用参数时,普通参数在前 可变参数在后,可变位置参数在可变关键字参数前面
参数解构
非字典类型使用*解构成位置参数
字典类型使用**解构成关键字参数
提取的元素数目要和参数的要求匹配,也要和参数的类型匹配
作用域
全局作用域:整个程序运行环境中都可见
局部作用域:做函数,类等内部可见
闭包
自由变量:在嵌套函数中,定义在外层函数作用域的局部变量
闭包:在嵌套函数中,内层函数用到外层函数的自由变量
nonlocal
将变量标记为不在本地作用域定义,而在上层的局部作用域中定义,但不能在全局作用域定义
变量名解析原则LEGB
local,本地作用域。函数调用时创建调用结束消亡
Enclosing,嵌套函数的外层函数的命名空间
Global,全局作用域。解释器退出时消亡
Build-in,内置模块的命名空间。生命周期从解释器启动到解释器退出
递归函数
函数直接或间接调用本身就是递归
递归需要有边界条件,递归前进段,递归返回段
递归一定要有边界条件。当边界条件不满足时递归前进,当边界条件满足时,递归返回
递归函数实现斐波那契数列:
def fib(x, a=0, b=1):
for i in range(x):
a, b = b, a + b
yield a
for j in fib(10):
print(j)
匿名函数
匿名函数,即没有名字的函数
使用lambda关键字定义匿名函数
格式:lambda 参数列表:表达式;例:(lambda x:x**2)(4)
labda表达式只能写在一行上,称为单行函数
用途:
在高阶函数传参时,使用lambda表达式,往往能简化代码
生成器 generator
生成器指生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象
生成器函数
函数体中包含yield语句的函数,返回生成器对象
生成器对象,时一个可迭代对象
生成器对象时延迟计时,惰性求值的
包含yield语句的生成器函数生成生成器对象时,生成器函数的函数体不会立即执行
next(generator)会从函数的当前位置向后执行到之后碰到第一个yield语句,会弹出值,并暂停函数执行
再次调用next函数,和上一条一样的处理过程
没有多余的yield语句被执行,继续调用next函数,会抛出StopIteration异常