Python 4.函數參數 返回值與文檔查看(基礎篇)


  •   本章大綱:(以后文筆格式都會在開頭有個大綱)
  •                  -五大參數-
  •                                普通參數
  •                                默認參數
  •                                關鍵字參數
  •                                收集參數
  •                                         收集參數解包問題
  •                                關鍵字收集參數
  •                                         關鍵字收集參數解包問題
  •                  -返回值-
  •                  -文檔查看-


-普通參數-
  • 普通參數又名為位置參數,沒有默認值,根據具體使用位置進行傳值
  • 普通參數和默認參數的不同
  • 普通參數就是如同名字一般普通,沒有默認值
  • 而默認參數則可以規定默認值(也就是規定了默認值的普通參數而已)
  • 但是默認參數要牢記一點:默認參數必須指向不變的對象值
  • 請看下面例子
 
        
def  add_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']

 


也就是說賦值給默認參數的對象應該為常量

如果需要修改正確,則需要判斷傳入時參數是否為空
def  add_end2(L=None):
if L is None: # 這里的is是身份函數的一種,請翻回上一篇“變量”文章
L=[]
L.append('END')
return L

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不是必須怎么寫的,但是推薦使用(約定俗稱)
  • 收集參數參數名前需要帶有星號(*)
  • 收集參數可以和其他參數共存,事實上全部類型參數都可以同時出現在同一個函數里面

案例如下
案例條件:函數模擬學生自我介紹,但是並不是每個學生都有相同的喜好,有的多,有的少
  1. 把收集參數看作一個tuple
  2. type為查看內容的類型
  3. type語法: type(args) args=需要查詢的內容
def stu(*args):
    print("hello,大家好,我先做下自我介紹:")
    print(type(args)) #查看args(收集參數)的類型
    for item in  args:  #因為收集函數是一個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需要按字典格式訪問

案例如下
案例條件:同上自我介紹
  1. 調用的時候需要使用關鍵字參數格式調用
  2. 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

 





關於各類參數調用的順序問題
  1. 之前就說過,收集參數,關鍵字參數,普通參數,默認參數,關鍵字收集參數
  2. 使用規則:普通參數,默認參數,收集參數,收集關鍵字參數
 混合參數使用案例
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
我的愛好是廣州
我住在蘿崗區
我還有愛好游戲
我還有愛好籃球

 



-收集參數的解包問題-
  1. 把收集參數當作一個list或者tuple,拆分成一個一個值,而不是再把它當作一個整體
  2. 使用一個星號(*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

 

 



-收集關鍵字參數的解包問題-
  1. 對dict類型進行解包
  2. 需要使用兩個星號(**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

 





-函數文檔-
  • 函數的文檔的作用是對當前函數提供使用相關的參考信息
  • 文檔的寫法:
  • 在函數內部開始的第一行使用三引號(''' ''',""" """)字符串定義符
  • 必須在函數的首行,經過驗證前面有注釋性說明是可以的,不過最好函數文檔出現在首行
  • 具體格式:
  1. 第一行:函數名稱
  2. 第二行:函數具體功能
  3. 第三行:參數名稱以及內容
  4. 第四行:是否有返回值
  • 文檔查看:
  • 是固體不過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來交流

 
        

想第一時間看更新的文章,請關注,謝謝


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM