上一篇
本次分享迭代器和生成器
正文
迭代是Python最强大的功能之一,是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。迭代器有两个基本的方法:iter() 和 next()。
字符串,列表或元组对象都可用于创建迭代器:
列表
>>> li=[1,2,3]
>>> it=iter(li)#创建迭代器
>>> print(next(it))#获取迭代器下一个
1
>>> print(next(it))#获取下一个
2
>>> print(next(it))
3
>>> print(next(it))#超过时候会报出来异常StopIteration
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
字符串
>>> strone='1ABB'
>>> one=iter(strone)
>>> print(next(one))
1
>>> print(next(one))
A
元组
>>> name={'a','b'}
>>> item=iter(name)
>>> print(next(item))
a
>>> print(next(item))
b
>>> print(next(item))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
迭代器除了这样,还可以for循环
>>> name={'a','b'}
>>> item=iter(name)
>>> for i in item:
... print(i)
...
a
b
当然也可以用next
>>> list=[1,2,3,4]
>>> it = iter(list)
>>> while True:
... print(next(it))
...
1
2
3
4
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
StopIteration
这里越界后会报错,所以可以用try处理下。
>>> import sys # 引入 sys 模块
>>> list=[1,2,3,4]
>>> it = iter(list) # 创建迭代器对象
>>> while True:
... try:
... print (next(it))
... except StopIteration:
... sys.exit()
...
1
2
3
4
这样就处理了异常。
创建一个迭代器
把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。
如果你已经了解的面向对象编程,就知道类都有一个构造函数,Python 的构造函数为 __init__(), 它会在对象初始化的时候执行
class Myiter():
def __iter__(self):
self.a=1
return self
def __next__(self):
x=self.a
self.a+=1
return x
my=Myiter()
myite=iter(my)
print(next(myite))
print(next(myite))
print(next(myite))
结果输出
1
2
3
创建一个迭代器,然后迭代增加。类相关的后续分享。
在 Python 中,使用了 yield 的函数被称为生成器(generator)演示下:
def odd():
print('step 1')
yield 1
print('step 2')
yield(3)
print('step 3')
yield(5)
o=odd()
next(o)
next(o)
结果:
step 1
step 2
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。调用一个生成器函数,返回的是一个迭代器对象。
在一次执行,我们可以通过迭代器,产生一个对象处理完,获取迭代器下一个对象。