Python中的生成器(generator)和迭代器(Iterator)

Python是一种动态的编程语言,那就具有动态编程语言的特性,可以在运行时改变其结构,比如新的函数,对象、代码也可以引进,已有的函数可以被删除。。。目前最常用的可以归纳为以下几点:1.运行的过程中给对象绑定(添加)属性,2.运行过程中给类绑定(添加)属性,3.运行的过程中给类绑定(添加)方法,4.运行的过程中删除属性和方法。在安全和限制的条件下,可以使用__slots__变量来达到此目的。需要注意的是,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的。

生成器:

在Python中·,一边循环一边计算的机制被称之为生成器(generator),这个机制的优点是在于边循环边计算,可以省很多内存,适合连续性计算很大量的程序。它可以按照某种算法来推算出列表元素,可以在循环的过程中不断推算出后续的元素,从而不必创建完整的list,适合有规律的list。

生成器的创建方法有两种,第一种是只要把一个列表生成式的[ ]改为()即可,把[ ]改为(),那就由列表变成了生成器,一般在创建生成器之后,是通过for循环来进行迭代,程序记住的是算法。过程结束不会抛出StopIteration异常。第二种是推算的算法比较复杂,用for循环无法实现时,可用函数来实现,函数记下来的是推算规则。把函数的部分转化为生成器一般需要用到关键字yield,它能够把函数包装为generator,然后进行迭代。在用for循环调用generator时,一般拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中。

可以说生成器是这样一个函数,他记住了上一次返回时在函数体中的位置,对生成器函数之后的第n次调用跳转时,对上次调用的所用局部变量都保持不变。对数据状态和流控制构造中的位置都有所记录。

迭代器:

迭代是可以用来访问集合的。迭代器也是一种对象,它是可以记住遍历位置的对象,迭代器对集合的操作只能往前不能后退。

直接作用于for循环的数据类型有以下几种:

1,集合数据类型,比如list,  tuple,  dict,  set,  str等;

2,generator,包括生成器和带yield的generator function

这些可以直接作用于for循环的对象都是可迭代对象:Iterable。一般可迭代对象的判断是使用isinstance()函数来进行的。可以被next()函数调用并不断返回下一个值的对象称之为迭代器:Iterator。对于生成器来说,都是Iterator对象,但list、dict、str不是Iterator,需要使用iter()函数来更改。

In:isinstance(iter([]),Iterator)
Out:True

In:isinstance(iter('abc',Iterator))
Out:True

总结:

1.凡是可作用于for循环的对象都是Iterable类型

2.凡是可作用于next()函数的对象都是Iterator类型

3.集合数据类型如list、dict、str等是Iterable但不是Iterator,可以通过iter()函数来获得Iterator对象

猜你喜欢

转载自blog.csdn.net/HelloMy_Future/article/details/81515874