生成器函數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