Python迭代器和生成器

Python 支持在容器中进行迭代,关于迭代的概念有"可迭代对象"、"迭代器"和"生成器"。

 

1、可迭代对象(iterable)

  • 可迭代协议:如果一个对象实现了__iter__()方法,那么这个对象就是一个可迭代对象;

  • 可以通过iter(iterable)或者iterable.__iter__(),返回一个迭代器对象;

  • 可迭代对象可以使用iter()函数,不能使用next()函数,可迭代对象可以被 for循环;

  • Python 中,str、list、tuple、dict、set都是可迭代对象;

  • 验证实例:

    dir('Hello, World!')    # 查看str对象实现了那些方法
    
  • 输出结果:可以看到有__iter__

    ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
    

 

2、迭代器(iterator)

  • 迭代器协议:如果一个对象实现了__iter__()__next__()两个方法,那么该对象就是一个迭代器对象;

  • 可以通过next(iterator)或者iterator.__next__(),返回迭代器对象的下一个值;

  • 当迭代器被迭代完,没有下一项可返回时,会触发StopIteration异常;

  • 验证实例:

    s = "Hello, World!"
    s = iter(s)
    type(s)
    dir(s)
    
  • 输出结果:可以看到 s是一个 str_iterator对象,包含__iter____next__两个方法;

    <class 'str_iterator'>
    ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']
    

 

3、生成器(generator)

  • 生成器是一种更优雅、实现方式简单的迭代器;

  • 生成器有两种实现方式:

    第1种,使用常规函数定义,用yield返回结果;

    def g(n):
        for i in range(n):
          yield i
    

    验证g(n)对象的类型:

    type(g(10))
    

    输出:

    <class 'generator'>
    

     
    第2种,使用生成器表达式:

    g = (i for i in range(10))
    

    验证g对象的类型:

    type(g)
    

    输出:

    <class 'generator'>
    
posted @ 2020-04-13 15:40  mazinga  阅读(94)  评论(0)    收藏  举报