高階函式
f = abs
print(f(-10))
defshowtime
(x, f):
print(f(x))
defmain
(): showtime(-20, abs)
main()
通過以上的**,我們發現函式名,就是乙個指向函式的指標。如果熟悉c語言,我們其實可以知道以f()方式來呼叫函式僅僅是乙個語法糖,實際上也是通過指標來訪問的。map/reduce
def
f(x):
return x * x
r = map(f, [1, 2, 3, 4, 5, 6])
rlist = list(r)
print(rlist)
上面的**可以看到,map接收兩個引數,乙個是乙個函式,乙個是iterable。可以對元素進行同樣的處理。
def
add(x, y):
return x * 10 + y
from functools import reduce
result = reduce(add, [1, 2, 3, 4, 5])
print(result)
reduce 函式的引數同樣是兩個,乙個是函式,乙個是序列。可以把要做的操作迭代在每個元素上,上面的語句等同於:filterf(f(f(f(1, 2), 3), 4), 5)
def
is_odd
(x):
return x % 2 == 0
list = list(filter(is_odd, [1, 2, 3, 4, 5, 6, 7]))
print(list)
通過上面的**,我們可以觀察到,filter同樣傳入乙個函式,和乙個序列。上述**輸出後,我們可以得到這樣的結論:對於filter函式,它是把序列中的元素,根據傳入函式返回值為true/false來進行篩選。
def
_odd_list
(): n = 1
while
true:
n = n + 2
yield n
def_no_division
(n):
return
lambda x: x % n > 0
defprimes
():yield
2 it = _odd_list()
while
true:
n = next(it)
yield n
it = filter(_no_division(n), it)
for n in primes():
if n < 1000:
print(n)
else:
break
返回函式
python可以把函式作為返回值返回
def
do_later
(*arg):
defsum
(): sum = 0
for element in arg:
sum += element
return sum
return sum
f = do_later(1, 2, 3, 4, 5)
print(f())
上面的**,把sum函式作為返回值返回給呼叫者,這個方式,導致呼叫do_later方法時不是立馬進行計算,而是在實際執行f()方法的時候,才會進行計算。這樣的方式叫做閉包。這個方式用起來很酷,但是同時要注意可能存在的問題:
def
do_later
(): fs =
for i in range(3):
defmultiply
():return i * i
return fs
f1, f2, f3 = do_later()
print(f1())
print(f2())
print(f3())
輸出:lambda4 4
4通過上面的例子,我們可以看到裡面存在的問題。也很好理解,函式也是存在記憶體中的一段指令,裡面所用到的引數值,也是通過同樣的方式來儲存的。在上面,f1/f2/f3都利用了i這個引數,但是隨著迭代,i的值發生了變化,所以在真正呼叫執行函式的時候,輸出的結果都是4。
通過lambda關鍵字,我們可以宣告匿名函式。
f = lambda x: x * x
print(f)
print(f(4))
f = lambda x, y: x * y
print(f)
print(f(4, 3))
通過上面的**,我們總結如下結論:偏函式1. lambda後的識別符號為函式的引數
2. 不需要提供return語句,後面的表示式即為返回的內容。
print(int('3421', base=16))
print(int('3421', 16))
import functools
int16 = functools.partial(int, base=16)
print(int16('3421'))
defmultiply
(x, y):
return x * y
multiply10 = functools.partial(multiply, y = 10)
multiply2 = functools.partial(multiply, x = 2)
print(multiply10(10))
print(multiply2(y=4))
# 會報錯
print(multiply2(4))
通過上面的**,我們通過functools.partial,將某個函式的引數設定為乙個固定值,這樣可以滿足對某些特定意義的函式要求,很方便的進行呼叫。會報錯的語句是因為賦值是按照順序來的,multiply2的時候,x已經有固定值為2,按照順序,呼叫語句會再給x做一次賦值,這一次是4,導致typeerror: multiply() got multiple values for argument 『x』裝飾器
def
printname
(): print('sherlock blaze')
有上述函式定義,當我們想在輸出sherlock blaze 之前,輸出一些日誌,比如先輸出,who』s the most handsome man。但是又不想修改printname函式的定義,這個時候,我們可以通過裝飾器來包裝一下這個函式,達到我們想要的效果。
def
log(func):
def(*arg, **kw):
print('who\'s the most handsome man.')
return func(*arg, **kw)
@log
defprintname
(): print('sherlock blaze')
printname()
通過上面的**,我們可以觀察到裝飾器大概的用法。可以有好幾層,比如:
def
log(text):
defdecorator
(func):
def(*arg, **kw):
print('who\'s the most handsome man.')
return func(*arg, **kw)
return decorator
@log('xixixi')
defprintname
(): print('sherlock blaze')
printname()
注意一下裝飾器中func引數的位置
函式式程式語言python 函式式程式設計
函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programming,雖然也可以歸結...
Python函式式程式設計
python函式式程式設計的核心思想是 把函式當資料.所以,函式可以用作函式引數,函式返回值,元組或字典成員等 閉包閉包是實現 復用的一種途徑,與類不同的是它基於函式實現.函式與它的環境變數一起就構成了閉包,閉包只有乙個返回值,那就是閉包中的函式 def line conf a,b def line...
python函式式程式設計
一 lambda 主要用來自定義行內函式 二 map 首先定義乙個函式,再用map 命令將函式逐一應用到map列表中的每個元素,最後返回乙個陣列 例如 map lambda x,y x y,a,b 表明將a,b兩個列表的元素對應相乘,把結果返回到新列表。三 reduce 用於遞迴運算 例如 redu...