天天看點

Python 函數---參數詳解

參數詳解

  • 參數分類
    • 普通參數
    • 預設參數
    • 關鍵字參數
    • 收集參數
  • 普通參數
    • 定義的時候直接定義變量名
    • 調用的時候直接把變量或者值放入指定位置

      def 函數名(參數1, 參數2,….):

      函數體

      # 調用
      函數名(value1, value2,.......)
      
      # 調用的時候,具體值參考的是位置,按位置指派
                 
  • 預設參數
    • 形參帶有預設值
    • 調用的時候,如果沒有對相應形參指派,則使用預設值

      def func_name(p1=v1, p2=v2……….):

      func_block

      # 調用1
        func_name()
      # 調用2
        value1= 100
        value2=200
        func_name(value1,value2)
                 
# 預設參數示例
# 報名函數,需要知道學生性别
# 報名的時候如果沒有特别指定,我們預設的是男生
def reg(name, age, gender="M"):
    if gender == "M":
        print("{0} is {1}, and he is a good student".format(name, age))
    else:
        print("{0} is {1}, and she is a good student".format(name, age))
           
# 調用預設參數函數案例1
reg('Mark',)

reg("Mary",,gender="F")
           

Mark is 23, and he is a good student

Mary is 19, and she is a good student

  • 關鍵字參數
    • 文法

      def func(p1=v1, p2=v2…..):

      func_body

      調用函數:

      func(p1=value1, p2=value2…….)

    • 比較麻煩,但也有好處。
      • 不容易混淆, 一般實參和形參隻是按照位置一一對應即可,容易出錯
      • 使用關鍵字參數,可以不考慮參數位置
# 關鍵字參數案例
def stu(name, age, addr):
    print("I am a student")
    print("我叫 {0}, 我今年 {1}歲了, 我住{2}".format(name, age, addr))


n = "jingjing"
a = 
addr = "我家"

# 普通參數,隻按照位置傳遞,容易出錯
stu(a, n, addr)


def stu_key(name="No name", age=, addr="No addr"):
    print("I am a student")
    print("我叫 {0}, 我今年 {1}歲了, 我住{2}".format(name, age, addr))


n = "jingjing"
a = 
addr = "我家"

# 普通參數,隻按照位置傳遞,容易出錯
stu_key(age=a, name=n, addr=addr)
           

I am a student

我叫 18, 我今年 jingjing歲了, 我住我家

I am a student

我叫 jingjing, 我今年 18歲了, 我住我家

  • 收集參數
    • 把沒有位置,不能和定義時的參數位置相對應的參數,放入一個特定的資料結構中
    • 文法
      def func(*args):
            func_body
       按照list使用方式通路args得到傳入的參數
      
        調用:
        func(p1, p2, p3, .....)
                 
    • 參數名args不是必須這麼寫,但是,我們推薦直接用args,約定俗成
    • 參數名args前需要由星号
    • 收集參數可以和其他參數共存
# 收集參數代碼
# 函數模拟一個學生進行自我介紹,但具體内容不清楚
# args把他看做一個list
def stu( *args):
    print("Hello 大家好,我自我介紹以下,簡答說兩句:")
    # type函數作用是檢測變量的類型
    print(type(args))
    for item in args:
        print(item)


stu("liuying", , "北京大通州區", "wangxiaojing", "single")

stu("周大神")
           

Hello 大家好,我自我介紹以下,簡答說兩句:

< class ‘tuple’>

liuying

18

北京大通州區

wangxiaojing

single

Hello 大家好,我自我介紹以下,簡答說兩句:

< class ‘tuple’>

周大神

# 收集參數案例
# 說明收集參數可以不帶任何實參調用,此時收集參數為空tuple
stu()
           

Hello 大家好,我自我介紹以下,簡答說兩句:

< class ‘tuple’>

# 如果使用關鍵字參數格式調用,會出現問題
stu(name="liuying")
           

Traceback (most recent call last):

File “D:/xuexi/hanshu.py”, line 194, in

stu(name=”liuying”)

TypeError: stu() got an unexpected keyword argument ‘name’

  • 收集參數之關鍵字收集參數
    • 把關鍵字參數按字典格式存入收集參數
    • 文法:
      def func( **kwargs):
           func_body
           # 調用:
        func(p1=v1, p2=v2, p3=v3........)
                 
    • kwargs一般約定俗成
    • 調用的時候,把多餘的關鍵字參數放入kwargs
    • 通路kwargs需要按字典格式通路
