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