Python 4.函式引數 返回值與文件檢視(基礎篇)
摘要:
本章大綱:(以後文筆格式都會在開頭有個大綱)
-五大引數-
...
- 本章大綱:(以後文筆格式都會在開頭有個大綱)
- -五大引數-
- 普通引數
- 預設引數
- 關鍵字引數
- 收集引數
- 收集引數解包問題
- 關鍵字收集引數
- 關鍵字收集引數解包問題
- -返回值-
- -文件檢視-
-普通引數-
- 普通引數又名為位置引數,沒有預設值,根據具體使用位置進行傳值
- 普通引數和預設引數的不同
- 普通引數就是如同名字一般普通,沒有預設值
- 而預設引數則可以規定預設值(也就是規定了預設值的普通引數而已)
- 但是預設引數要牢記一點:預設引數必須指向不變的物件值
- 請看下面例子
defadd_end(L=[]): L.append('END') # 這裡已經添加了一個END return L # 正常呼叫 print (add_end([1,2,3]))# [1, 2, 3, 'END'] # 使用預設引數呼叫時,一開始也是對的,但是再次呼叫時,結果就不一樣了 print (add_end())# ['END'] print(add_end())# ['END', 'END'] print(add_end()) # ['END', 'END', 'END']
結果如下:
[1, 2, 3, 'END'] ['END'] ['END', 'END'] ['END', 'END', 'END']
也就是說賦值給預設引數的物件應該為常量 如果需要修改正確,則需要判斷傳入時引數是否為空
defadd_end2(L=None): if L is None: # 這裡的is是身份函式的一種,請翻回上一篇“變數”文章 L=[] L.append('END') returnL print(add_end2())
結果如下:
['END'] # 也跟我們預期的結果一致
-關鍵字引數-
- 語法
- def func(p1=v1,p2=v2):
- 語句1
- 語句2
- ........
- 呼叫函式:
- func(p1=value1,p2=value2)
- 好處:不容易混淆。一般實參和形參只是按照位置,一一對應即可,容易出錯,使用關鍵字引數,可以不考慮引數位置
- 壞處:比較麻煩
案例如下: 案例條件:列印基本資訊
def stu(name,age,addr): print("我是{0},我今年{1},我住在{2}".format(name,age,addr)) #定義引數值 n = "zhansan" a = 18 addr = "廣州" #普通引數傳遞,只按照位置傳遞,容易出錯 stu(a,n,addr) #關鍵字傳遞,雖然麻煩,但是不容易出錯 stu(age=a, name=n, addr=addr)
結果如下:
我是18,我今年zhansan,我住在廣州 我是zhansan,我今年18,我住在廣州
-收集引數-
- 把沒有位置,不能和定義時的引數位置相對應的引數,放入一個特定的資料結構(tuple)中
- 語法
- def func(*args):
- func_body
- 按照tuple使用方式訪問args得到傳入的引數
- 呼叫:
- func(p1, p2, p3, .....)
- 引數名args不是必須怎麼寫的,但是推薦使用(約定俗稱)
- 收集引數引數名前需要帶有星號(*)
- 收集引數可以和其他引數共存,事實上全部型別引數都可以同時出現在同一個函式裡面
案例如下 案例條件:函式模擬學生自我介紹,但是並不是每個學生都有相同的喜好,有的多,有的少
- 把收集引數看作一個tuple
- type為檢視內容的型別
- type語法: type(args) args=需要查詢的內容
def stu(*args): print("hello,大家好,我先做下自我介紹:") print(type(args)) #檢視args(收集引數)的型別 for item inargs:#因為收集函式是一個tuple,所以使用迴圈將其全部列印 print(item)
呼叫收集引數
#有同學介紹內容多 stu("zhangsan",18,"廣州","籃球","遊戲") #有同學介紹內容不多 stu("lisi") # 即便只有一個值也使用tuple進行收集 #收集的內容也能為空 stu()
結果如下:
hello,大家好,我先做下自我介紹: <class 'tuple'> zhangsan 18 廣州 籃球 遊戲 hello,大家好,我先做下自我介紹: <class 'tuple'> lisi hello,大家好,我先做下自我介紹: <class 'tuple'>
使用關鍵字引數的格式進行呼叫收集引數 例如:呼叫時候 stu(name="wangwu",我們自己知道name是收集引數裡面的那個值,但是系統不知道啊,系統直接當成是一個str型別的同一個變數而已,所以我們就要使用關鍵字收集引數
-關鍵字收集引數-
- 把關鍵字引數按字典(dict)格式存入收集引數
- 語法
- def func(**kwargs): 注意是雙(*)星號
- func_body
- 呼叫:
- func(p1=v1, p2=v2, p3=v3........)
- kwargs也是約定俗成
- 呼叫的時候,把多餘的關鍵字引數放入kwargs
- 訪問kwargs需要按字典格式訪問
案例如下 案例條件:同上自我介紹
- 呼叫的時候需要使用關鍵字引數格式呼叫
- dict裡面的items方法返回列表裡面可遍歷的元素陣列
def stu(**kwargs): print("hello,大家好,我先做下自我介紹:") print(type(kwargs)) #檢視收集關鍵字引數的型別 for k,v in kwargs.items(): #有兩個變數進行迴圈原因是,不僅僅需要列印引數的值,連同關鍵字引數的引數名也要列印 print(k+"---"+v) #使用---將其分割開來,好看清楚 stu(name="zhangsan",age="18",addr="廣州",lover="遊戲",lovers="籃球") print("分割線"+"*"*20) stu(name="wangwu")
結果如下:
hello,大家好,我先做下自我介紹: <class 'dict'> name---zhangsan age---18 addr---廣州 lover---遊戲 lovers---籃球 分割線******************** hello,大家好,我先做下自我介紹: <class 'dict'> name---wangwu
關於各類引數呼叫的順序問題
- 之前就說過,收集引數,關鍵字引數,普通引數,預設引數,關鍵字收集引數
- 使用規則:普通引數,預設引數,收集引數,收集關鍵字引數
混合引數使用案例
def stu(name,age,hobby="沒有",*args,**kwargs): #name,age=位置引數,hobby=預設引數,*args=收集引數,**kwargs=收集關鍵字引數 print("大家好,我再次介紹一下自己") print("我叫{0},今年{1}".format(name,age)) if hobby == "沒有": print("對不起,我莫的愛好") else: print("我的愛好是{0}".format(hobby)) for i in args: print("我住在{0}".format(i)) for k,v in kwargs.items(): print("我還有愛好{0}".format(v))
開始呼叫
name = "zhansan" age = 18 #示範三種不同的呼叫方法 stu(name,age) stu(name,age,hobby="遊戲") stu(name,age,"廣州","蘿崗區",hobby2="遊戲",hobby3="籃球")
結果如下:
大家好,我再次介紹一下自己 我叫zhansan,今年18 對不起,我莫的愛好 大家好,我再次介紹一下自己 我叫zhansan,今年18 我的愛好是遊戲 大家好,我再次介紹一下自己 我叫zhansan,今年18 我的愛好是廣州 我住在蘿崗區 我還有愛好遊戲 我還有愛好籃球
-收集引數的解包問題-
- 把收集引數當作一個list或者tuple,拆分成一個一個值,而不是再把它當作一個整體
- 使用一個星號(*args)進行解包
解包案例如下
def stu(*args): print("哇哈哈哈") #這裡宣告一個物件來檢視,到底遍歷了多少次收集引數 n = 0 print(type(args)) for i in args: print(type(i))# 列印args列表裡內容的型別 print(n) n += 1 print(i) l = ["zhangsan",19,23,"lisi"] #解包=將元祖或列表轉化為字串的過程呈現 stu(*l) l2 = ("zhangsan",19,23,"lisi") stu(*l2)
結果如下:
哇哈哈哈 <class 'tuple'> <class 'str'> 0 zhangsan <class 'int'> 1 19 <class 'int'> 2 23 <class 'str'> 3 lisi 哇哈哈哈 <class 'tuple'> <class 'str'> 0 zhangsan <class 'int'> 1 19 <class 'int'> 2 23 <class 'str'> 3 lisi
-收集關鍵字引數的解包問題-
- 對dict型別進行解包
- 需要使用兩個星號(**args)進行解包
解包案例如下
def stu(**kwargs): n = 0; print(type(kwargs)) for k,v in kwargs.items(): print(type(v)) print(n) n += 1 print(k+"---"+v) l1={'name':'zhangsan','age':"12",'names':'lisi','ages':'23'}# 定義字典 stu(**l1)
結果如下:
<class 'dict'> <class 'str'> 0 name---zhangsan <class 'str'> 1 age---12 <class 'str'> 2 names---lisi <class 'str'> 3 ages---23
-返回值-
- 函式和過程的區別,就是 有無返回值
- 需要使用return函式返回內容
- 如果沒有返回,則預設返回None
- 推薦寫法,無論有無返回值,最後都以return結束(畢竟可以None)
返回值案例:有無返回值賦值的區別
def func_1(): print("有返回值") return 1 def func_2(): print("無返回值") f1 = func_1() print(f1) f2 = func_2() print(f2) # 在無返回值的情況下,系統預設返回None
結果如下:
有返回值 1 無返回值 None
-函式文件-
- 函式的文件的作用是對當前函式提供使用相關的參考資訊
- 文件的寫法:
- 在函式內部開始的第一行使用三引號(''' ''',""" """)字串定義符
- 必須在函式的首行,經過驗證前面有註釋性說明是可以的,不過最好函式文件出現在首行
- 具體格式:
- 第一行:函式名稱
- 第二行:函式具體功能
- 第三行:引數名稱以及內容
- 第四行:是否有返回值
- 文件檢視:
- 是固體不過help函式,形如 help(func)
- 使用doc
- help和doc的區別:help的文件檢視帶有返回值
文件寫法案例如下 案例條件:介紹文件內容
def stu(name=10,age=10): # 文件會自動幫我們列印引數資訊 ''' 這是我的文件內容 :param name: :param age: :return: ''' print("函式呼叫成功")# 測試函式是否能成功呼叫 stu()
使用help文件檢視案例
print(help(stu))
結果如下:
函式呼叫成功 Help on function stu in module __main__: stu(name=10, age=10) 這是我的文件內容 :param name: :param age: :return: None
使用doc文件檢視案例
print(stu.__doc__)
結果如下:
函式呼叫成功 這是我的文件內容 :param name: :param age: :return:
使用doc查詢文件並不會出現返回值
文筆不好,僅供參考
要有錯誤或者有其他更多的見解,歡迎大家加我QQ384435742來交流
想第一時間看更新的文章,請關注,謝謝