python迭代器与生成器用法介绍

发布时间:2020-10-06编辑:脚本学堂
本文介绍了python编程中迭代器与生成器的用法,迭代器和生成器都是Python中特有的概念,迭代器可以看作是一个特殊的对象,每次调用该对象时会返回自身的下一个元素,需要的朋友参考下。

一个python项目,遇到了迭代器和生成器的使用,迭代器和生成器都是Python中特有的概念,迭代器可以看作是一个特殊的对象,每次调用该对象时会返回自身的下一个元素,从实现上来看,一个可迭代的对象必须是定义了__iter__()方法的对象,而一个迭代器必须是定义了__iter__()方法和next()方法的对象。

生成器的概念要比迭代器稍显复杂,因为生成器是能够返回一个迭代器的函数,其最大的作用是将输入对象返回为一个迭代器。
Python中使用了迭代的概念,是因为当需要循环遍历一个较大的对象时,传统的内存载入方式会消耗大量的内存,不如需要时读取一个元素的方式更为经济快捷。

代码:
 

复制代码 代码示例:
__metaclass__=type
#iterator and generator
class Fibs:
    def __init__(self):
        self.a = 0
        self.b = 1
    def next(self):
        self.a, self.b = self.b, self.b + self.a
        if self.a > 10: raise StopIteration
        else:
            return self.a
    def __iter__(self):
        return self
fibs = Fibs()
print list(fibs)

第一行还是定义了一个新式类,这是现在推荐的方式;
第三行到第十三行定义了斐波那契数列类,其中最为关键的是第七行的next函数和第十二行的__iter__函数,这两个函数的定义使得Fibs成为了一个迭代器类。
next()方法的作用是返回对象的下一个元素值,因此需要return语句;__iter__()方法的作用是返回对象自身,从而可以继续遍历对象的下一个元素,因此使用语句return self;

第十四行定义一个对象fibs,然后使用list()函数将其转化成列表;
python迭代器与生成器

至于生成器,可以看如下函数:
 

复制代码 代码示例:

# -*- coding: cp936 -*-
__metaclass__=type
#iterator and generator
def flatten(i_stream):
    try:
        #不要迭代字符串对象
        try: i_stream + ' '
        except TypeError:pass
        else: raise TypeError
        for sublist in i_stream:
            for element in flatten(sublist):
                yield element
    except TypeError:
        yield i_stream

test = [1, 2, [3, 4], 5, [[6, 7], 8, [9, 12], 13], 89, 99]
print list(flatten(test))

上述代码的主要作用是将一个含有嵌套结构的列表解除嵌套,打印出所有的元素。比如[1, 2, [3, 4]]结果应当是[1, 2, 3, 4],具体代码功能如下:
第四行到第十四行定义了一个解除嵌套的函数,首先使用try来处理类型异常,因为字符串类型没有必要单独拆分成列表;
第十行到第十二行使用递归的模式处理列表嵌套问题,基本情况直接返回i_stream,递归情况则调用自身函数;
只有定义了yield语句的函数才可以作为生成器使用;

如图:
python迭代器与生成器