为了账号安全,请及时绑定邮箱和手机立即绑定

python yield函数深入浅出理解

标签:
Python

首先关于生成器的那些事:
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 5res=foo()
print('未加入for 循环时,yield输出是一个generator{}'.format(res))
print('用for将生成器调用')for item in res:

    print(item)

https://img1.sycdn.imooc.com//5b3f28db0001c00100030013.jpg

#实现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)

https://img1.sycdn.imooc.com//5b3f29050001d8a207200220.jpg

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


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消