Python进阶 生成器(Generators)

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


可迭代对象(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 "", line 1, in 
#         StopIteration



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

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

你可能感兴趣的:(Python进阶 生成器(Generators))