Python學習13.06:Python函數默認參數設置(超級詳細)

咱們知道,在調用函數時,若是不指定某個參數,解釋器會拋出異常。爲了解決這個問題,Python 容許爲參數設置默認值,即在定義函數時,直接給形式參數指定一個默認值,這樣的話,即使調用函數時沒有給擁有默認值的形參傳遞參數,該參數能夠直接使用定義函數時設置的默認值。

定義帶有默認值參數的函數,其語法格式以下:python

def 函數名(...,形參名=默認值):
    代碼塊

注意,在使用此格式定義函數時,指定有默認值的形式參數必須在全部沒默認值參數的最後,不然會產生語法錯誤

例如,以下程序爲 name、message 形參指定了默認值:函數

# 爲兩個參數指定默認值
def say_hi(name = "孫悟空", message = "歡迎來到C語言中文網"):
    print(name, ", 您好")
    print("消息是:", message)

# 所有使用默認參數
say_hi()
# 只有message參數使用默認值
say_hi("白骨精")
# 兩個參數都不使用默認值
say_hi("白骨精", "歡迎學習Python")
# 只有name參數使用默認值
say_hi(message = "歡迎學習Python")

運行結果爲:學習

孫悟空 , 您好
消息是: 歡迎來到C語言中文網
白骨精 , 您好
消息是: 歡迎來到C語言中文網
白骨精 , 您好
消息是: 歡迎學習Python
孫悟空 , 您好
消息是: 歡迎學習Python

從上面程序能夠看出,若是隻傳入一個位置參數,因爲該參數位於第一位,系統會將該參數值傳給 name 參數。所以,不能按以下方式調用 say_hi() 函數:spa

say_hi("歡迎學習Python")

上面調用時傳入的「歡迎學習Python」字符串將傳給 name 參數,而不是 message 參數。

更不能按以下方式來調用 say_hi() 函數:.net

say_hi(name="白骨精", "歡迎學習Python")

由於 Python 規定,關鍵字參數必須位於位置參數的後面。所以提示錯誤:positional argument follows keyword argument。

那麼,能不能單純地將上面兩個參數交換位置呢?code

say_hi("歡迎學習Python" , name="白骨精")

上面調用依然是錯誤的,由於第一個字符串沒有指定關鍵字參數,所以將使用位置參數爲 name 參數傳入參數值,第二個參數使用關鍵字參數的形式再次爲 name 參數傳入參數值,這意味着兩個參數值其實都會傳給 name 參數,程序爲 name 參數傳入了多個參數值。所以提示錯誤:say_hi() got multiple values for argument 'name'。

將函數調用改成以下兩種形式是正確的:ip

say_hi("白骨精", message="歡迎學習Python")
say_hi(name="白骨精", message="歡迎學習Python")

上面第一行代碼先使用位置參數爲 name 參數傳入參數值,再使用關鍵字參數爲 message 參數傳入參數值;第二行代碼中的 name、message 參數都使用關鍵字參數傳入參數值。

再次強調,因爲 Python 要求在調用函數時關鍵字參數必須位於位置參數的後面,所以在定義函數時指定了默認值的參數(關鍵字參數)必須在沒有默認值的參數以後。例如以下代碼:字符串

# 定義一個打印三角形的函數,有默認值的參數必須放在後面
def printTriangle(char, height = 5) :
    for i in range(1, height + 1) :
        # 先打印一排空格
        for j in range(height - i) :
            print(' ', end = '')
        # 再打印一排特殊字符
        for j in range(2 * i - 1) :
            print(char, end = '')
        print()


printTriangle('@', 6)
printTriangle('#', height=7)
printTriangle(char = '*')

上面程序定義了 printTriangle() 函數,其中,有默認值的 height 形參,必須放在 char 形參的後面;反之,將會形成語法錯誤。get

在 Python 中,能夠使用「函數名.__defaults__」查看函數的默認值參數的當前值,其返回值是一個元組。例如,顯示上面定義的 printTriangle 函數的默認值參數的當前值,能夠使用 printTriangle.__defaults__ ,其結果爲 (5,)。 it

相關文章
相關標籤/搜索