写点什么

python 小知识 -rethinking python 生成器

作者:AIWeker
  • 2022 年 7 月 18 日
  • 本文字数:649 字

    阅读完需:约 2 分钟

python小知识-rethinking python 生成器

前面我们分享过 python 迭代器,这里要说的生成器是一种特殊的迭代器。 普通的迭代器的迭代对象是完全加载到内存中;而生成器的迭代对象不是一次性生成好的,而是迭代对象使用的时候才具体生成。


创建生成器主要通过yield关键字来创建,我们具体看下生成器到底有哪里不同


def get_data(data):    for i in data:        yield i+2        print('print', i)
data = [1, 3, 4]g = get_data(data)type(g)# generator
for i in g: print(i)
# 3# print 1# 5# print 3# 6# print 4
复制代码


从上面可知,yield 一个迭代对象的一个元素返回值,使用上和普通迭代器没什么区别。


def get_data(data):    for i in data:        yield i+2        print('print', i)
data = [1, 3, 4]g = get_data(data)type(g)# generator
next(g)# 3
next(g)# print 1# 5
next(g)# print 3# 6
复制代码


从 next()函数的结果来看,在迭代对象时,遇到 yield 时会暂停,等下一次迭代对象时,继续执行后续的逻辑。


也就是说,python 解释器在遇到 yield 的会生成一个 generator,等迭代的时候才一个一个执行迭代对象。


so what? 这个有什么用?


前面的例子中生成器函数,输入的参数是比较小的数据,如果输入的比较大的数据,内存一次性装不下的数据,要如何进行遍历,比如 100w 个图片数据?


这个时候生成器函数就起到了用时才调用才使用的原则,不需要一次性装入所有数据。


具体参见如下:


import cv2def get_data(img_file_list):    for img_file in img_file_list:        img = cv2.imread(img_file)        yield img
复制代码





发布于: 刚刚阅读数: 6
用户头像

AIWeker

关注

公众号:人工智能微客(aiweker) 2019.11.21 加入

人工智能微客(aiweker)长期跟踪和分享人工智能前沿技术、应用、领域知识,不定期的发布相关产品和应用,欢迎关注和转发

评论

发布
暂无评论
python小知识-rethinking python 生成器_Python_AIWeker_InfoQ写作社区