# 收集參數案例
# 自我介紹
# 調用的時候需要使用關鍵字參數調用
def stu( **kwargs):
    # 在函數體内對于kwargs的使用不用帶星号
    print("Hello 大家好,我先自我介紹一下:")
    print(type(kwargs))
    # 對于字典的通路,python2 和python3有差別
    for k,v in kwargs.items():
        print(k, "---", v)

stu(name="liuying",  age=, addr="北京大通州區", lover="王曉靜", work="Teacher")

print("*" * )

stu(name="周大神")
           

Hello 大家好,我先自我介紹一下:

< class ‘dict’>

name — liuying

age — 19

addr — 北京大通州區

lover — 王曉靜

work — Teacher

Hello 大家好,我先自我介紹一下:

< class ‘dict’>

name — 周大神

# 收集參數可以為空案例
stu()
           

Hello 大家好,我先自我介紹一下:

< class ‘dict’>

收集參數混合調用的順序問題

  • 收集參數,關鍵字參數,普通參數可以混合使用
  • 使用規則就是,普通參數和關鍵字參數優先
  • 定義的時候一般找普通參數,關鍵字參數,收集參數tuple,收集參數dict
# 收集參數混合調用案例
# stu模拟一個學生的自我介紹
def stu(name, age, *args, hobby="沒有", **kwargs):
    print("Hello 大家好")
    print("我叫 {0}, 我今年{1}大了。".format(name, age))
    if hobby == "沒有":
        print("我沒有愛好, so sorry")
    else:
        print("我的愛好是{0}".format(hobby))

    print("*" * )

    for i in args:
        print(i)

    print("#" * )

    for k, v in kwargs.items():
        print(k, "---", v)


# 開始調用函數
name = "liuying"
age = 

# 調用的不同格式
stu(name, age)

stu(name, age, hobby="遊泳")

stu(name, age, "王曉靜", "劉石頭", hobby="遊泳", hobby2="烹饪", hobby3="跟不同女生聊天")
           

Hello 大家好

我叫 liuying, 我今年19大了。

我沒有愛好, so sorry

********************

##############################

Hello 大家好

我叫 liuying, 我今年19大了。

我的愛好是遊泳

********************

##############################

Hello 大家好

我叫 liuying, 我今年19大了。

我的愛好是遊泳

********************

王曉靜

劉石頭

##############################

hobby2 — 烹饪

hobby3 — 跟不同女生聊天

傳回值

  • 函數和過程的差別
    • 有無傳回值
  • 需要用return顯示傳回内容
  • 如果沒有傳回,則預設傳回None
  • 推薦寫法,無論有無傳回值,最後都要以return 結束
# 傳回值示例

def func_1():
    print("有傳回值呀")
    return 

def func_2():
    print("沒有傳回值")


f1 = func_1()
print(f1)

f2 = func_2()
print(f2)
           

有傳回值呀

1

沒有傳回值

None

函數文檔

  • 函數的文檔的作用是對目前函數提供使用相關的參考資訊
  • 文檔的寫法:
    • 在函數内部開始的第一行使用三引号字元串定義符
    • 一般具有特定格式
  • 文檔檢視
  • 使用help函數,形如 help(func)
  • 使用doc, 參看案例
# 文檔案例
# 函數stu是模拟一個學生的自我介紹的内容
def stu(name, age, *args):
    '''
    這是第一行
    這是第二行
    這是第三行
    '''
    print("This is hanshu stu")
           
# 檢視函數文檔
help(stu)
stu.__doc__
           

Help on function stu in module main:

stu(name, age, *args)

這是第一行

這是第二行

這是第三行

這是第一行
這是第二行
這是第三行
           
def stu(name,age,*args):
    """
    :param name:表示學生的姓名
    :param age:表示學生年齡
    :param args:表示函數的收集參數
    :return:此函數沒有傳回值
    """
    pass

print(help(stu))
print('*' *  )
print(stu.__doc__)
           

Help on function stu in module main:

stu(name, age, *args)

:param name:表示學生的姓名

:param age:表示學生年齡

:param args:表示函數的收集參數

:return:此函數沒有傳回值

None

:param name:表示學生的姓名
:param age:表示學生年齡
:param args:表示函數的收集參數
:return:此函數沒有傳回值
           

————————-tuling 視訊教程 筆記