函数
- 一组语句通过一个名字(函数名)封装起来,想要执行的时候只需要调用其函数名即可
特性
- 减少重复代码
- 程序可扩展
- 程序容易维护
参数
形式参数
- 函数被调用时分配内存,调用结束后释放
- 形参只在函数内部有效
实际参数
- 常量、变量、表达式、函数等对象
- 默认参数
关键参数
- 指定参数名传参数,关键参数放在位置参数之后
非固定参数1
- *args, 传入的参数就是一个元组
- 如果参数中出现 *args, 传递的参数就可以不再是固定个数,传过来的所有参数打包元组
- 如果传入的参数是一个列表或元组,那么就要在列表或元组前面加上*
- 要放在传入参数的最后
非固定参数2
- **kwargs, 传入的参数就是一个字典
返回值
- return
- 可以返回任意对象,return代表函数的结束
局部变量
- 定义在函数里的变量,只能在函数里生效
全局变量
- 定义在函数外部一级代码的变量,全局能用
- 如果全局和局部都有一个同名变量,函数的查找顺序是由内而外。
global
- 在函数中定义全局变量
- 需要先global声明全局变量,后定义变量值
- 不建议函数中改全局变量
函数里不能直接修改的数据
- 字符串
- 数字
- 布尔值
作用域 scope
- python中函数就是一个作用域,局部变量定义在作用域中
- 代码定义完成后,作用域已经生成(不是调用的时候才生成),作用域链向上查找
嵌套函数
- 函数里层再定义函数
匿名函数
lamda
- map(lambda x:x + 1, list(range(10)))
高阶函数
- 接收一个或多个函数作为参数输入
- return返回另外一个函数
递归
- 函数的内部调用函数本身
- 必须有明确的结束条件
- 每次递归问题规模都应有所减少
- 递归效率不高,递归层数太多会导致栈溢出
命名空间 namespace
- 记录对象和对象名字对应关系的空间
LEGB访问规则
- 往上寻找,由内而外
局部命名空间 local
- 函数的参数
- 局部变量
- 类的属性
闭包命名空间 enclosing function
- 闭包函数的命名空间(Python3引入)
全局命名空间 global
- 读取一个模块(.py)后产生的命名空间
内建命名空间 build-in
- Python解释器启动时自动载入__built__模块形成的名称空间
- 各种内置函数str/list/open
闭包
- 闭包是一种代码组织结构
内部函数可以使用外部函数变量的行为,就叫闭包
- 闭包是由函数及其相关的引用环境组合而成的实体
- 而在函数式语言中,当内嵌函数体内引用到体外的变量时,将会把定义时涉及到的引用环境和函数体打包成一个整体(闭包)返回
def foo():
m = 3
n = 5
def bar():
a = 4
return m + n + a
return bar
>>>bar = foo()
>>>bar()
装饰器
- 语法糖
- 本质是一个返回函数的高阶函数
- 想对一个函数扩展功能,又不希望修改原函数代码的情况下就需要装饰器