既可以接收函式作為引數,也可以把函式作為返回值。
閉包:我們在函式lazy_sum
中又定義了函式sum
,並且,內部函式sum
可以引用外部函式lazy_sum
的引數和區域性變數,當lazy_sum
返回函式sum
時,相關引數和變數都儲存在返回的函式中,這種稱為「閉包(closure)」的程式結構擁有極大的威力。
當我們呼叫lazy_sum()
時,每次呼叫都會返回乙個新的函式,即使傳入相同的引數,也是不一樣的。
返回閉包時牢記一點:返回函式不要引用任何迴圈變數,或者後續會發生變化的變數。
list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
匿名函式lambda x:x*x其實就是
def f(x):
return x * x
關鍵字lambda
表示匿名函式,冒號前面的x
表示函式引數
匿名函式有個限制,就是只能有乙個表示式,不用寫return
,返回值就是該表示式的結果。
用匿名函式有個好處,因為函式沒有名字,不必擔心函式名衝突。此外,匿名函式也是乙個函式物件,也可以把匿名函式賦值給乙個變數,再利用變數來呼叫該函式,也可以把匿名函式作為返回值返回
return lambda:x*x+y*y函式物件可以被賦值給變數,通過這個變數也可以呼叫這個函式。
函式物件有乙個__name__
屬性,可以拿到函式的名字,對變數使用可知它對應的函式。
假設我們要增強now()
函式的功能,比如,在函式呼叫前後自動列印日誌,但又不希望修改now()
函式的定義,這種在**執行期間動態增加功能的方式,稱之為「裝飾器」(decorator)
本質上,decorator就是乙個返回函式的高階函式。所以,我們要定義乙個能列印日誌的decorator
def log(func):呼叫print('call %s():' % func.__name__)
return func(*args, **kw)
log是乙個裝飾器,所以接受乙個函式作為引數,並返回乙個函式。我們要借助python的@語法,把decorator置於函式的定義處
@log
def now():
print('2015-3-25')
now()
函式,不僅會執行now()
函式本身,還會在執行now()
函式前列印一行日誌:
>>> now()
call now():
2015-3-25
把@log
放到now()
函式的定義處,相當於執行了語句:
now = log(now)
也可以多層巢狀,傳入乙個text
int()
函式還提供額外的base
引數,預設值為10
。如果傳入base
引數,就可以做n進製的轉換
functools.partial
就是幫助我們建立乙個偏函式的,不需要我們自己定義int2()
,可以直接使用下面的**建立乙個新的函式int2
所以,簡單總結functools.partial
的作用就是,把乙個函式的某些引數給固定住(也就是設定預設值),返回乙個新的函式,呼叫這個新函式會更簡單。
固定函式引數的意思,當函式的引數個數太多,需要簡化時,使用functools.partial
可以建立乙個新的函式,這個新函式可以固定住原函式的部分引數,從而在呼叫時更簡單。
函式式程式設計(2)
1.find函式接受乙個集合和乙個謂詞函式,並返回該謂詞為true時的第乙個元素。例 find 1,2,3,4 function num 32.all函式接受乙個集合和乙個謂詞,當對於所以的元素謂詞函式都返回true時,返回true。例 all 2,4,6,8 function num true 判...
函式式程式語言python 函式式程式設計
函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programming,雖然也可以歸結...
Python函式式程式設計
python函式式程式設計的核心思想是 把函式當資料.所以,函式可以用作函式引數,函式返回值,元組或字典成員等 閉包閉包是實現 復用的一種途徑,與類不同的是它基於函式實現.函式與它的環境變數一起就構成了閉包,閉包只有乙個返回值,那就是閉包中的函式 def line conf a,b def line...