欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-12 12:49:04
...

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对象