一、什麼是生成器
可以理解為是一種資料型別,這種資料型別自動實現了迭代器協議(其他資料型別需要呼叫自身內建的__iter__方法),所以生成器是可迭代物件。
二、生成器分類及在python中的表現形式
1、生成器函式:
常規函式定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回乙個結果,在每個結果中間,掛起函式狀態,以便下次從它離開的地方繼續執行。
def test():
yield 1
g = test()
print(g)
print(g.__next__())
1
不同於return可以yield多個值,因為是可迭代物件所以有next方法
2、生成器表示式:類似於列表推導,但是生產器返回按需要產生結果的乙個物件,而不是一次構建乙個結果列表。
三、三元表示式,如果表示式成立返回前面的值否則返回後面的值
name='zhangsan'
print('sb' if name == 'zhangsan' else '帥哥')
四、列表表示式。
#使用for迴圈實現生雞蛋
egg_list=
for i in range(10):
print(egg_list)
#使用列表表示式生雞蛋
l=['雞蛋%s'%i for i in range(10) ]
print(l)
['雞蛋0', '雞蛋1', '雞蛋2', '雞蛋3', '雞蛋4', '雞蛋5', '雞蛋6', '雞蛋7', '雞蛋8', '雞蛋9']
['雞蛋0', '雞蛋1', '雞蛋2', '雞蛋3', '雞蛋4', '雞蛋5', '雞蛋6', '雞蛋7', '雞蛋8', '雞蛋9']
使用for迴圈和列表表示式生成是結果是一樣的
使用三元表示式加乙個if判斷條件(三元表示式可以是三元也可以是二元,但是不能是四元)
l=['雞蛋%s'%i for i in range(10) if i>5]
print(l)
['雞蛋6', '雞蛋7', '雞蛋8', '雞蛋9']
以上使用表示式生成的列表直接在記憶體中,可以使用生成器表示式
egg_list=['雞蛋%s'%i for i in range(10)]
laomuji=('雞蛋%s'%i for i in range(10))
print(laomuji)
print(next(laomuji)) #next的本質就是呼叫__next__
print(laomuji.__next__())
print(next(laomuji))
at 0x000001d39c97f3b8>
雞蛋0雞蛋1
雞蛋2
ps 不能無限制的next,因為定義生產器的時候定義了範圍0-9,所以最多九個雞蛋
總結:1、列表解析的換成()得到的就是生產器表示式
2、列表解析和生成器表示式都是一種便利的程式設計方式,只不過生產器表示式跟節省空間
3、python不但可以通過迭代器協議讓for迴圈變得更加通用。大部分內建函式,也是使用迭代器協議訪問物件的。列如,sum函式是python的內建函式,該函式使用迭代器協議訪問物件,而生成器實現了迭代器協議,所以,我們可以直接計算一系列的和。
print(sum( i for i in range(10)))
45
ps 生成器只能遍歷一次,(for、next、list等操作均為遍歷),一次遍歷以後裡面的值為空了
#定義生成器函式遍歷0 1 2 3
def test():
for i in range(4):
yield i
#生成器函式執行賦值給t
t=test()
#列表表示式賦值
t1=(i for i in t)
t2=(i for i in t1)
print(t1)
#遍歷輸出[0, 1, 2, 3]
print(list(t1))
#因為t1已經遍歷過一次了使用遍歷t2輸出為乙個空列表
print(list(t2))
at 0x0000020a158d3938>
[0, 1, 2, 3]
三元運算,生成器表示式,列表解析
生成器是可迭代物件,可以理解成為一種資料型別,這種資料型別自動實現了迭代器協議 其他的資料型別需要呼叫自己內建的 iter 方法 在python中有兩種表現形式,一種是以函式的形式yield 二是生成器表示式 yield 函式 def test yield 1g test print g 輸出乙個生...
三元運算,列表解析,生成器表示式
一,生成器就是可迭代物件,可以理解為一種資料型別,這種資料型別自動實現了迭代器協議。1.生成器函式 常規函式定義,但是使用yield語句而不是return語句,yield可以返回多個值。可以保留函式的執行狀態。2.第二行的式子稱為 三元表示式 沒有四元表示式,可以兩元 name alex res h...
190329迭代器 生成器 三元運算 列表解析
可迭代物件 遵循迭代器協議,即可迭代物件,可以被for迴圈的就是可迭代物件 l iter l l.iter 將列表轉換為迭代器 print iter l.next print next iter l 1 生成器函式def f for i in range 10 yield i t f print t...