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