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()