python function learning
Python函數學習
這一節還沒有涉及到面向對象, 主要關注如何定義和使用python的函數. 下文以簡單問答形式呈現.
1. 函數要有一個返回值, 該如何寫?
這個很簡單, return ret_value
2. 函數要返回多個返回值, 該如何寫?
python處理這個也很簡單, 格式可以為:
return ret_value1,ret_value2 或者為
return (ret_value1,ret_value2) 這兩種寫法的效果是一樣的, 都是返回一個tuple
3. 如果一個函數沒有return語句, 那么函數有沒有返回值?
答案是, 有返回值, 返回值是一個特殊的None值.
4. python函數有沒有overload?
在C#等語言中, 你可以定義一系列同名函數, 這些函數的參數個數或者參數類型可能不同, 但只要這些函數的返回值一樣, 就是允許的,這叫做overload.
但在python中, 我們不可以有2個同名的函數的, 即使函數的參數個數或類型不同. 但python支持默認參數, 所以overload的意義也就并不大了.
5. 推薦的函數體的注釋形式
如果函數頭后緊跟一個合法的string(不管這個字符串是以', 還是", 還是'''括起來的), python都認為這個字符串是函數的docstrings. 在這里講一下, 推薦的docstrings寫法, 每個函數都應該在函數頭的下一行, 寫docstrings, 除非這個函數特別簡單. docstrings的是由'''(三個')括起來, 第一個是函數的整體功能介紹, 然后空一行, 第3行是詳細的說明. docstrings不同于一般的注釋, 我們甚至可以通過print(myFunc.__doc__)來輸出docstrings.
6. 關鍵字參數
一般地, 我們給形參傳值的時候, 都是按照形參的次序, 依次將實參傳過去的. python還支持類似于給形參賦值的傳參方式, 即關鍵字傳參方式. 甚至, 我們可以在調用一個函數時,混用兩種傳參方式(python有自己的規則來將形參和實參對應起來). 我個人不推薦這種混用方式, 程序的可讀性將變得非常差.
def greetEveryone5(greet, person):
print (greet+person)
greetEveryone5("hello ","Robert") #這是一般傳參方式
greetEveryone5(greet="hello ", person="Jason") #這是關鍵字傳參方式
greetEveryone5(person="Jason", greet="hello ")#這是關鍵字傳參方式, 注意這時, 實參的位置和函數定義可以不同
7. 元組參數(*arg類型的參數)
C#中有一個開放數組的概念, 即函數數組型形參如果以params 修飾符聲明, 我們就可以將任意個數的參數傳給函數. Python也有類似的東西, 即 *arg類型的參數, 我們可以將任意多個實參傳給一個*arg形參, 在函數中, 該arg參數其實是一個tuple, 注意為*arg參數傳值時, 不能再畫蛇添足地加(), 因為python會自動將函數最后的幾個參數組成一個tuple(這句話不嚴密, 應該是函數最后幾個合適的參數組成一個tuple, 參見下面小節 函數參數調用的順序).
比如
def greetEveryone(greet, *people):
#print(type(people)) #output is:<type 'tuple'>
for item in people:
print (greet+item)
greetEveryone("Hello ", "Jason","David","Harry") #這行是正確的傳值方式
greetEveryone("Hello ", ("Jason","David","Harry")) #這行是錯誤的傳值方式, 這樣傳值, 在函數內部, arg的第一個item是一個tuple, 其值為("Jason","David","Harry")
8. 字典參數(**arg類型的參數)
我們可以將任意多的key value pair, 傳給**arg參數, 在函數內部arg其實就是一個dict, 注意傳值時的寫法, 必須是key1=value1, key2=value2, .... , 這些key一定是str類型, 需要注意的是key, 是不能用""括起來, 另外不能用{}將這些key=value pair括起來.
def greetEveryone4(period, **greetPeople):
#print (type(greetPeople)) #<type 'dict'>
for item in greetPeople.keys():
#print (type(item)) #output is:<type 'str'>
print(period+", "+item+" "+greetPeople[item])
greetEveryone4('morning', {"Boss" :"drothy", "Clerk" :"Jason"})#這行是錯誤的傳值方式
greetEveryone4('morning', "Boss" :"drothy", "Clerk" :"Jason")#這行是錯誤的傳值方式
greetEveryone4('morning', "Boss" ="drothy", "Clerk" ="Jason")#這行是錯誤的傳值方式
greetEveryone4('morning', Boss ="drothy", Clerk ="Jason")#這行是正確的傳值方式
9. 函數參數調用的順序
字典參數的寫法和關鍵字參數一摸一樣, 那么python是如何區分哪個是哪個呢? 答案是python有一套規則(下面內容出自 <從C#到Python —— 3 函數及函數編程> http://www.rzrgm.cn/yanxy/archive/2010/03/28/c2p_3.html)
調用Python函數時,參數書寫的順序分別為:非關鍵字參數,關鍵字參數,元組參數,字典參數。請記住以下幾點規則:
* 通過位置分配非關鍵字參數
* 通過匹配變量名分配關鍵字參數
* 其他額外的非關鍵字參數分配到*arg元組中
* 其他額外的關鍵字參數分配到**arg的字典中
* 用默認值分配給在調用時未得到分配的參數
一般說來,實參表中非關鍵字參數在前,關鍵字參數在后,關鍵字名字必須是形參名字。形參有沒有缺省值都可以用關鍵字參數的形式調用。每一形參至多只能對應一個實參,因此,已經由位置參數傳入值的形參就不能在同一調用中再作為關鍵字參數。另外一個函數定義中, 只能使用一個*arg和**arg參數

浙公網安備 33010602011771號