人生苦短,你用python嗎?
化學專業的小凱,卻喜歡上了計算機語言,業餘時間入門了python,從此無法自拔,話不多說,接下來與大家分享我的學習筆記。(函數式編程上篇)
程序中反覆執行的代碼可以封裝在一個代碼塊中,具有函數名、參數和返回值,這就是程序中的函數。
Python中的函數很靈活,可以在模塊中、但是在類之外定義,即函數,其作用域是當前模塊;也可以在別的函數中定義,即嵌套函數;還可以在類中定義,即方法。
一.定義函數
前面篇章中用到的一些函數,len(),min(),max(),這些函數都是有Python官方提供的,成為內置函數(Built-in Functions,BIF)
def 函數名(參數列表):
函數體
return 返回值
- 定義函數時,關鍵字是def,函數名需要符合之前篇章中的標識符命名規範
- 多個參數列表之間可以用逗號分開,當然函數也可以沒有參數
- 如果函數需要返回值,就需要在函數體後使用return語句將數據返回
- 如果沒有返回數據,則函數體中可以使用return None或者省略return語句
#第一行:定義計算長方形面積的函數rectangle_area,有兩個參數,長方形的長和高(width和height是參數名)
#第二行:通過return返回函數計算結果
#第三行:調用了rectangle_area函數
二.函數參數
Python中函數參數很靈活,具體體現在傳遞參數有多種形式上。
1.使用關鍵字參數調用函數
為了提高函數調用的可讀性,在函數調用時可以使用關鍵字參數調用。採用關鍵字參數調用函數,在函數定義時不需要做額外的工作。
1,2,3,5行均正確,4行發生錯誤,因為在調用函數時,一旦其中一個參數採用了關鍵字調用,那麼其後的所有參數都必須要採用關鍵字參數形式傳遞。
2.參數默認值
在定義函數時,可以為參數設置一個默認值,調用函數時可以忽略在參數。
定義了makeCoffee函數,其中把卡布奇諾設置為默認值。第一次調用函數,傳遞“拿鐵”參數,沒有使用默認值。第二次調用函數,沒有傳遞參數,因此使用默認值。
3.可變參數
Python中的參數個數可以變化,可以接受不確定數量的參數,這樣額參數成為可變參數。
- *形式——*可變參數在函數中被組裝成為一個元組
- **形式——**可變參數在函數中被組裝成為一個字典
(1)*可變參數
定義了一個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)**可變參數
上述代碼定義了一個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表示沒有實際意義的數據。
上述定義了兩個函數,實際上是在前面出現的函數基礎上重構的。
- 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.都返回值函數
有時候需要返回多個值,實現返回多個值的方式很多,簡單的方式是使用元組返回多個值,因為元組作為數據結構可以容納多個數據,另外元組是不可變的,使用起來比較安全。
這個例子是計算物體在指定時間和速度時的位移。
- 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]))——打印輸出結果
謝謝大家,下篇分享函數式編程下篇