10.2生成器
阿新 • • 發佈:2018-03-30
Python 生成器 創建生成器 執行生成器 生成器
列表表達式回顧
# -*-coding:utf-8 -*-
__date__ = ‘2018/3/5‘
__author__ = ‘xiaojiaxin‘
__file_name__ = ‘生成器‘
#a1=[x*2 for x in range(10000000000)] #全部加載至內存,列表表達式
生成器創建的兩種方法
a=(x*2 for x in range(5))
print(a)
# <generator object <genexpr> at 0x000000E29B512990>
#裏面沒有值!!!!生成器只是一個對象
生成器執行的兩種方法
#就比如說列表和元組等都是菜,想吃就直接吃,生成器只是一個廚師,他會做菜,但是你要吃哪道菜,他才會去加載那一道菜 #第一種方法:使用內置方法 print(a.__next__()) #0 print(a.__next__()) #2 print(a.__next__()) #4 #第二種方法:使用next()方法 print(next(a)) #等價於Python2.x a.next() #6 print(next(a)) #8 # print(next(a)) #報警:停止叠代 # #StopIteration # print(next(a)) #生成器就是一個可叠代對象(iteration叠代)
#for內部對b做了next()調用,之前的數據作為垃圾回收了
#for循環檢測是否還有數據,及時結束next()調用
b=(x for x in range(10))
for i in b: #for內部對b做了next()調用,之前的數據作為垃圾回收了
print(i) #for循環檢測是否還有數據,及時結束next()調用
#生成器一共兩種創建方式
#第一種:(x for x in range(5))
#第二種:yield
生成器函數與普通函數的區別
def foo(): print("haha") return 1 foo() #haha print(foo()) #執行函數,並返回返回值 #haha #1 print(foo) # <function foo at 0x000000A30D962E18>
def fou(): print("123") yield 2 #只要有yield就是生成器對象 print("456") yield 4 fou() # #空表示沒有執行fou()函數 print(fou()) #不執行函數,不返回函數返回值 # <generator object fou at 0x00000092754D2A40> print(fou) # <function fou at 0x000000A823DBD158> #fou()是一個生成器對象 #有一個yield就只有一道菜,有多個yield就有多道菜 next(fou()) #執行fou()生成器對象 #123 next(fou())
大家對內容有任何問題,歡迎留言,定在第一時間解答,謝謝大家!
10.2生成器