10.Python编程:迭代器和生成器

作者: TensorFlow开发者 | 来源:发表于2018-03-29 10:24 被阅读5次

前面介绍了python中的条件判断和循环控制。而在循环控制中,还有一个比较重要的迭代器。迭代也叫遍历,迭代是Python最强大的功能之一,是访问集合元素的一种方式,可遍历一个list、tuple、字符串等。本文就来详情介绍python3中的迭代器和生成器。

迭代器: iterator [ɪtə'reɪtə]

迭代是Python最强大的功能之一,是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。字符串,列表或元组对象都可用于创建迭代器。

iter()函数官方解释:

ter(iterable) -> iterator
iter(callable, sentinel) -> iterator
Get an iterator from an object. In the first form, the argument must
supply its own iterator, or be a sequence.
In the second form, the callable is called until it returns the sentinel.

中文意思是:

python提供了一个iter()函数用来生成迭代器。这个方法有两个参数,当只有一个参数的时候,若这个参数是一个容器,则返回这个容器的迭代器对象,若这个参数本身就是一个迭代器,则返回其自身。

注意:
1.迭代器只能往前不会后退。
2.迭代器是一个可以记住遍历的位置的对象。
3.迭代器有两个基本的方法:iter() 和 next()。
iterator 的特点

迭代器都有一个next()方法,每次调用这个方法而实现计数,当然计数不是通过索引实现,调用了next方法只会: 迭代指针会指向下一个元素的位置。若下一个元素没有了,则会抛出StopIteration异常。

思考:这样做有什么用呢?

试想想在迭代指针还没指到的当前元素时候,已经迭代之后的位置元素,那些元素需要计算么?因为只有迭代到当前位置的元素时候,才开始计算元素的值。在迭代之前可以不存在,在迭代之后可以被销毁。实现的迭代器不需要准备所遍历的所有元素,没错,这就是迭代器的一大魅力: 惰性计算。
通过例子来看下迭代器的生成和next()方法的使用:

# 初始化一个list
my_list = ['1', '2', '3', '4', '5']

iterator = iter(my_list)

print(next(iterator))
print(next(iterator))

for x in iterator:
    print( 'x = ' + x)

运行结果:

1
2
x = 3
x = 4
x = 5

通过迭代器遍历list,并通过StopIteration异常来作为是否遍历结束:

# 初始化一个list
my_list = ['1', '2', '3', '4', '5']
# 创建一个迭代器
iterator2 = iter(my_list)

print("通过迭代器开始遍历:")
while True:
    try:
        print('x2 = ' + next(iterator2))
    except StopIteration:
        print("通过迭代器遍历完毕!")
        exit()

运行结果:

通过迭代器开始遍历:
x2 = 1
x2 = 2
x2 = 3
x2 = 4
x2 = 5
通过迭代器遍历完毕!

对于上面的 it 这个迭代器,是通过 iter()方法实现的,那么iter函数到底做了什么呢?简而言之,实现了迭代器协议的对象,就是迭代器。什么事迭代器协议呢?再简而言之,满足下面两个条件即可:

1.实现了魔法方法 iter(),返回一个迭代对象,这个对象有一个next()方法,
2.实现 next() 方法,返回当前的元素,并指向下一个元素的位置,当前位置已经没有元素的时候,抛出StopIteration异常。

生成器:generator [ˈdʒɛnəˌretɚ]

在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。调用一个生成器函数,返回的是一个迭代器对象。

generator有以下特别:
1. 遵循迭代器(iterator)协议,迭代器协议需要实现__iter__、next接口
2. 能过多次进入、多次返回,能够暂停函数体中代码的执行

补充:

后面紧接着会学习Python中的函数,下面补充内容可以等学完函数再来对比。此处简单区分一下两者的。
generator function产生的generator与普通的function有什么区别呢?
(1)function每次都是从第一行开始运行,而generator从上一次yield开始的地方运行
(2)function调用一次返回一个(一组)值,而generator可以多次返回
(3)function可以被无数次重复调用,而一个generator实例在yield最后一个值 或者return之后就不能继续调用了

例如:

# 生成器函数 - 斐波那契
# 定义一个生成器函数:斐波那契
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 是一个迭代器,由生成器返回生成
f = fibonacci(10)

while True:
    try:
        print(next(f), end=" ")
    except StopIteration:
        exit()

运行结果:

0 1 1 2 3 5 8 13 21 34 55 

小结

本文简单介绍了python3中的迭代器和生成器。熟练理解和使用迭代器和生成器可以大大提高开发效率。


更多了解,可关注微信公众号:人人懂编程


微信公众号:人人懂编程

相关文章

网友评论

    本文标题:10.Python编程:迭代器和生成器

    本文链接:https://www.haomeiwen.com/subject/mbuucftx.html