函数对象
函数是第一类对象, 即函数可以当作数据传递
1. 可以被引用
2. 可以当作参数传值
3. 返回值可以是函数
4. 可以当作容器类型的元素
函数的嵌套调用: 在函数内又调用了其它函数
名称空间: 存放名字与值绑定关系的地方
名称空间分类:
1. 内置名称空间: python 解释器自带的名字, 在解释器启动时就生效, 解释器关闭则失效
2. 全局名称空间: 文件级别的名字, 在执行文件时生效, 在文件结束或执行期间被删除则失效
3. 局部名称空间: 函数内定义的名字 (函数的参数以及函数内的名字都存放于局部名称空间) 在函数调用时临时生效, 调用结束则失效
加载顺序: 内置名称空间 -->全局名称空间 -->局部名称空间
查找名字: 局部名称空间 -->全局名称空间 -->内置名称空间(注意: 在全局无法查看局部的, 在局部可以查看全局的)
作用域(作用域即范围)
全局作用域: 包含的是内置名称空间与全局名称空间的名字特点:
1. 在任何位置都能够访问到
2. 该范围内的名字会伴随程序整个生命周期
局部作用域: 包含的是局部名称空间的名字的特点:
1. 只能在函数内使用
2. 调用函数时生效, 调用结束失效
闭包函数
指的是定义在函数内不的函数, 并且该函数包含对外部函数作用域中名字的引用, 该函数称为闭包函数
软件一旦上线, 就应该遵循开放封闭原则, 对扩展开放, 对修改源代码及使用方式是封闭
1. 不修改源代码
2. 不修改调用方式
装饰器目标: 在遵循 1 和 2 的前提下为被装饰对象添加上新功能
迭代器: 迭代的工具
迭代是一个重复的过程, 并且每次重复都是基于上一次的结果而来, 它就是一个迭代取值的工具
可迭代的对象: 在 python 中, 但凡内置有__iter__方法的对象, 都是可迭代的对象, 执行后得到的返回值就是迭代器对象(没有索引也能取值)
迭代器的优点
1. 提供了一种可不依赖于索引的取值方式
2. 迭代器更加节省内存
迭代器的缺点
1. 取值麻烦, 只能按顺序一个一个取, 只能往后取值
2. 并且是一次性取值, 无法用 len 获取长度
迭代器对象(文件本身就是迭代器对象)
1. 获取迭代器对象的方式:
执行可迭代对象的__iter__方法, 拿到的返回值就是迭代器对象
2. 特点
内置有__next__方法, 执行该方法会拿到迭代器对象中的一个值
内置有__iter__方法, 执行该方法会拿到迭代器本身
for 循环称之为迭代器循环, in 后跟的必须是可迭代的对象
生成器
生成器本身就是迭代器, 也就是说生成器的玩法就是迭代器的玩法 yield 暂停效果
1. 为我们提供了一种自定义迭代器的方式, 可以在函数内用 yield 关键字, 调用函数拿到的结果就是一个生成器, 生成器就是迭代器
2.yield 可以像 return 一样用于返回值, 区别是 return 只能返回一次值, 而 yield 可以返回多次值
来源: http://www.bubuko.com/infodetail-2544955.html