Python函式式程式設計

2021-08-26 02:36:52 字數 4362 閱讀 5934

高階函式

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 函式的引數同樣是兩個,乙個是函式,乙個是序列。可以把要做的操作迭代在每個元素上,上面的語句等同於:

f(f(f(f(1, 2), 3), 4), 5)

filter
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())

輸出:

4 4

4通過上面的例子,我們可以看到裡面存在的問題。也很好理解,函式也是存在記憶體中的一段指令,裡面所用到的引數值,也是通過同樣的方式來儲存的。在上面,f1/f2/f3都利用了i這個引數,但是隨著迭代,i的值發生了變化,所以在真正呼叫執行函式的時候,輸出的結果都是4。

lambda

通過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...