优雅的迭代之生成器与迭代器——python进阶知识

什么是生成器

提到生成器就不得不提到循环,在python中之所以会出现生成器这个东西,就是因为在循环中可能出现循环占用太多内存的问u题。当循环出现内存不足或者运行太慢时,可以考虑把它改造成一个生成器。

什么是生成器

生成器是一个函数。它可以逐步产生我们想要的值,而不需要一次性计算并返回所有结果。在这个函数中我们用一个循环并判断出想要的数据。同时在外面再用一个循环来接收生成器产生的想要的数据。它其实就是用于对循环进行控制,只生成循环中我们所需要的结果,生成完直接返回给循环的结果,中间不用内存存储。举个例子:

lists= []  # (在机器学习中)用于存储一个很大的数据集
for i in range(1000000):
    if i % 5 == 0:
        lists.append(i)

for i in items:
    print(i)

上面的例子中我们需要用一个列表来存储需要的数据,而当数据很大的时候就可能导致内存吃不消。那么下面看看如何用生成器解决这个问题:

def return_item():
    for i in range(100000):
        if i % 5 == 0:
            print("准备生成 i=%d" % i)
            yield i    # 这里就会返回给下面的 for 循环
            print("我又回到里面了")

for j in return_item():
    print("我接到了一个生成的结果 i=%d\n" % j)

初始化生成器

上面提到,生成器可以用来控制循环产生的结果。同样我们也可以在循环的初始化过程中对循环进行控制。

def return_item(init_value):
    tmp = init_value
    for item in range(300):
        if item == tmp:
            tmp *= 2
            yield item

for i in return_item(20):
    print(i)

通过改变生成器的参数,我们可以控制循环的初始化以及最终的结果!

什么是迭代器

迭代器是一个可以记住遍历的位置的对象,迭代器有两个基本的方法:iter() 和 next()。上面介绍的生成器本身也是一个迭代器,因为它可以逐步迭代数值。举个迭代器的例子:

lists = [1, 2, 3, 4, 5]
iter = iter(lists)    # 创造迭代器对象
print(next(iter))    # 进行迭代,5
print(next(iter))    # 进行迭代,4
print(next(iter))    # 进行迭代,3

实例:斐波那契数列

import sys

def feibonaqi(n):
    # 定义生成器函数
    a, b, counter = 0, 1, 0    # 前一个数;后一个数;加到第几个数
    while True:
        if counter > n:
            return    # 已经加到第n个数则退出 
        yield a    # 先返回最新的和
        a , b = b, a+b     # 更新前一个数和后一个数
        counter += 1
       
f = feibonaqi(10)

while True:
    try:
        print(next(f), end = '\n')
    except StopIteration
        sys.exit

你可能感兴趣的:(信息管理科研入门必备技能,#,python进阶知识,python,生成器,迭代器,迭代,python进阶知识)