python惰性函數 python惰性序列

Python學習之惰性求值

惰性求值,也就是延遲求值,表達式不會在它被綁定到變量之后就立即求值,而是等用到時再求值。這個特性可以解決一些巨大甚至無限的集合列表,如菲波那切數列、幾十G的文件等等。延遲求值的一個好處是能夠建立可計算的無限列表而沒有妨礙計算的無限循環或大小問題。

創新互聯建站堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都網站制作、成都做網站、企業官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯網時代的福貢網站設計、移動媒體設計的需求,幫助企業找到有效的互聯網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!

Python?中的很多方法沒有直接返回列表,而是返回了一個可迭代的generator

(生成器)對象,這便是python的惰性求值,因為在創建一個很大的列表時,對內存的開銷非常大,太大時python會直接報錯,舉個:chestnut::range()方法是產生一個指定范圍列表,在Python3之前,該方法直接產生一個列表,xrange()?產生一個生成器:

xrange(100)

xrange(100)

range(100)

[0, 1, 2, 3,

4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,

22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,

39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,

56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72,

73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,

90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

當參數里面的值足夠大時,range()產生了一個巨大的列表,這是內存會吃不消,等待一段時間后程序會直接被Kill掉:

for?i?in?range(999999999999):

...

print?i

...

Killed:

9

占滿內存

用xrange()?方法就不回出現這種問題,并且可以一直運行:

for?i?in?xrange(999999999999):

...

print?i

...

1

2

3

4

5

6

7

8

9

10...

在Python3中range已經被改為了xrange,所以在python3中可以放心使用range().

惰性求值不要求你事先準備好整個迭代過程中所有的元素。迭代器僅僅在迭代至某個元素時才計算該元素,而在這之前或之后,元素可以不存在或者被銷毀

還有前文所說的list comprehension語句,在兩邊放上[],會產生別表,如果數據源很長則會報內存錯誤:

print [i?for?i?in?range(9999999999999999)]

Python(1627,0x7fffe5b713c0)

malloc: *** mach_vm_map(size=80000000000000000) failed

(error?code=3)

***?error:

can't allocate region

***?set?a

breakpoint?in?malloc_error_break?to?debug

Traceback

(most recent?call?last):

File "",

line 1,?in?/spanmodule

MemoryError

這樣直接產生列表沒有效率,為了創建生成器對象,可以在list

comprehension兩邊放上(),這樣它就有了惰性求值的特性。

print((i?for?i

in?range(99999999999999)))

使用next()內建函數訪問生成器里的元素:

num =

(i?for?i?in?range(5))

num

next(num)

next(num)

1

for j in range(4):

...

print(next(num))

...

2

3

4

Traceback

(most recent call last):

File "",

line 2,?in?/spanmodule

StopIteration

當訪問到最后元素時,再調用next(),Python將會拋出StopIteration異常。Python正是根據是否檢查到這個異常來決定是否停止迭代。

step1 =

someLongOperation1()step2 = someLongOperation2()step3 =

concatenate(step1, step2)

以上代碼需要分別執行一二兩步操作,第三步用到一二兩步的結果,在Pyhton中會有序的執行這些函數:首先是?someLongOperation1,然后?someLongOperation2,最后?concatenate,如果確保沒有函數修改或依賴于全局變量,第一二步可以被并行執行。假設我們不想并行運行這兩個函數,我們只在其他函數依賴于?step1?和?step2?時才需要執行這兩個函數。我們甚至在concatenate?調用之前都不必執行他們,可以把他們的求值延遲到?concatenate?函數內實際用到他們的位置。如果函數中用到了if分支語句,條件無關step1和step2則可以盡量將判斷條件放前面以減少不必要的計算:

step1 =

someLongOperation1()

step2 =

someLongOperation2()if?condition:

step3 =

concatenate(step1, step2)

換為:if?condition:

step1 =

someLongOperation1()

step2 =

someLongOperation2()

step3 =

concatenate(step1, step2)

如果?concatenate?是一個帶有條件分支的函數并且有的分支中只用了兩個參數中的一個,另一個參數就永遠沒有必要被求值。

python 中 return lambda 怎么理解?

lambda或者高階函數是一種設計模式,是否適合應該要看更大范圍的設計需要。

脫離了需求場景,返回lambda根本是脫褲子放屁。

python中map函數

map在python2返回list,在python3返回iterator.

如果想在python3得到可以反復重用的list,只要把iterator轉成list即可:

lst_result?=?list(map(func,?items))

python惰性求值有哪些函數

Copyright ? 1999-2020, CSDN.NET, All Rights Reserved

惰性計算的序列

打開APP

Python 的惰性求值與惰性序列 翻譯

2018-07-23 14:57:48

2點贊

東師小鎮

碼齡5年

關注

惰性求值

在編程語言理論中,惰性求值(英語:Lazy Evaluation),又譯為惰性計算、懶惰求值,也稱為傳需求調用(call-by-need),是一個計算機編程中的一個概念,它的目的是要最小化計算機要做的工作。它有兩個相關而又有區別的含意,可以表示為“延遲求值”和“最小化求值”。

避免不必要的計算,帶來性能的提升(最小化求值)。

對于Python中的條件表達式 if x and y,在x為false的情況下y表達式的值將不再計算。而對于if x or y,當x的值為true的時候將直接返回,不再計算y的值。因此編程中可以利用該特性,在 and邏輯中,將小概率發生的條件放在前面或者在or邏輯中,將大概率發生的時間放在前面,有助于性能的提升。

2. 節省空間,使得無線循環的數據結構成為可能(延遲求值)。

延遲求值特別用于函數式編程語言中。在使用延遲求值的時候,表達式不在它被綁定到變量之后就立即求值,而是在該值被取用的時候求值。延遲求值的一個好處是能夠建立可計算的無限列表而沒有妨礙計算的無限循環或大小問題。例如,可以建立生成無限斐波那契數列表的函數(經常叫做“流”)。第n個斐波那契數的計算僅是從這個無限列表上提取出這個元素,它只要求計算這個列表的前n個成員。

惰性序列

Python的惰性序列多數指 iterator,其特點正如同上文所述,具有惰性計算特點的序列稱為惰性序列。

Python的iterator是一個惰性序列,意思是表達式和變量綁定后不會立即進行求值,而是當你用到其中某些元素的時候才去求某元素對的值。 惰性是指,你不主動去遍歷它,就不會計算其中元素的值。

一句話理解:

迭代器的一個優點就是它不要求你事先準備好整個迭代過程中所有的元素。

迭代器僅僅在迭代至某個元素時才計算該元素,而在這之前或之后,元素可以不存在或者被銷毀。

這個特點使得它特別適合用于遍歷一些巨大的或是無限的集合,比如幾個G的文件,或是斐波那契數列等等。

新聞標題:python惰性函數 python惰性序列
地址分享:http://m.kartarina.com/article34/hgpdse.html

成都網站建設公司_創新互聯,為您提供網站收錄云服務器網站導航軟件開發定制開發品牌網站設計

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網頁設計公司
主站蜘蛛池模板: 综合国产在线观看无码| 午夜寂寞视频无码专区| 亚洲av无码潮喷在线观看| 无码人妻AV一二区二区三区| 未满十八18禁止免费无码网站 | 中文字幕日韩精品无码内射| 东京热人妻无码一区二区av| 中文字幕精品三区无码亚洲 | 亚洲AV永久无码精品| 制服在线无码专区| 成人av片无码免费天天看| 无码人妻丰满熟妇区免费| 无码任你躁久久久久久久 | 黑人无码精品又粗又大又长| 亚洲av无码一区二区乱子伦as| 亚洲爆乳少妇无码激情| 日本无码色情三级播放| 无码国产精品一区二区免费I6| 国产AV无码专区亚洲AVJULIA | 无码国产精品一区二区免费虚拟VR| 无码国模国产在线观看| 亚洲av福利无码无一区二区| 无码精品人妻一区二区三区影院| 无码人妻一区二区三区免费n鬼沢 无码人妻一区二区三区免费看 | 无码性午夜视频在线观看| 国产免费av片在线无码免费看| 精品无码久久久久久尤物| 国产成人精品无码一区二区三区| 无码无套少妇毛多69XXX| 亚洲成av人片天堂网无码】 | 亚洲一本大道无码av天堂 | 97免费人妻无码视频| 亚洲午夜无码久久久久| 人妻少妇无码视频在线| 亚洲中文无码卡通动漫野外| 精品无码无人网站免费视频| 久久人妻内射无码一区三区 | 激情无码人妻又粗又大| 亚洲成?v人片天堂网无码| 高清无码一区二区在线观看吞精| 18精品久久久无码午夜福利|