10.2生成器

生成器

列表表達式回顧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())

你們對內容有任何問題,歡迎留言,定在第一時間解答,謝謝你們!內存

相關文章
相關標籤/搜索