python高階函式中乙個容易犯的錯

2021-09-19 08:23:40 字數 1092 閱讀 9063

python對函式式程式設計有一定的支援,具體表現在高階函式,map,reduce,filter,partial function等幾個方面。在應用函式式程式設計中,需要關注函式式程式設計中的變數不變性,惰性計算等原則,否則容易踩到坑。

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)

這段**本意在於返回乙個素數列表,但實際在執行中返回的並不是想要的。究其原因,在於filter的惰性計算以及lambda匿名函式的閉包特性。上面的**中,n是乙個變數,lambda匿名函式只有在next(f())時才會真正呼叫,而此時,n的值已經是當前n的值,而不是之前的值了,比如9,應當是3的倍數,但此時n的值並不是3,導致9%n>0成立。

要修改這段**,乙個方法是利用lambda的閉包,避開n變數,生成乙個和n無關的函式。

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)是實時呼叫的,返回乙個和n無關的函式,這樣在next惰性呼叫時,就不會出錯。

類似的錯誤在返回函式的高階函式中也容易出錯,如果返回的函式和乙個變數繫結了,就會出現問題,解決的方法都是一樣,增加乙個閉包函式,使得返回函式和變數無關。

PHP中乙個好用的函式parse url

php 中乙個好用的函式parse url,特別方便用來做資訊抓取的分析,舉例子如下 url parts parse url url 輸出 又如 輸出 可以看到,可以很容易分解出乙個url的各個部,那如果要拿指定的部分出來的話也很容易,如 echo parse url url,php url pat...

C 類中乙個構造函式呼叫另乙個建構函式

class a a int aa,int bb,int cc 上面類中,已經有乙個建構函式,形參有兩個,我們又過載乙個有3個形參的建構函式,為了減少 量,就想著讓3個引數的構造函式呼叫2個引數的建構函式,然後在執行一些自己的 這就如同派生類先呼叫基類的同名函式,在執行自己特有的 這種機制如何實現呢?...

C 中乙個函式作為作為另乙個函式的引數

把函式名作為引數就是函式的位址了.要將函式名作為引數,需要使用函式指標。函式指標的定義格式為 ret type var name arg list 表示返回值為ret type,引數列表為arg list的函式指標var name.如int p int,int 表示返回值為int,引數為兩個int型...