Python 迭代器(iterator) 生成器(generator)
| | 分类于 Python
字数统计:744字 | 阅读时长:2 分钟
阅读量: 0 | 评论量:

Python 迭代器(iterator) 生成器(generator)

0 Views Python with
本文字数:744 字 | 阅读时长 ≈ 2 min

可迭代对象(iterable)

  • 定义

    iterable又称为可迭代对象。在Python中,如果一个对象(又称为container object)实现了__iter__()方法或者可以支持下标索引的__getitem__()方法,就称为一个可迭代对象。

  • iterable.__iter__()方法

    调用一个可迭代对象的__iter__()方法会返回一个当前可迭代对象的一个迭代器(iterator)。这个在下一章会提到。

  • iter(iterable)方法

    把一个可迭代对象传入iter()会返回一个当前可迭代对象的一个迭代器(iterator)。

  • 判断方法
    在Python中,我们常用到的集合数据类型都是iterable的。如列表(list),元组(tuple),字典(dict),集合(set),字符串(str)等。在程序中判断一个对象是否是iterable的方法为

    # Method1: use isinstance
    from collections import Iterable
    isinstance([1, 2, 3], Iterable)
    
    # Method2: use for loop
    for i in [1, 2, 3]:
        print(i)

迭代器(iterator)

  • 定义

    借用Python文档中对迭代器的定义,一个迭代器指的是一个包含着数据流的对象,它每次返回数据中的一个元素。一个可迭代对象本身也可以是迭代器,但是这样在迭代一次之后数据本身将无法使用,除非将迭代器重置。在Python中大部分迭代器和可迭代对象是分离的,这样就保证了能够重复产生迭代器。

  • __next__()方法

    一个迭代器必须实现__next__()方法。在每次调用迭代器(注意,不是可迭代对象)的__next__()方法时顺序返回数据的一个元素。当遍历完数据后抛出StopIteration异常,表示迭代完成。这时迭代器也就完成了它的使命。

  • __iter__()方法

    调用一个迭代器的__iter__()方法会返回迭代器对象本身,注意每次调用产生一个新的迭代器对象。

  • next()方法

    next()内传入一个迭代器,可以得到迭代器的下一个值。

生成器(generator)

  • 定义

    生成器可以看成是迭代器的简化版。生成器只需要定义一个函数,并将普通函数的return改为yield即可。

  • 使用
    在使用生成器时,可以像一个普通的迭代器一样,使用for in或者next()方法获取其中的值。

     # Define a generator
     def range_like(n):
         i = 0
         while i < n:
             yield i
             i += 1
    
     # Create a generator object
     a = range_like(5)
     a.__next__()
    
     for i in range_like(n):
         print(i)

迭代器、生成器的关系

迭代器、生成器、可迭代对象的关系可用下图表示

for语句的执行顺序

在对一个iterable对象使用for语句时,实际上先调用了iter()方法返回一个iterator,然后再依次调用__next__()方法获得每一个值。当抛出StopIteration异常时意味着for语句的结束。

参考

  1. What exactly are iterator, iterable and iteration

  2. 9.8. Iterators

  3. 彻底理解Iterable, Iterator, generator

  4. Python中iteration(迭代)、iterator(迭代器)、generator(生成器)等相关概念的理解

2019-07-09