Python学习day12(生成器,列表/生成器推导式)
生成器
初始生成器
我們知道的迭代器有兩種:一種是調用方法直接返回的,一種是可迭代對象通過執行iter方法得到的,迭代器有的好處是可以節省內存。
如果在某些情況下,我們也需要節省內存,就只能自己寫。我們自己寫的這個能實現迭代器功能的東西就叫生成器。
Python中提供的生成器:
1.生成器函數:常規函數定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回一個結果,在每個結果中間,掛起函數的狀態,以便下次重它離開的地方繼續執行
2.生成器表達式:類似于列表推導,但是,生成器返回按需產生結果的一個對象,而不是一次構建一個結果列表
生成器Generator
本質:迭代器(所以自帶了__iter__方法和__next__方法,不需要我們去實現)
特點:惰性運算,開發者自定義
生成器函數
一個包含yield關鍵字的函數就是一個生成器函數。yield可以為我們從函數中返回值,但是yield又不同于return,return的執行意味著程序的結束,調用生成器函數不會得到返回的具體的值,而是得到一個可迭代的對象。每一次獲取這個可迭代對象的值,就能推動函數的執行,獲取新的返回值。直到函數執行結束。
import time def genrator_fun1():a = 1print('現在定義了a變量')yield ab = 2print('現在又定義了b變量')yield bg1 = genrator_fun1() print('g1 : ',g1) #打印g1可以發現g1就是一個生成器 print('-'*20) #我是華麗的分割線 print(next(g1)) time.sleep(1) #sleep一秒看清執行過程 print(next(g1))生成器有什么好處呢?就是不會一下子在內存中生成太多數據
假如我想讓工廠給學生做校服,生產2000000件衣服,我和工廠一說,工廠應該是先答應下來,然后再去生產,我可以一件一件的要,也可以根據學生一批一批的找工廠拿。
而不能是一說要生產2000000件衣服,工廠就先去做生產2000000件衣服,等回來做好了,學生都畢業了。。。
send
def generator():print(123)content = yield 1print('=======',content)print(456)yield2g = generator() ret = g.__next__() print('***',ret) ret = g.send('hello') #send的效果和next一樣 print('***',ret)#send 獲取下一個值的效果和next基本一致 #只是在獲取下一個值的時候,給上一yield的位置傳遞一個數據 #使用send的注意事項# 第一次使用生成器的時候 是用next獲取下一個值# 最后一個yield不能接受外部的值列表推導式和生成器表達式
l = [i for i in range(10)] print(l) l1 = ['選項%s'%i for i in range(10)] print(l1)1.把列表解析的[]換成()得到的就是生成器表達式
2.列表解析與生成器表達式都是一種便利的編程方式,只不過生成器表達式更節省內存
3.Python不但使用迭代器協議,讓for循環變得更加通用。大部分內置函數,也是使用迭代器協議訪問對象的。例如, sum函數是Python的內置函數,該函數使用迭代器協議訪問對象,而生成器實現了迭代器協議,所以,我們可以直接這樣計算一系列值的和:
sum(x ** 2 for x in range(4)) posted on 2018-08-25 17:29 SunnyHu 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/hyg19910701/p/9534774.html
總結
以上是生活随笔為你收集整理的Python学习day12(生成器,列表/生成器推导式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浦发美运新贵白金卡年费多吗?年费多少?
- 下一篇: Python学习笔记_1_基础_2:数据