python 生成器 yield

迭代器

在说生成器之前,我们先讲讲迭代器:
迭代器包括:list, set, dict等,一个比较明显的例子是都能用for in 的形式遍历;

def iter(n):
    i = 0
    l = []
    while i 1
    return l

for i in iter(3):
    print(i)

上述例子中,函数iter()会产生一个list,但大家都知道,如果我们把形参n设置得非常大,那么list会占用很大的资源;

生成器

生成器就是为了解决迭代器占用空间大的问题。

def generator(n)
    i = 0
    while i<n:
        # 生成器
        yield i
        i+=1
for i in generator(3):
    print(i)

上述代码使用了生成器,生成器不会一次行产生数组,而是在遍历的时候逐个产生,这样就节省了大量空间。

需要注意的是,生成器是不可复用的:

# 迭代器可以复用
l = iter(10)
for i in l:
    # 输出0-9
    print(i)
for i in l:
    print(i)
    # 再次输出0-9

# 生成器不可以复用
g = generator(10)
for i in g:
    # 输出0-9
    print(i)
for i in g:
    # 无输出,由于生成器在使用后会被抛弃。类似指针指向了最末尾,使用完后没有重置到起始位置。

你可能感兴趣的:(python)