列表生成式 生成器 迭代器
- 列表生成式
举个例子
列表[0, 1, 2, 3, 4, 5, 6],要求把列表里的每个值加1,如何实现呢?
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 L=[0, 1, 2, 3, 4, 5, 6] 2 a={i+1 for i in L} 3 print(a)
运行结果:{1, 2, 3, 4, 5, 6, 7}
说明:以上例子的实现方法就叫做列表生成式。
- 生成器
生成器:如果列表中的元素可以按照某种算法推算出来,这样就不必创建完整的list,从而节省大量的空间。在Python中,把这种一边循环一边计算的机制,称为生成器:即generator。
创建生成器的方法如下:
方法1:把一个列表生成式的[]
改成()
,就创建了一个generator。
例子:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 L =(i+1 for i in range(6)) 2 for i in L: 3 print(i)
运行结果:1 2 3 4 5 6
注意:generator即生成器保存的是算法,每次调用next(g)
,就计算出g
的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration
的错误。
方法2:使用yield创建生成器,即生成器函数。
如果一个函数定义中包含yield
关键字,那么这个函数就不再是一个普通函数,而是一个generator。
例子:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def updown(n): 2 for x in range(1, n): yield x 3 for i in updown(10): 4 print(i)
运行结果:1 2 3 4 5 6 7 8 9
- 迭代器 迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。通俗地讲,可以被
next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。
生成器都是Iterator
对象,但list
、dict
、str
虽然是Iterable
,却不是Iterator
。
总结:
凡是可作用于for
循环的对象都是Iterable
类型;
凡是可作用于next()
函数的对象都是Iterator
类型,它们表示一个惰性计算的序列;
集合数据类型如list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象。
Python语言的for
循环本质上就是通过不断调用next()
函数实现的。