函数进阶

函数对象

函数是第一类对象,即函数可以当作数据传递。

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可以返回多次值。

原文地址:https://www.cnblogs.com/taostaryu/p/8681261.html