python(九)迭代器和生成器
一、迭代
迭代就是逐个并且单向访问容器 (这里的容器暂时指数据类型,比如list和dict) 中的元素的行为。举个例子:将一个长度为五的数组逐个从头到尾(即单向)打印的方式称之为迭代。如下图。
>>> list = [1,2,3,4,5] >>> for i in list: ... print i ... 1 2 3 4 5
二、迭代器
1、迭代器概念
迭代器简单的说就是可以对数据(这里指可以迭代的数据)进行迭代行为的对象。
可以通过以下两个方面描述迭代器[4]:
1)、iter 返回的是迭代器对象本身。用在for 和 in 上面。
2)、每次调用next() 方法返回迭代器的下一个元素,当没有元素可以返回就会抛出异常;
迭代器可以理解为可以逐个并单向访问容器中元素的游标。
而迭代器对象只能迭代一次,也就是返回最后的值后,再继续访问,只会返回异常。
下面举个例子(2):
>>> list = [1,2,3,4,5] >>> iterator = iter(list) >>> iterator.next() 1 >>> iterator.next() 2 >>> iterator.next() 3 >>> iterator.next() 4 >>> iterator.next() 5 >>> iterator.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
2、迭代器的实现[4]:
接下通过定义一个迭代器来实现迭代功能, 这个是官方文档的例子[4]:
先定义(个人觉得这个例子不合适,有个更好的找不到,自己也暂时想不出)
class Counter(object): def __init__(self, low, high): self.current = low self.high = high def iter(self): 'Returns itself as an iterator object' return self def next(self): 'Returns the next value till current is lower than high' if self.current > self.high: raise StopIteration else: self.current += 1 return self.current - 1
再实现
test1 = Counter(1,3).iter() print "test1" print next(test1) print next(test1) print next(test1) test2 = Counter(1,3) print "test2" print next(test2) print next(test2) print next(test2) print next(test2)
这是输出
#test1 的输出 test1 1 2
3 #test2 的输出 test2 1 2
3 StopIteration
注意test2的next调用超过里面的元素就会抛出异常
三、生成器
生成器也是迭代器,但比迭代器多了一个关键字yeild. 这个yield功能替代了迭代器的iter 和 next 功能。
我在参考的时候看到一个概况的很好的说法。
“yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象(转自[2], 作者:廖雪峰)”
举个例子(3),先定义一个生成器
def counter_generator(low, high): while low <= high: yield low low += 1
实现
i= counter_generator(1, 3) print(i.next()) print(i.next()) print(i.next()) print(i.next())
输出
1
2
3
StopIteration
再举个例子(4),先定义一个生成器
>>> def fab(max): ... n, a, b = 0, 0, 1 ... while n < max: ... yield b ... a, b = b, a + b ... n = n + 1 >>> f = fab(5) >>> print f.next() #这里返回的值可以当做 'b' 的值 1 >>> print f.next() 1 >>> print f.next() 2 >>> print f.next() 3 >>> print f.next() 5 >>> print f.next() StopIteration
参考:
[1] Python中iteration(迭代)、iterator(迭代器)、generator(生成器)等相关概念的理解[2]:
http://blog.csdn.net/dawningblue/article/details/72629362
[2] Python yield 使用浅析
https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/
[3] Iterator - Python Wiki
https://wiki.python.org/moin/Iterator
[4] python官方文档定义
https://pymbook.readthedocs.io/en/latest/igd.html