日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python学习day12(生成器,列表/生成器推导式)

發(fā)布時(shí)間:2023/12/13 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python学习day12(生成器,列表/生成器推导式) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Python學(xué)習(xí)day12(生成器,列表/生成器推導(dǎo)式)

生成器

初始生成器

我們知道的迭代器有兩種:一種是調(diào)用方法直接返回的,一種是可迭代對象通過執(zhí)行iter方法得到的,迭代器有的好處是可以節(jié)省內(nèi)存。

如果在某些情況下,我們也需要節(jié)省內(nèi)存,就只能自己寫。我們自己寫的這個(gè)能實(shí)現(xiàn)迭代器功能的東西就叫生成器。

Python中提供的生成器:

1.生成器函數(shù):常規(guī)函數(shù)定義,但是,使用yield語句而不是return語句返回結(jié)果。yield語句一次返回一個(gè)結(jié)果,在每個(gè)結(jié)果中間,掛起函數(shù)的狀態(tài),以便下次重它離開的地方繼續(xù)執(zhí)行

2.生成器表達(dá)式:類似于列表推導(dǎo),但是,生成器返回按需產(chǎn)生結(jié)果的一個(gè)對象,而不是一次構(gòu)建一個(gè)結(jié)果列表

生成器Generator

本質(zhì):迭代器(所以自帶了__iter__方法和__next__方法,不需要我們?nèi)?shí)現(xiàn))

  特點(diǎn):惰性運(yùn)算,開發(fā)者自定義

生成器函數(shù)

一個(gè)包含yield關(guān)鍵字的函數(shù)就是一個(gè)生成器函數(shù)。yield可以為我們從函數(shù)中返回值,但是yield又不同于return,return的執(zhí)行意味著程序的結(jié)束,調(diào)用生成器函數(shù)不會得到返回的具體的值,而是得到一個(gè)可迭代的對象。每一次獲取這個(gè)可迭代對象的值,就能推動函數(shù)的執(zhí)行,獲取新的返回值。直到函數(shù)執(zhí)行結(jié)束。

import time def genrator_fun1():a = 1print('現(xiàn)在定義了a變量')yield ab = 2print('現(xiàn)在又定義了b變量')yield bg1 = genrator_fun1() print('g1 : ',g1) #打印g1可以發(fā)現(xiàn)g1就是一個(gè)生成器 print('-'*20) #我是華麗的分割線 print(next(g1)) time.sleep(1) #sleep一秒看清執(zhí)行過程 print(next(g1))

生成器有什么好處呢?就是不會一下子在內(nèi)存中生成太多數(shù)據(jù)

假如我想讓工廠給學(xué)生做校服,生產(chǎn)2000000件衣服,我和工廠一說,工廠應(yīng)該是先答應(yīng)下來,然后再去生產(chǎn),我可以一件一件的要,也可以根據(jù)學(xué)生一批一批的找工廠拿。
而不能是一說要生產(chǎn)2000000件衣服,工廠就先去做生產(chǎn)2000000件衣服,等回來做好了,學(xué)生都畢業(yè)了。。。

def produce():"""生產(chǎn)衣服"""for i in range(2000000):yield "生產(chǎn)了第%s件衣服"%iproduct_g = produce() print(product_g.__next__()) #要一件衣服 print(product_g.__next__()) #再要一件衣服 print(product_g.__next__()) #再要一件衣服 num = 0 for i in product_g: #要一批衣服,比如5件print(i)num +=1if num == 5:break
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 獲取下一個(gè)值的效果和next基本一致 #只是在獲取下一個(gè)值的時(shí)候,給上一yield的位置傳遞一個(gè)數(shù)據(jù) #使用send的注意事項(xiàng)# 第一次使用生成器的時(shí)候 是用next獲取下一個(gè)值# 最后一個(gè)yield不能接受外部的值

列表推導(dǎo)式和生成器表達(dá)式

l = [i for i in range(10)] print(l) l1 = ['選項(xiàng)%s'%i for i in range(10)] print(l1)

1.把列表解析的[]換成()得到的就是生成器表達(dá)式

2.列表解析與生成器表達(dá)式都是一種便利的編程方式,只不過生成器表達(dá)式更節(jié)省內(nèi)存

3.Python不但使用迭代器協(xié)議,讓for循環(huán)變得更加通用。大部分內(nèi)置函數(shù),也是使用迭代器協(xié)議訪問對象的。例如, sum函數(shù)是Python的內(nèi)置函數(shù),該函數(shù)使用迭代器協(xié)議訪問對象,而生成器實(shí)現(xiàn)了迭代器協(xié)議,所以,我們可以直接這樣計(jì)算一系列值的和:

sum(x ** 2 for x in range(4)) posted on 2018-08-25 17:29 SunnyHu 閱讀(...) 評論(...) 編輯 收藏

轉(zhuǎn)載于:https://www.cnblogs.com/hyg19910701/p/9534774.html

總結(jié)

以上是生活随笔為你收集整理的Python学习day12(生成器,列表/生成器推导式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。