基本定義
定義:函數是指將一組語句的集合通過一個函數名封裝起來,如果想要執行這段函數,只需要調用其函數名即可。
特性:
- 減少重複代碼
- 程序可擴展
- 程序易於維護
語法定義
def function_name(*args): # def關鍵字用來定義函數 function_name函數名,*args代表可以有任意個參數
code #代碼塊
...
function_name(*args) #調用函數
參數的作用在於調用函數時,通過傳入不同的參數來決定函數內部的執行流程,從而滿足自己不同的需求。
注意:如果想要調用函數,必須要加括號,參數的話視實際情況而定,如果不加參數,不是調用函數,而是函數的地址,如下:
#python解釋器
>>> def fun():
print('help')
>>> fun
<function fun at 0x0000000002F8CAE8> # at之後是內存地址
>>> fun()
help
參數
形參
形式參數,只有在被調用時纔會分配內存單元,在調用結束時,即刻釋放所分配的內存單元,因此形參只在函數內部有效,可以簡單的理解爲只是一種意義上的參數,在定義的不是並不佔內存地址。
實參
實際參數,實際佔用內存地址,在調用函數時,實際傳遞給函數的參數,函數訪問該參數的內存地址,可以是常量、變量、函數等。
def fun(x, y): # x和y代表形參
print x + y
fun(a, b) # a和b代表實參
部分特殊參數
默認參數
在定義函數的時候可能會遇到這麼一種情況,比如學生註冊,在註冊國籍的時候,如果是在中國境內,那麼國籍很大一部分是中國,這樣的話每次頻繁輸入會比較麻煩,那麼可以將國籍設置成默認參數,不填寫的話默認就是默認值,如果不一樣的話可以對改參數進行修改,同樣可以省掉大部分重複的工作。
默認函數定義語法:
#位置參數:以位置順序確定對應關係的參數
def fun(param1, param2,param3='default value'): # 這裏param1,param2叫做位置參數,param3叫做默認參數
code
...
這裏需要注意的是,默認函數必須放在位置參數之後,否則會報錯,SyntaxError: non-default argument follows default argument。
關鍵參數
正常情況下,給函數傳參數的時候需要按照函數參數的的順序,如果不想按照順序就可以使用關鍵參數,只需要指定參數名即可,指定了參數名的參數就叫做關鍵參數,但是,關鍵參數必須放在位置參數之後。如下所示:
#python解釋器
>>> def stu_register(name, age, major='math', country='中國'):
print("---註冊學生信息---")
print("姓名:%s\n年齡:%s\n國籍:%s\n專業:%s" % (name, age, country,major))
>>> stu_register("張三", major='Chinese', age=23) # 正確調用
---註冊學生信息---
姓名:張三
年齡:23
國籍:中國
專業:Chinese
>>> stu_register("張三", major='Chinese', 23, country="印度") # 錯誤調用
SyntaxError: positional argument follows keyword argument
非固定參數
在實際場景中可能會遇到一種情況,就是你也不知道調用者會傳遞多少個參數,那麼就可能會用到python中的非固定參數。
python中的非固定參數有兩種,一種是args,一種是**kwargs,區別是args會將傳入參數打成元組形式,通常傳遞位置參數,**kwargs會將傳入的參數打成字典,通常傳遞關鍵參數。
*args:
#python解釋器
>>> student_register("張三", 22)
張三 22 () # 這裏的括號就是上面的args,因爲沒有傳值,所以爲空。
>>> student_register("張三", 22, '中國', '河北')
張三 22 ('中國', '河北') # 將最後兩個元素打成了tuple
**kwargs:
#python解釋器
>>> def student_register(name, age, *args, **kwargs):
print(name, age, args, kwargs)
>>> student_register("張三", 22, "本科", "數學")
張三 22 ('本科', '數學') {} # ‘{}’裏就是**kwargs,沒傳值,所以爲空
>>> student_register("張三", 22, "本科", "數學",native_place='河北石家莊',address="山東濟南")
張三 22 ('本科', '數學') {'native_place': '河北石家莊', 'address': '山東濟南'}
返回值
我們上面定義的函數,都是在調用的時候直接進行輸出的,那麼我們能接受他們的返回值嗎?
#python解釋器
>>> info = stu_register("張三", major='Chinese', age=23)
---註冊學生信息---
姓名:張三
年齡:23
國籍:中國
專業:Chinese
>>> print(info)
None
結果爲None,說明我們沒有獲取到函數的運行結果,那麼如果想獲取運行結果給外部調用,那麼就需要使用return語句來講結果返回給調用者(這裏解釋一下,個人理解,你沒有寫return語句,不代表這個函數沒有返回,只不過是返回None)。
# python解釋器
>>> def stu_register(name, age, major='math', country='中國'):
if(age < 50):
print("---註冊學生信息---")
print("姓名:%s\n年齡:%s\n國籍:%s\n專業:%s" % (name, age, country,major))
return "註冊成功"
else:
print("年齡太大,註冊失敗")
return "註冊失敗"
>>> info = stu_register("張三", major='Chinese', age=23)
---註冊學生信息---
姓名:張三
年齡:23
國籍:中國
專業:Chinese
>>> print(info)
註冊成功
tips:函數在執行過程中如果遇見return語句,那麼就會停止執行並返回結果,也就是在return後面的語句就不會執行了,如下圖,上面的’return語句之後’並沒有被打印出來
>>> def stu_register(name, age, major='math', country='中國'):
if(age < 50):
print("---註冊學生信息---")
print("姓名:%s\n年齡:%s\n國籍:%s\n專業:%s" % (name, age, country,major))
return "註冊成功"
print('return語句之後')
else:
print("年齡太大,註冊失敗")
return "註冊失敗"
print('return語句之後')
>>> stu_register("張三", major='Chinese', age=23)
---註冊學生信息---
姓名:張三
年齡:23
國籍:中國
專業:Chinese
'註冊成功'