国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

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

booster / 3561人閱讀

摘要:究其原因,在于的惰性計(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

相關(guān)文章

  • [19051501]記錄一次日常的錯(cuò)

    摘要:隨后就進(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)...

    graf 評(píng)論0 收藏0
  • [翻譯]使用Python一步一步地來(lái)進(jìn)行數(shù)據(jù)分析

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

    forsigner 評(píng)論0 收藏0
  • 我是如何在自學(xué)編程9個(gè)月后找到工作的

    摘要:昨天在我在國(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)容,非常中肯,其中有不少建議也是我在編程教室...

    gaosboy 評(píng)論0 收藏0
  • python編碼的意義

    摘要:而他們的中文釋義,就是對(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)行自...

    e10101 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<