python筆記25_yield關鍵字

主要內容:

  • 小目標:掌握生成器函數
  • 主要內容:yield關鍵字使用

若是看完這篇文章,你仍是弄不明白yield,
你來找我,我保證不打你,我給你發100的大紅包。python

1. 一個需求

想要產生一個無窮的可迭代對象,每次生成一個隨機數;
問題:使用while循環,存放到列表中,內存有限,不可行dom

2. yield關鍵字

生成器函數:python中帶yield關鍵字函數,成爲生成器函數
一個例子:ide

import random 
def genRandom():
    #yield關鍵字
    yield random.randint(0,1000)

#genRandom的返回值不是None,
#genfunc是一個:generator,生成器
genfunc = genRandom()
print(type(genfunc))
#genfunc使用next調用,返回產生的隨機數
r = next(genfunc)
print(r)

結果:函數

<class 'generator'>
803

分析:genfunc爲生成器對象;調試

3 生成器函數調用分析

加入調試信息,觀察生成器函數執行過程code

import random 
def genRandom():
    #yield關鍵字
    r = random.randint(0,1000)
    print('befor yield')
    yield r
    print('after yield')
genfunc = genRandom()
  • 第一次調用:
    print(next(genfunc))

    結果:沒有執行:print('after yield')對象

    befor yield
    726

    分析:調用yield以後,返回產生隨機數:314,而後中止內存

  • 再次執行:
    print(next(genfunc))

    結果:generator

    after yield
    StopIteration  Traceback (most recent call last)

    分析:執行yield下一條語句,並報異常。
    緣由:經過異常告知調用者,生成器執行結束;
    若是想要再次執行生成器,必須從新建立生成器對象。it

4. 函數中添加多個yield

一個例子:

import random 
def genRandom():
    print('--->1')
    yield random.randint(0,1000)
    print('--->2')
    yield random.randint(0,1000)
    print('--->3')

genfunc = genRandom()
next(genfunc)
next(genfunc)
next(genfunc)

結果:最後一次調用報異常;

--->1
--->2
--->3
StopIteration:

5. 使用for循環遍歷生成器

genfunc = genRandom()
for item in genfunc:
    print(item)

結果:沒有問題,由於for循環處理了StopIteration異常

--->1
728
--->2
192
--->3

再次調用:

for item in genfunc:
    print(item)

沒有任何結果,

  • 注意:

    1.生成器函數內部yield都執行完以後,不能再次使用;
    2.須要從新建立新的生成器對象

6.無限的生成器函數

代碼:

import random 
def genRandom():
    #yield關鍵字
    while True:
        r = random.randint(0,1000)
        print('befor yield')
        yield r
        print('after yield')

genfunc = genRandom()
for i in range(10):
    print(next(genfunc))
for i in range(10000):
    print(next(genfunc))

結果:能夠看到,能夠產生無窮盡的隨機數

7.yield關鍵字總結

1.帶yield關鍵字的函數,返回生成器對象;2.yield關鍵字保存程序運行上下文3.生成器能夠經過for或者next進行調用,注意異常處理;4.生成器對象執行完,須要從新建立生成器對象

相關文章
相關標籤/搜索