人生苦短,你用Python嗎?(九)函數式編程上篇

Python 泛函編程 Numbers Python小凱 2019-06-20

人生苦短,你用python嗎?

化學專業的小凱,卻喜歡上了計算機語言,業餘時間入門了python,從此無法自拔,話不多說,接下來與大家分享我的學習筆記。(函數式編程上篇)

程序中反覆執行的代碼可以封裝在一個代碼塊中,具有函數名、參數和返回值,這就是程序中的函數。

Python中的函數很靈活,可以在模塊中、但是在類之外定義,即函數,其作用域是當前模塊;也可以在別的函數中定義,即嵌套函數;還可以在類中定義,即方法。

一.定義函數

前面篇章中用到的一些函數,len(),min(),max(),這些函數都是有Python官方提供的,成為內置函數(Built-in Functions,BIF)

def 函數名(參數列表):
函數體
return 返回值
  • 定義函數時,關鍵字是def,函數名需要符合之前篇章中的標識符命名規範
  • 多個參數列表之間可以用逗號分開,當然函數也可以沒有參數
  • 如果函數需要返回值,就需要在函數體後使用return語句將數據返回
  • 如果沒有返回數據,則函數體中可以使用return None或者省略return語句
人生苦短,你用Python嗎?(九)函數式編程上篇

#第一行:定義計算長方形面積的函數rectangle_area,有兩個參數,長方形的長和高(width和height是參數名)

#第二行:通過return返回函數計算結果

#第三行:調用了rectangle_area函數

二.函數參數

Python中函數參數很靈活,具體體現在傳遞參數有多種形式上。

1.使用關鍵字參數調用函數

為了提高函數調用的可讀性,在函數調用時可以使用關鍵字參數調用。採用關鍵字參數調用函數,在函數定義時不需要做額外的工作。

人生苦短,你用Python嗎?(九)函數式編程上篇

1,2,3,5行均正確,4行發生錯誤,因為在調用函數時,一旦其中一個參數採用了關鍵字調用,那麼其後的所有參數都必須要採用關鍵字參數形式傳遞。

2.參數默認值

在定義函數時,可以為參數設置一個默認值,調用函數時可以忽略在參數。

人生苦短,你用Python嗎?(九)函數式編程上篇

定義了makeCoffee函數,其中把卡布奇諾設置為默認值。第一次調用函數,傳遞“拿鐵”參數,沒有使用默認值。第二次調用函數,沒有傳遞參數,因此使用默認值。

3.可變參數

Python中的參數個數可以變化,可以接受不確定數量的參數,這樣額參數成為可變參數。

  • *形式——*可變參數在函數中被組裝成為一個元組
  • **形式——**可變參數在函數中被組裝成為一個字典

(1)*可變參數

人生苦短,你用Python嗎?(九)函數式編程上篇

定義了一個sum()函數,用來計算傳遞給它的所有參數之和。*numbers是可變參數。在函數體中,參數numbers被組裝成為一個元組,可以使用for循環遍歷numbers元組,計算它們的總和,然後返回給調用者。

三次調用sum()函數的代碼中,每次傳遞的參數個數不同,前兩次調用時都省略了multiple參數,第三次調用時傳遞了multiple參數,此時multiple應該使用關鍵字參數傳遞,否則會發生錯誤。

如果已經有一個元組變量 double_tuple = (50.0, 60.0, 0.0) ,怎樣傳遞可變參數呢?需要對元組進行拆包 print(sum(30.0, 80.0, *double_tuple)) ,在元組double_tuple前加*,表示將double_tuple拆包為50.0,60.0,0.0形式。

(2)**可變參數

人生苦短,你用Python嗎?(九)函數式編程上篇

上述代碼定義了一個show_info()函數,用來輸出一些信息,參數sep為信息分隔符號,默認值是冒號“:”,**info是可變參數,在函數體中info被組裝成了一個字典。

注意:**可變參數必須在正規參數之後,如果本例將函數定義改成 show_info(**info,sep = ':') 形式,會發生錯誤。

  • show_info('->', name='Tony', age=18, sex=True)——調用函數show_info(),第一個參數‘->’傳遞給sep,其後的參數name='Tony', age=18, sex=True 傳遞給info,這種參數形式實際上就是關鍵字參數,注意鍵不用引號括起來。
  • show_info(sutdent_name='Tony', sutdent_no='1000', sep='-')——調用函數show_info(),sep也採用關鍵字參數傳遞,這種方式下sep參數可以放在參數列表的任何位置,其中的關鍵字參數被收集到info字典中。
  • show_info(**stu_dict, sex=True, sep='=')——調用函數show_info(),其中字典對象為stu_dict,傳遞時stu_dict前面加上**,表示將stu_dict拆包為key=value對的形式。

三.函數返回值

Python函數返回值也是比較靈活的,主要有三種:無返回值,單一返回值,多返回值。前面使用的基本都是單一返回值,下面介紹無返回值和多返回值

1.無返回值函數

有的函數只是為了處理某個過程,此時可以將函數設計為無返回值的。所謂無返回值,實際上就是返回None,None表示沒有實際意義的數據。

人生苦短,你用Python嗎?(九)函數式編程上篇

上述定義了兩個函數,實際上是在前面出現的函數基礎上重構的。

  • def show_info(sep=':', **info):——show_info()只是輸出一些信息,不需要返回數據,因此可以省略return語句。
  • return # return None 或省略——如果一定要使用return語句,見此行代碼,在函數結束前是用return或者return None的方式
  • 本例中show_info()函數強加return語句顯然多此一舉,但是有時候使用return或者return None是必要的。
  • def sum(*numbers, multiple=1):——定義了sum()函數,如果numbers中數據是空的,後面的求和計算也就沒有意義了,可以在函數的開始判斷numbers中是否有數據,如果沒有數據則使用return或者return None調出函數,見代碼return # return None 或省略。

2.都返回值函數

有時候需要返回多個值,實現返回多個值的方式很多,簡單的方式是使用元組返回多個值,因為元組作為數據結構可以容納多個數據,另外元組是不可變的,使用起來比較安全。

人生苦短,你用Python嗎?(九)函數式編程上篇

這個例子是計算物體在指定時間和速度時的位移。

  • def position(dt, speed):——定義position函數,其中dt參數是時間,speed參數是元組數據,speed的第一個元素是X軸上的速度,speed的第二個元素是Y軸上的速度。position函數的返回值也是元組類型。
  • posx = speed[0] * dt——計算X方向的位移
  • posy = speed[1] * dt——計算Y方向的位移
  • return (posx, posy)——將計算後的數據返回,(posx, posy)是元組類型實例
  • move = position(60.0, (10, -5))——調用函數,傳遞時間是60.0秒,速度時(10,-5)
  • print("物體位移:({0}, {1})".format(move[0], move[1]))——打印輸出結果

謝謝大家,下篇分享函數式編程下篇

人生苦短,你用Python嗎?(九)函數式編程上篇

相關推薦

推薦中...