什麼是高階函式?
高階函式英文叫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 上面顯...