亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

python高階函數(shù)中一個容易犯的錯

booster / 3618人閱讀

摘要:究其原因,在于的惰性計算以及匿名函數(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

相關(guān)文章

  • [19051501]記錄一次日常的錯

    摘要:隨后就進行了糾結(jié)現(xiàn)在都想敲死自己,應該不用糾結(jié),在編輯器跑一遍,問題就暴露出來了。至于為什么在服務器上沒有拋異常出來,很可能是被框架給吃掉了,需要進一步排查。 Parameter array not found. Available parameters are [collection, list] 莫名其妙,今天寫代碼遇到個低級錯誤,困擾了好久,測試突然給提了個缺陷,說業(yè)務邏輯有問...

    graf 評論0 收藏0
  • [翻譯]使用Python一步一步地來進行數(shù)據(jù)分析

    摘要:原文鏈接譯文鏈接使用一步一步地來進行數(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...

    forsigner 評論0 收藏0
  • 我是如何在自學編程9個月后找到工作的

    摘要:昨天在我在國外網(wǎng)站上看到一篇文章,作者分享了他自學編程個月后找到工作的經(jīng)歷。而本文中,我主要針對想要通過學習編程找工作的角度來談。我在年月犯了一個錯誤我認為首要任務是找到一份前端開發(fā)的工作。 昨天在我在國外網(wǎng)站 reddit 上看到一篇文章,作者分享了他 自學編程 9 個月后找到工作 的經(jīng)歷。文章不到一天就得到3千多贊,2百條回復。我看了下內(nèi)容,非常中肯,其中有不少建議也是我在編程教室...

    gaosboy 評論0 收藏0
  • python編碼的意義

    摘要:而他們的中文釋義,就是對新手的最大陷阱編碼。而碼,也就是美國信息交換標準碼,年發(fā)布,位字符編碼中影響最大的一種。 編碼,還是編碼! python2的直鉤——編碼異常 當你用python打開一篇中文文檔,準備讀取里面的數(shù)據(jù)開始實驗...當你處理好你的數(shù)據(jù),打算打印出易于閱讀的結(jié)果給boss檢查...甚至當你剛剛開始編寫自己的代碼,就寫了一句話... text = 什么鬼 只要你開始運行自...

    e10101 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<