第四十六節,生成器函數和迭代器

生成器函數python

生成器函數就是經過特殊改裝過的函數函數

yield函數關鍵字,只要函數裏寫了yield關鍵字,這個函數就叫作生成器函數spa

執行函數內部是一旦遇到yield關鍵字會自動退出函數code

生成器函數返回的是一個生成器對象對象

#!/usr/bin/env python
# -*- coding:utf8 -*-
def asd():
    print(1)
    yield 1
    print(2)
    yield 2
    print(3)
    yield 3
    print(4)
    yield 4
a = asd()
print(a)
# 輸出
# <generator object asd at 0x0000008903305990>

 

__next__()獲取生成器方法blog

功能:__next__()用於執行生成器函數裏yield關鍵字以前的代碼,和返回yield關鍵字的返回值也就是去函數裏找yield關鍵字來執行yield以前的代碼,一旦遇到yield關鍵字,退出函數返回yield的返回值,若是沒有yield則報錯,注意函數裏有多個yield,只能獲取到第一個,由於函數執行內部時一旦遇到yield關鍵字就會退出函數,再次運用__next__方法時會從上一次yield退出的地方開始執行函數內部,再次遇到yield關鍵詞會再次退出,依次循環,  因此有幾個yield關鍵字,就能夠用幾個__next__方法來獲取和執行函數內部,generator

#!/usr/bin/env python
# -*- coding:utf8 -*-
def asd():
    print(11) #函數內部代碼
    yield 1  #yield關鍵字返回值
    print(22)
    yield 2
    print(33)
    yield 3
    print(44)
    yield 4
a = asd()
b = a.__next__()
print(b)

b = a.__next__()
print(b)
# 11  函數內部代碼
# 1   yield關鍵字返回值
# 22  函數內部代碼
# 2   yield關鍵字返回值

 

用生成器函數,生成0到5的數for循環

#!/usr/bin/env python
# -*- coding:utf8 -*-
def range_1(n): #建立生成器函數
    srt = 0 #定義一個值
    while True: #循環
        if srt > n: #判判定義值大於接收值時
            return #定義值大於接收值時退出整個函數
        yield srt #yield關鍵字返回yield值
        srt += 1 #每一次循環讓定義值加1
a = range_1(5)
b1 = a.__next__() #__next__方法獲取第一次循環的yield返回值
b2 = a.__next__() #__next__方法獲取第二次循環的yield返回值
b3 = a.__next__() #__next__方法獲取第三次循環的yield返回值
b4 = a.__next__() #__next__方法獲取第四次循環的yield返回值
b5 = a.__next__() #__next__方法獲取第五次循環的yield返回值
b6 = a.__next__() #__next__方法獲取第六次循環的yield返回值
print(b1,b2,b3,b4,b5,b6)
# 輸出
# 0 1 2 3 4 5

 

迭代器class

迭代器,就是能用生成器對象,從頭至尾迭代執行生成器函數內部獲得結果的方法object

__next__()方法迭代器

#!/usr/bin/env python
# -*- coding:utf8 -*-
"""生成器"""
def range_1(n): #建立生成器函數
    srt = 0 #定義一個值
    while True: #循環
        if srt > n: #判判定義值大於接收值時
            return #定義值大於接收值時退出整個函數
        yield srt #yield關鍵字返回yield值
        srt += 1 #每一次循環讓定義值加1
a = range_1(5)

"""迭代器"""
b1 = a.__next__() #__next__方法獲取第一次循環的yield返回值
b2 = a.__next__() #__next__方法獲取第二次循環的yield返回值
b3 = a.__next__() #__next__方法獲取第三次循環的yield返回值
b4 = a.__next__() #__next__方法獲取第四次循環的yield返回值
b5 = a.__next__() #__next__方法獲取第五次循環的yield返回值
b6 = a.__next__() #__next__方法獲取第六次循環的yield返回值
print(b1,b2,b3,b4,b5,b6)
# 輸出
# 0 1 2 3 4 5

for循環迭代器

for循環底層封裝的也是__next__()方法

#!/usr/bin/env python
# -*- coding:utf8 -*-
"""生成器"""
def range_1(n): #建立生成器函數
    srt = 0 #定義一個值
    while True: #循環
        if srt > n: #判判定義值大於接收值時
            return #定義值大於接收值時退出整個函數
        yield srt #yield關鍵字返回yield值
        srt += 1 #每一次循環讓定義值加1
a = range_1(5)

"""迭代器"""
for i in a: #用for迭代循環出生成器對象裏的數據
    print(i) #每一次循環打印出數據
# 輸出
# 0
# 1
# 2
# 3
# 4
# 5
相關文章
相關標籤/搜索