摘要:究其原因,在于的惰性計(jì)算以及匿名函數(shù)的閉包特性。上面的代碼中,是一個(gè)變量,匿名函數(shù)只有在時(shí)才會(huì)真正調(diào)用,而此時(shí),的值已經(jīng)是當(dāng)前的值,而不是之前的值了,比如,應(yīng)當(dāng)是的倍數(shù),但此時(shí)的值并不是,導(dǎo)致成立。
問(wèn)題
python對(duì)函數(shù)式編程有一定的支持,具體表現(xiàn)在高級(jí)函數(shù),map,reduce,filter,partial function等幾個(gè)方面。在應(yīng)用函數(shù)式編程中,需要關(guān)注函數(shù)式編程中的變量不變性,惰性計(jì)算等原則,否則容易踩到坑。
def f(): def num_gen(): x = 2 while True: yield x x+=1 l=num_gen() while True: n = next(l) yield n l = filter(lambda x:x%n!=0,l) primes = f() for i in primes: print(i)
這段代碼本意在于返回一個(gè)素?cái)?shù)列表,但實(shí)際在運(yùn)行中返回的并不是想要的。究其原因,在于filter的惰性計(jì)算以及l(fā)ambda匿名函數(shù)的閉包特性。上面的代碼中,n是一個(gè)變量,lambda匿名函數(shù)只有在next(f())時(shí)才會(huì)真正調(diào)用,而此時(shí),n的值已經(jīng)是當(dāng)前n的值,而不是之前的值了,比如9,應(yīng)當(dāng)是3的倍數(shù),但此時(shí)n的值并不是3,導(dǎo)致9%n>0成立。
要修改這段代碼,一個(gè)方法是利用lambda的閉包,避開(kāi)n變量,生成一個(gè)和n無(wú)關(guān)的函數(shù)。
def f(): def g(n): return lambda x:x%n!=0 def num_gen(): x = 2 while True: yield x x+=1 l = num_gen() while True: n = next(l) yield n l = filter(g(n),l) primes = f() for i in primes: print(i)
這樣修改后,g(n)是實(shí)時(shí)調(diào)用的,返回一個(gè)和n無(wú)關(guān)的函數(shù),這樣在next惰性調(diào)用時(shí),就不會(huì)出錯(cuò)。
總結(jié)類(lèi)似的錯(cuò)誤在返回函數(shù)的高階函數(shù)中也容易出錯(cuò),如果返回的函數(shù)和一個(gè)變量綁定了,就會(huì)出現(xiàn)問(wèn)題,解決的方法都是一樣,增加一個(gè)閉包函數(shù),使得返回函數(shù)和變量無(wú)關(guān)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/45434.html
摘要:隨后就進(jìn)行了糾結(jié)現(xiàn)在都想敲死自己,應(yīng)該不用糾結(jié),在編輯器跑一遍,問(wèn)題就暴露出來(lái)了。至于為什么在服務(wù)器上沒(méi)有拋異常出來(lái),很可能是被框架給吃掉了,需要進(jìn)一步排查。 Parameter array not found. Available parameters are [collection, list] 莫名其妙,今天寫(xiě)代碼遇到個(gè)低級(jí)錯(cuò)誤,困擾了好久,測(cè)試突然給提了個(gè)缺陷,說(shuō)業(yè)務(wù)邏輯有問(wèn)...
摘要:原文鏈接譯文鏈接使用一步一步地來(lái)進(jìn)行數(shù)據(jù)分析翔你已經(jīng)決定來(lái)學(xué)習(xí),但是你之前沒(méi)有編程經(jīng)驗(yàn)。在我看來(lái)精通用開(kāi)發(fā)好的軟件才能夠高效地進(jìn)行數(shù)據(jù)分析,這觀點(diǎn)是沒(méi)有必要的。 原文鏈接:Step by step approach to perform data analysis using Python 譯文鏈接:使用Python一步一步地來(lái)進(jìn)行數(shù)據(jù)分析--By Michael翔 你已經(jīng)決定來(lái)學(xué)習(xí)P...
摘要:昨天在我在國(guó)外網(wǎng)站上看到一篇文章,作者分享了他自學(xué)編程個(gè)月后找到工作的經(jīng)歷。而本文中,我主要針對(duì)想要通過(guò)學(xué)習(xí)編程找工作的角度來(lái)談。我在年月犯了一個(gè)錯(cuò)誤我認(rèn)為首要任務(wù)是找到一份前端開(kāi)發(fā)的工作。 昨天在我在國(guó)外網(wǎng)站 reddit 上看到一篇文章,作者分享了他 自學(xué)編程 9 個(gè)月后找到工作 的經(jīng)歷。文章不到一天就得到3千多贊,2百條回復(fù)。我看了下內(nèi)容,非常中肯,其中有不少建議也是我在編程教室...
摘要:而他們的中文釋義,就是對(duì)新手的最大陷阱編碼。而碼,也就是美國(guó)信息交換標(biāo)準(zhǔn)碼,年發(fā)布,位字符編碼中影響最大的一種。 編碼,還是編碼! python2的直鉤——編碼異常 當(dāng)你用python打開(kāi)一篇中文文檔,準(zhǔn)備讀取里面的數(shù)據(jù)開(kāi)始實(shí)驗(yàn)...當(dāng)你處理好你的數(shù)據(jù),打算打印出易于閱讀的結(jié)果給boss檢查...甚至當(dāng)你剛剛開(kāi)始編寫(xiě)自己的代碼,就寫(xiě)了一句話... text = 什么鬼 只要你開(kāi)始運(yùn)行自...
閱讀 1684·2021-09-26 09:55
閱讀 3713·2021-09-22 15:31
閱讀 7330·2021-09-22 15:12
閱讀 2209·2021-09-22 10:02
閱讀 4625·2021-09-04 16:40
閱讀 1031·2019-08-30 15:55
閱讀 3018·2019-08-30 12:56
閱讀 1813·2019-08-30 12:44