迭代器
迭代器是一种支持next()
操作的对象。它包含一组元素,当执行next()
操作时,返回其中一个元素;当所有元素都被返回后,生成一个StopIteration
异常。
>>>a=[1,2,3]
>>>ia=iter(a)
>>>next(ia)
1
>>>next(ia)
2
>>>next(ia)
3
>>>next(ia)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
ite()
可以接受多种Python对象为参数,比如list,tuple, dict, set等,并将其转化为迭代器。迭代器可以用于for
语句或in
语句中。很多常用操作也是支持迭代器的,比如sum()
, max()
等。
>>> b=[4,5,6]
>>> ib=iter(b)
>>> for x in ib:
... print(x)
...
4
5
6
>>> ic=iter(b)
>>> sum(ic)
15
>>> id=iter(b)
>>> max(ic)
6
生成器
生成器是一种迭代器,是一种特殊的函数,使用yield
操作将函数构造成迭代器。普通的函数有一个入口,有一个返回值;当函数被调用时,从入口开始执行,结束时返回相应的返回值。生成器定义的函数,有多个入口和多个返回值;对生成器执行next()
操作,进行生成器的入口开始执行代码,yield
操作向调用者返回一个值,并将函数挂起;挂起时,函数执行的环境和参数被保存下来;对生成器执行另一个next()
操作时,参数从挂起状态被重新调用,进入上次挂起的执行环境继续下面的操作,到下一个yield
操作时重复上面的过程。Python的循环操作与C语言的实现不同,如果使用List等数据结构需要耗费大量的内容;循环操作中使用生成器只需要在内存中实例化一个对象,可以减少内存占用,提高循环操作的执行速度。
>>>def myG():
... yield 1
... yield 2
... yield 3
...
>>>g=myG()
>>>next(g)
1
>>>next(g)
2
>>>next(g)
3
>>>next(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>>g2=myG()
>>>for i in g2:
... print(i)
1
2
3
生成器表达式
for...[if]...语句可以简洁的构建一个List,同时也可以用来构建生成器。
>>>a=[7,8,9]
>>>b=[i**2 for i in a]
>>>b
[49, 64, 81]
>>>ib=(i**2 for i in a)
>>>ib
<generator object <genexpr> at 0x7f72291217e0>
>>>next(ib)
49
>>>next(ib)
64
>>>next(ib)
81
>>>next(ib)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
网友评论
```
def index_words(text):
result =[]
if text:
result.append(0)
for index, letter in enumerate(text):
if letter == ' ':
result.append(index+1)
return result
address = 'Four score and seven years ago...'
result = index_words(address)
```
第二个例子是生成器
```
def index_words_iter(text):
if text:
yield 0
for index, letter in enumerate(text):
if letter ==' ':
yield index+1
result = list(index_words_iter(address))
```
第二种写法,运行时内存占用会小一些吗?