Python學習筆記 6 高階函式 物件導向程式設計

2021-08-07 19:33:07 字數 4305 閱讀 8612

什麼是高階函式?

高階函式英文叫higher-order function。什麼是高階函式?我們從實際**一步一步深入概念。

以內建函式max()為例吧
>>> max(1,5,4)

5>>> max

in function max>

>>>x=max(1,5,4)

>>>x

5

可見,max(1,5,4)是函式呼叫,而max是函式本身,要獲得函式呼叫結果,我們可以把結果賦值給變數

那麼,如果把函式本身賦值給變數呢?

>>>fun=max

>>>fun(1,5,4)

5

說明函式本身也可以賦值給變數,即:變數可以指向函式,並且變數fun現在已經指向了max函式本身,可以通過變數fun來呼叫max這個函式。
函式名其實就是指向函式的變數,對於max()這個函式,完全可以把函式名max看成變數,它指向乙個可以求最大值的函式,我們可以用其他變數來指向改函式,以你定義的變數來實現求最大值的函式的呼叫
既然變數可以指向函式,函式的引數能接收變數,那麼乙個函式就可以接收另乙個函式作為引數,這種函式就稱之為高階函式。

要理解「函式本身也可以作為引數傳入」,可以從python內建的map/reduce函式入手。

map()函式接收兩個引數,乙個是函式,乙個是序列,map將傳入的函式依次作用到序列的每個元素,並把結果作為新的list返回。

比如我們有乙個函式f(x)=x^2,要把這個函式作用在乙個list [1, 2, 3, 4]上,就可以用map()實現如下:

"""

f=x^2

[1, 2, 3, 4]

| | | |

[1, 4, 9, 16]

""">>>

deffun

(x):

...

return x * x

...>>> map(fun, [1, 2, 3, 4])

[1, 4, 9, 16]

請注意我們定義的函式fun。fun指的是函式物件本身,fun(1)指的是呼叫fun函式,並傳入引數1,得到返回結果。

上例中,map()傳入的第乙個引數是fun,即函式物件本身。把像map()函式這種能夠接收函式作為引數的函式,稱之為高階函式(higher-order function)。

reduce把乙個函式作用在乙個序列[x1, x2, x3...]上,這個函式必須接收兩個引數,reduce把結果繼續和序列的下乙個元素做累積計算,其效果就是:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
##比如定義乙個求和的函式

>>> def add(x, y):

...return x + y

...>>> reduce(add, [1, 3, 5, 7, 9])

25

實際執行過程就相當於add(add(add(add(1,3),5),7),9)

還可以應用reduce實現[1, 3, 5, 7, 9]——>整數13579的轉換

>>> def fn(x, y):

...return x * 10 + y

...>>> reduce(fn, [1, 3, 5, 7, 9])

13579

python內建的filter()函式用於過濾序列。

和map()類似,filter()也接收乙個函式和乙個序列。和map()不同的時,filter()把傳入的函式依次作用於每個元素,然後根據返回值是true還是false決定保留還是丟棄該元素。

##在乙個list中,刪掉偶數,只保留奇數

defis_odd

(n):

return n % 2 == 1

filter(is_odd, [1, 2, 3, 5, 6, 8, 10])

# 結果: [1, 3, 5]

對於簡單的 if else 語句,可以使用三元運算來表示
# 普通條件語句

if1 == 1:

name = 'wupeiqi'

else:

name = 'alex'

# 三元運算

name = 'wupeiqi'

if1 == 1

else

'alex'

對於簡單的函式,還存在一種更簡便的表示方式,即:lambda表示式
## 普通函式

deffunc

(arg):

# 定義函式(普通方式)

return arg + 1

result = func(123) # 執行函式

## lambda

my_lambda = lambda arg : arg + 1

# 定義函式(lambda表示式)

result = my_lambda(123) # 執行函式

用圖來說明 map、filter、reduce三個函式

物件導向程式設計(oop) object oriented programming

面向函式程式設計:(lisp)

物件導向的程式設計是把電腦程式視為一組物件的集合,而每個物件都可以接收其他物件發過來的訊息,並處理這些訊息,電腦程式的執行就是一系列訊息在各個物件之間傳遞

在python中,所有資料型別都可以視為物件,當然也可以自定義物件。自定義的物件資料型別就是物件導向中的類(class)的概念。

下面來感受下面向過程程式設計和物件導向程式設計的不同思想

##面向過程

stud1 = ##字典儲存學生資訊

stud2 =

defprint_info

(stu):

##定義資訊輸出函式

print

'name:%s\n age:%s\n gender:%s' % (stu['name'], stu['age'],stu['gender'])

print_info(stud1) ##呼叫資訊輸出函式列印stud1的資訊

print_info(stud2)

##物件導向

class

student

(object):

##定義乙個student類

def__init__

(self, name, age,gender):

##初始化

self.name = name

self.age= age

self.gender= gender

defprint_info

(self):

##類的資訊輸出方法

print

'name:%s\n age:%s\n gender:%s' % (self.name, self.age,self.gender)

stud1 = student('tom', 18,'male') ##例項化乙個stud1 學生例項

stud2 = student('tim', 16,'female')

stud1.print_info() ##呼叫stud1 例項的資訊輸出方法

stud2.print_info()

Python學習筆記 高階函式

高階函式的概念是我在學習kotlin的時候才接觸到的,後來才發現很多語言都有該特性。簡單的定義為 把函式作為引數傳入另乙個函式中 例如 def add x,y,f return f x f y print add 5,6,abs 其中,abs函式作為引數傳到add函式中,add函式就可以稱為高階函式...

Python學習筆記 6 函式

定義函式 def name pass 引數位置按照順序排列並傳遞。使用 收集位置引數 當 用在函式內部的時候,星號將一組可變數量的位置引數集合成引數值的元組。例如 def print aa aa print aa print aa 3,1,2,huawei out 45 3,1,2,huawei 注...

Python 學習筆記6 函式

在python中,function是一組執行特定任務的相關語句。函式有助於將我們的程式分解為更小的模組化塊。隨著我們的計畫越來越大,功能使其更加有條理和易於管理。此外,它避免重複並使 可重用 def function name parameters docstring statement s 上面顯...