python yield函数深入浅出理解

首先关于生成器的那些事: 1.通常的for…in…循环中,in后面是一个数组,这个数组就是一个可迭代对象,类似的还有链表,字符串,文件。它的缺陷是所有数据都在内存中,如果有海量数据的话将会非常耗内存。 它可以是mylist = [1, 2, 3],也可以是mylist = [x*x for x in range(3)]。 *它的缺陷是所有数据都在内存中,如果有海量数据的话将会非常耗内存。 2.生成器是可以迭代的,但只可以读取它一次。因为用的时候才生成。比如 mygenerator = (x*x for x in range(3)),注意这里用到了(),它就不是数组,而上面的例子是[]。 3.生成器(generator)能够迭代的关键是它有一个next()方法,工作原理就是通过重复调用next()方法,直到捕获一个异常。

yield的那些事 1.带有 yield 的函数不再是一个普通函数,而是一个生成器generator,可用于迭代,工作原理同上。 2.yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值。重点是:下一次迭代时,从上一次迭代遇到的yield后面的代码(下一行)开始执行。 3.简要理解:yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始。 4.带有yield的函数不仅仅只用于for循环中,而且可用于某个函数的参数,只要这个函数的参数允许迭代参数。比如array.extend函数,它的原型是array.extend(iterable)。

python案例:

#!usr/bin/env python
#_*_ coding:utf-8 _*_

#foo测试yield生成器原理
def foo():
    yield 1
    yield 2
    yield 3
    yield 4
    yield 5
res=foo()
print('未加入for 循环时,yield输出是一个generator{}'.format(res))
print('用for将生成器调用')
for item in res:

    print(item)
#实现yield,读取文本位置
def yieldreadlines():
    '''
    以下是seek()方法的语法:
    fileObject.seek(offset[, whence])
    参数:offset -- 这是在文件中,读/写指针的位置。
        whence -- 这是可选的,默认为0,这意味着绝对的文件定位,其它的值是1,这意味着寻求相对于当前位置,2表示相对于文件的末尾
    '''
    #定义seek
    seek =0
    while True:
        with  open('yieldreadlines.txt','r') as f:
            f.seek(seek) #起始位置
            data=f.readline()
            if data:  #TRUE
                #tell():返回文件读取指针的位置
                seek =f.tell()
                yield data
            else:
                return #return 退出当前yieldreadlines函数

for item in yieldreadlines():
    print(item)

通常yield用在线程池或者程序运行过程中避免阻塞,

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习算法与Python学习

简单易用NLP框架Flair发布新版本!(附教程)

Flair 是 Zalando Research 开发的一款简单易用的 Python NLP 库,近日,Flair 0.4 版发布!

16640
来自专栏生信小驿站

Python从零开始第三章数据处理与分析python中的dplyr(4)目录

可以使用separate(column,into,sep =“[\ W _] +”,remove = True,convert = False,extra ='...

12420
来自专栏程序生活

Python 字符串切割 str.split()和re.split()

将一个字符串按找找某个字符进行分割,我们可以使用str.split(),也可以使用re.split(),相比之下re.split()更加灵活。我们下面看一个例子...

27020
来自专栏灯塔大数据

技术 | Python的从零开始系列连载(三十四)

为了解答大家学习Python时遇到各种常见问题,小灯塔特地整理了一系列从零开始的入门到熟练的系列连载,每周五准时推出,欢迎大家学积极学习转载~

14620
来自专栏AI科技评论

工具 | ImagePy——UI界面支持开放插件的Python开源图像处理框架

AI 科技评论按,ImagePy 是一款 python 开源图像处理框架,其 UI 界面支持开放插件。在 github:https://github.com/...

30820
来自专栏月色的自留地

从零开始学习PYTHON3讲义(十二)画一颗心送给你

上一节课我们主要讲解了数值计算和符号计算。数值计算的结果,很常用的目的之一就是用于绘制图像,从图像中寻找公式的更多内在规律。

33830
来自专栏机器学习算法与Python学习

教程 | 十分钟学会函数式 Python

函数式编程到底是什么?本文将详解其概念,同时分享怎样在 Python 中使用函数式编程。主要内容包括列表解析式和其他形式的解析式。

13330
来自专栏月色的自留地

从零开始学习PYTHON3讲义(十四)写一个mp3播放器

通常来说,Python解释执行,运行速度慢,并不适合完整的开发游戏。随着电脑速度的快速提高,这种情况有所好转,但开发游戏仍然不是Python的重点工作。 大多...

33840
来自专栏日常学python

一个机械生的Python转行自述

在此把这段转行经历发出来,给正在转行之路上努力着的小伙伴,做一个参考,只要你好好努力,工作肯定会有的。

1.4K40
来自专栏生信小驿站

Python从零开始第三章数据处理与分析python中的dplyr(5)目录

===============================================

11630

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励