列表表達式回顧ide
# -*-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> #裏面沒有值!!!!生成器只是一個對象
生成器執行的兩種方法code
#就好比說列表和元組等都是菜,想吃就直接吃,生成器只是一個廚師,他會作菜,可是你要吃哪道菜,他纔會去加載那一道菜 #第一種方法:使用內置方法 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())
你們對內容有任何問題,歡迎留言,定在第一時間解答,謝謝你們!內存