Python 迭代器和生成器
Python 迭代器和生成器
迭代是Python最强大的功能之一,是访问集合元素的一种方式,一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter()
和 next()
。
list = [1,2,3,4]
# 创造迭代器对象
iteror = iter(list)
print(next(iteror))
print(next(iteror))
1
2
迭代器对象可以使用常规for语句进行遍历:
list = [1,2,3,4]
# 创造迭代器对象
iteror = iter(list)
for it iteror:
print(x,end="")
1 2 3 4
在上面的示例中,迭代对象是一个列表创建的,期中元素个数为4,因为使用的是for循环,会有边界限制,当使用next()
方法时,如果在调用过程中越界就会出现StopIteration
异常。
list = [1,2,3,4]
# 创造迭代器对象
iteror = iter(list)
print(next(iteror))
print(next(iteror))
print(next(iteror))
print(next(iteror))
print(next(iteror))
1
2
3
4
Traceback (most recent call last):
File "e:\Code\Python\tempCodeRunnerFile.py", line 8, in <module>
print(next(iteror))
StopIteration
StopIteration
异常往往标准着迭代的完成,我们就可以通过异常处理来终止迭代。
list = [1,2,3,4]
iteror = iter(list)
try:
print(next(iteror))
print(next(iteror))
print(next(iteror))
print(next(iteror))
print(next(iteror))
except StopIteration:
print("迭代完成")
时候while
循环代替呆呆傻傻反复的调用(记得看过一篇文章说while 1
的效率高于while True
):
list = [1,2,3,4]
iteror = iter(list)
try:
while 1:
print(next(iteror))
except StopIteration:
print("迭代完成")
1
2
3
4
迭代完成
在 Python 中,使用了 yield
的函数被称为生成器(generator
)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。yield
在使用和return
类似,更像一个支持断点的return
,返回的是一个生成器。
def Fun(num):
while 1:
num += 1
yield num
g = Fun(0)
print(next(g))
print(next(g))
print(next(g))
1
2
3
以一个斐波那契数列为例、个非常简单的递归数列,除第一个和第二个数外,任意一个数都可由前两个数相加得到。
import sys
def fibonacci(n): # 生成器函数 - 斐波那契
a, b, counter = 0, 1, 0
while 1:
if (counter > n):
return
yield a
a, b = b, a + b
counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
try:
while 1:
print (next(f), end=" ")
except StopIteration:
sys.exit()