Featured image of post CS61A学习笔记 迭代器和生成器

CS61A学习笔记 迭代器和生成器

迭代器

我们在之前学习过Python中的可迭代变量,比如:

image

可以对这些变量进行for...in迭代循环操作

image

可以判断变量是否可迭代

迭代器和迭代变量不同。迭代器是一种对象,能够逐个访问可迭代对象的值。我们用iter()来新建一个迭代器,用next()对迭代器进行迭代。

image image

对字符串进行迭代操作

当next()迭代到最后一个元素的下一个元素时,就会返回StopIteration。

image

可以用try/except语句来处理StopIteration异常。

image

那么为什么不用For循环来进行这些操作呢?

For循环和迭代器

python中的for循环本质上是一种语法糖,执行的就是刚才的迭代过程。

image

For循环的幕后

image

iter和next实际上都是可迭代变量的方法之一

实际上,Python优化了For循环,使其在运行速度和效率上都比直接写迭代器的方法要优秀。

image

所以正常情况下我们应该使用for循环,但是了解for循环和iter、next、StopIteration机制也是非常重要的。

迭代器类型(Iterator)

有很多返回迭代器的函数。比如下面这个reversed函数。

image image

可以将返回的迭代器转换为链表,避免迭代器的追踪引发的错误

还有之前提到的zip函数。

image image

对多个元素进行zip

以及map和filter。

image

可以替代之前学过的方法

生成器

你可以把它理解成函数中带return功能的断点。

image

使用yield会使函数返回一个迭代器类型。你可以对这个迭代器进行next()操作,这样函数就会从yield的位置再次开始执行。

image

return的值会被放在StopIteration里

image

进行各种各样的yield

当我们需要处理很多的输入或者输出时,使用yield可以按需生成,避免一次性开出过大的内存。

比如,我们可以用yield来实现斐波那契数列。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import sys
 
def fibonacci(n): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
 
while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()

在一些情况下我们可以使用语法糖:yield from语句。 image

Fun Fact image