// 函数使用期间:变量的作用域一定要注意,主要体现在 1. 变量作用域内是否被定义 2. 可变对象传参是否会被修改

1. 函数命名空间

概念:内存中变量名和对象的对应关系 // 字典 // 每个命名空间都是独立的存在,可以存在相同名字的变量 分类: 1. 局部命名空间:函数所拥有的命名空间,记录了函数中定义的变量、入参等 2. 全局命名空间:模块级的命名空间 // 模块加载时创建 3. 内置命名空间:放置内置函数和异常 // 任何地方都可以使用 生命周期: 1. 函数调用时创建、执行结束或抛异常删除 2. 模块加载时创建,一直在python解释器退出 3. python解释器创建时创建 *注意* python解释器加载期间,会加载出内置命名空间和全局命名空间,局部命名是在调用时创建,函数调用结束自动退出。2. 函数作用域

作用域:针对变量,指的是变量的可用范围 // 其实作用域就是指的命名空间内变量的作用范围 分类: 只有函数、类、模块有作用域,代码块没有作用域 // 变量查找范围 LEGB 1. 局部作用域 2. 嵌套作用域 3. 全局作用域 4. 内置作用域 两个特殊参数: 1. global // 使得内部作用域内的变量可以修改全局变量 2. nolocal // 使用内部作用域内的变量可以修改嵌套作用域内的变量 工厂函数和嵌套作用域 // 内层函数都是可以记住顶层函数的状态 """ def func(): x = 1 def action(): x = 1 pass return action // 此处的action函数会记住外层函数func的变量 """3. 函数参数

可变对象传参和不可变对象传参 1. 不可变对象:值传递,内部不可修改 2. 可变对象:指针传递,内部可以修改 避免可变对象传参的修改 1. 调用时拷贝,避免在函数内部修改外部可变对象 func(a,b[:]) 2. 函数内部进行拷贝 func(a,b): b = b [:] 可变参数类型 # 函数头部:收集任意数量的参数 *args ==> args会是一个元祖 **args ==> args会是一个字典4. lambda表达式5. 内置函数

1. map函数 list(map(lambda x:x + 2,[1,2,3,4])) => [3,4,5,6] // map对序列中每个元素执行相同的操作 2. filter函数 list(map(lambda x:x > 3,[1,2,3,4,5])) => [4,5] // 返回结果为True的元素 3. reduce函数 from functools import reduce reduce(lambda x,y:x+y,[1,2,3,4]) => 10 // python3 reduce已经移到内置命名空间里面