美文网首页
Python进阶 生成器(Generators)

Python进阶 生成器(Generators)

作者: FicowShen | 来源:发表于2018-06-12 16:40 被阅读7次

    迭代器是一个让程序员可以遍历一个容器(特别是列表)的对象。然而,一个迭代器在遍历并读取一个容器的数据元素时,并不会执行一个迭代。—— 维基百科

    可迭代对象(Iterable)

    Python中任意的对象,只要它定义了可以返回一个迭代器的iter方法,或者定义了可以支持下标索引的getitem方法(这些双下划线方法会在其他章节中全面解释),那么它就是一个可迭代对象。简单说,可迭代对象就是能提供迭代器的任意对象。那迭代器又是什么呢?

    迭代器(Iterator)

    任意对象,只要定义了next(Python2) 或者next方法,它就是一个迭代器。就这么简单。现在我们来理解迭代(iteration)

    迭代(Iteration)

    用简单的话讲,它就是从某个地方(比如一个列表)取出一个元素的过程。当我们使用一个循环来遍历某个东西时,这个过程本身就叫迭代。现在既然我们有了这些术语的基本理解,那我们开始理解生成器吧。



    一个计算斐波那契数列的生成器

    def fibon(n):
        a = b = 1
        for i in range(n):
            yield a
            a, b = b, a + b
    

    不使用生成器的方式和生成器相比会更加浪费内存,在计算很大的输入参数时,会用尽所有的资源。

    def fibon(n):
        a = b = 1
        result = []
        for i in range(n):
            result.append(a)
            a, b = b, a + b
        return result
    



    内置函数 next 可以获取一个序列的下一个元素。
    使用next函数进行迭代:

    def generator_function():
        for i in range(3):
            yield i
    
    gen = generator_function()
    print(next(gen))
    # Output: 0
    print(next(gen))
    # Output: 1
    print(next(gen))
    # Output: 2
    print(next(gen))
    # Output: Traceback (most recent call last):
    #            File "<stdin>", line 1, in <module>
    #         StopIteration
    



    内置函数 iter 可以根据一个可迭代对象返回一个迭代器对象。

    my_string = "Yasoob"
    my_iter = iter(my_string)
    next(my_iter)
    # Output: 'Y'
    

    相关文章

      网友评论

          本文标题:Python进阶 生成器(Generators)

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