函数进阶
函数对象
函数是第一类对象,即函数可以当作数据传递。
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可以返回多次值。