一、生成器
我們知道的迭代器有兩種:一種是呼叫方法直接返回的,一種是可迭代物件通過執行iter方法得到的,迭代器有的好處就是節省記憶體。
如果某些情況下,我們需要節省記憶體,就只能自己寫。我們自己寫的這個能實現迭代器功能的東西就叫生成器。總而言之生成器就是我們自己寫的迭代器。
python中提供的生成器:
1.生成器函式:常見函式定義,但是使用yield語句而不是return語句返回結果。yield語句一次返回乙個結果,在每個結果中間,掛起函式狀態,以便下次從離開的地方繼續執行。個人理解就是有乙個記憶功能,會記住這次執行結束的狀態,然後下次執行的時候從這裡繼續,每次都是以此往復。
2.生成器表示式:類似於列表推導,但是生成器返回按需產生結果的乙個物件,而不是一次構建乙個結果列表。
生成器generator
本質:迭代器(所以自帶了__iter__和__next__方法)
特點:惰性運算、開發者自定義
二、生成器函式
乙個包含yield關鍵字的函式就是乙個生成器函式。yield可以為我們從函式中返回值,但是yield又不同於return,return的執行意味著程式的結束,呼叫生成器函式不會返回具體的值,而是得到乙個可迭代物件。每一次獲得這個可迭代物件的值,就能推動函式的執行,獲取新的返回值。直到函式結束。
importtime
defgenrator_fun1():
a = 1
print('
現在定義了a變數')
yield
a b = 2
print('
現在又定義了b變數')
yield
bg1 =genrator_fun1()
print('
g1 :
',g1) #
列印g1可以發現g1就是乙個生成器
print('
-'*20) #
我是華麗的分割線
(next(g1))
time.sleep(1) #
sleep一秒看清執行過程
print(next(g1))
生成器有什麼作用麼?
省記憶體
三、send
defgenerator():
print(123)
content = yield 1
print('
*****==
',content)
print(456)
yield2
g =generator()
ret = g.__next__
()print('
***'
,ret)
ret = g.send('
hello
') #
send的效果和next一樣
print('
***'
,ret)
#send 獲取下乙個值的效果和next基本一致##
使用send的注意事項
#第一次使用生成器的時候 是用next獲取下乙個值
#最後乙個yield不能接受外部的值
四、python的三大推導式
1.列表推導式和生成器表示式
l = [i for i in range(10)](l)l1 = ['
選項%s
'%i for i in range(10)]
print(l1)
1.把列表推導式的換成()就得到了生成器表示式(generator)
2.列表推導式與生成器表示式都是一種便利的程式設計方式,只不過生成器表示式更節省記憶體
3.python不但使用迭代器協議,讓for迴圈變得更加通用。大部分內建函式,也是使用迭代器協議訪問物件的。例如,sum函式是python的內建函式,該函式使用迭代器協議訪問物件,而生成器實現了迭代器協議,所以我們可以直接這樣計算一系列值的和:
sum(x ** 2 for x in range(4))
2.字典推導式
字典推導和列表推導的使用方法十分類似,只不過把改成了{}。上**:
dic_old =dic_new = # 變key和value的位置
(dic_new)
#執行結果
#
3.集合推導式
集合推導式有十分類似,唯一的區別就是集合使用{},上**:
set_test=(set_test)
#執行結果##
好像有問題哦,怎麼6個元素求冪之後丟了兩個,往下看↓
#請不要忘記集合是無序的並且會自動去重哦
生成器,生成器推導式和列表推導式
python社群,大部分生成器和迭代器是一種 生成器的本質是迭代器 唯一區別 生成器是我們自己用python 構建的資料結構 迭代器都是提供的,或者轉化得來的 生成器函式 生成器表示式 python提供的 yield 乙個next 對應乙個yield yield和下乙個yield中間有 的話只執行乙...
python生成器推導式
1.生成器推導式是繼列表推導式後的有一中python推導式,他比列表推導式速度更快,占用的記憶體也更少。2.使用生成器物件時,可以根據需要將他轉化為列表或者元組,也可以是喲個生成器對像 next 方法或內建函式next 進行遍歷,其具有惰性求值的特點,進行一次遍歷後便不能再次方位內部元素,即訪問一次...
python 生成器 推導式 遞迴
目錄3 遞迴 判斷乙個函式是否是生成器函式 只需看函式內部是否有yield 生成器函式 內部是否包含yield def func print f1 yield 1 print f2 yield 2 print f3 yield 100 print f4 只要有yield 函式內部 不會執行,返回乙個...