亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

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下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消