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