python(6.29)迭代器、闭包

一、迭代器    

        迭代器是访问集合内元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问一遍后结束。

迭代器不能回退,只能往前进行迭代。

        对于原生支持随机访问的数据结构(如tuplelist),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值,这是后话)。但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式。

        迭代器的另一个优点就是它不要求你事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代至某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件,或是斐波那契数列等等。这个特点被称为延迟计算或惰性求值(Lazy evaluation)

        迭代器更大的功劳是提供了一个统一的访问集合的接口。只要是实现了__iter__()方法的对象,就可以使用迭代器进行访问        

        使用内建的工厂函数iter(iterable)可以获取迭代器对象:

1

2

3

4

>>> lst = range(2)

>>> it = iter(lst)

>>> it

<listiterator object at 0x00BB62F0>

二、闭包

    所谓闭包,就是将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象

    

·       Local - 本地函数(show_filename)内部,通过任何方式赋值的,而且没有被global关键字声明为全局变量的filename变量;

·       Enclosing - 直接外围空间(上层函数wrapper)的本地作用域,查找filename变量(如果有多层嵌套,则由内而外逐层查找,直至最外层的函数)

·       Global - 全局空间(模块enclosed.py),在模块顶层赋值的filename变量;

·       Builtin - 内置模块(__builtin__)中预定义的变量名中查找filename变量;

在任何一层先找到了符合要求的filename变量,则不再向更外层查找。如果直到Builtin层仍然没有找到符合要求的变量,则抛出NameError异常。这就是变量名解析的:LEGB法则。

总结:

.        闭包最重要的使用价值在于:封存函数执行的上下文环境

.        闭包在其捕捉的执行环境(def语句块所在上下文)中,也遵循LEGB规则逐层查找,直至找到符合要求的变量,或者抛出异常。


         闭包的重要特性:封存上下文,这一特性可以巧妙的被用于现有函数的包装,从而为现有函数增加功能。而这就是装饰器。

猜你喜欢

转载自blog.csdn.net/qq_42351920/article/details/80859449