- 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
- 迭代器有两个基本的方法:iter() 和 next()。
- 字符串,列表或元组对象都可用于创建迭代器
eg:
list = [1,2,3,4]
it = iter(list)
print(next(it))
如果继续print:
print(next(it))
迭代器对象可以使用常规for语句进行遍历:
#!/usr/bin/python3
list=[1,2,3,4]
it = iter(list)
for x in it:
print (x, end=" ")
也可以使用 next() 函数:
import sys
list = [1, 2, 3, 4]
it = iter(list)
while True:
try:
print(next(it),end = " ")
except StopIteration:
sys.exit()
注:sys.exit([arg]): 程序中间的退出,arg=0为正常退出
创建一个迭代器
创建一个返回数字的迭代器,初始值为 1,逐步递增 1:
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
看运行结果:
StopIteration
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 next() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代
eg:
在 20 次迭代后停止执行:
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x,end=" ")
运行结果:
生成器
- 在 Python 中,使用了 yield 的函数被称为生成器(generator)。
- 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作
- 在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行
- 调用一个生成器函数,返回的是一个迭代器对象。
eg:
以下实例使用 yield 实现斐波那契数列:
import sys
def fibonacci(n):
a,b,c = 0,1,0
while True:
if c > n :
return
yield a
a,b = b ,a + b
c += 1
f = fibonacci(10)
while True:
try:
print(next(f),end=" ")
except StopIteration:
sys.exit()