Python之生成器迭代器

Posted 瑶池里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python之生成器迭代器相关的知识,希望对你有一定的参考价值。

生成器

生成器类似返回值为数组的一个函数,这个函数可以接受参数,可被调用,但只能产生一个值,所以大大节省内存。

生成器表达式的语法非常简单,只需要将列表推导式的中括号改成小括号就可以了

1 [x+x for x in range(10) if x%2==0]#会打印出整个列表
[0, 4, 8, 12, 16]
1 (x+x for x in range(10) if x%2==0)#按某种程序规则存储起来,只隐士的显示出来
<generator object <genexpr> at 0x7fbb230ebe50>

调用生成器的方法也非常简单,用循环直接打出即可,或用next()函数打印单个元素。但是生成器里的对象只能被读取一次,就会从内存中消失。
1 g=(x+x for x in range(10) if x%2==0)
2 for i in g:
3     print(i)
0
4
8
12
16

尝试第二次打印
1 for i in g:
2     print(i)#因为被读取过,所以打印为空

 

next()获取

1 c=(x+x for x in range(10) if x%2==0)
2 next(c)

0

1 next(c)

4

直到调用最后一个对象之后再用next() 会出现Stopiteration的报错。

 


迭代器 

 

1、协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数等)使用迭代器协议访问对象

(实际for语句的内部实现应该就是首先调用对象的__iter__方法,获取一个迭代器对象,接着不停的调用迭代器对象的__next__方法,循环遍历取值。)

2、可迭代对象:简单来讲可用for循环的对象,如list、dict、set等都是可迭代的对象。

3、迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个stoplteration报错,最后结束迭代。

4、可迭代对象可通过iter()函数转化成迭代器

1 a=iter(list("python"))#用iter(可迭代对象)创建迭代器
2 a
<list_iterator at 0x7fc9158dbb90>
next(a)
‘p‘

 

总结:1、简单来讲能被for作用循环的我们可以视为可迭代的对象(iterable),生成器(generator)、迭代器(iterator)、list、set等都为可迭代的对象。
         2、能被next( )作用的对象我们称之迭代器。我们可知生成器也能被next( )调用,其实生成器是特殊的迭代器。
         3、为什么有些可迭代对象不是迭代器,因为迭代器的实质是数据流,是惰性的,(我自己理解为待推到多米骨诺牌),所以迭代器可以用next()一个个激活其中的对象。
         4、生成器、迭代器、可迭代的对象三者关系可理解为:生成器<迭代器<可迭代的对象

以上是关于Python之生成器迭代器的主要内容,如果未能解决你的问题,请参考以下文章

python之装饰器生成器迭代器

python-之装饰器迭代器生成器

python的重重之器(生成器迭代器装饰器)

第五篇Python之迭代器与生成器

python之迭代器和生成器

python高级之生成器&迭代器