官术网_书友最值得收藏!

5.3 函數參數

5.3.1 位置參數

位置參數就是在調用的時候必須要按照正確順序傳入的參數,調用時的數量必須與函數聲明一致。如加法運算函數中的參數x和y,調用時必須要接收兩個參數,這就是位置參數。

5.3.2 默認參數

某些時候函數的參數值很少發生變化,因此為了簡化調用方法,我們將這類很少變化的參數設置成默認參數,調用時不傳遞參數值,此時函數內部使用默認值。

下面是一個使用了默認參數的函數,該函數用來計算整數的n次方,在數學運算中絕大多數情況下只進行平方運算,對于高次方的運算很少,基于此設置函數第二個參數的默認值為2:

    def power(x, n = 2):
        return x ** n

使用下面參數調用power函數:

    >>> power(2)
    >>> power(2, 3)
    >>> power(2, 5)

輸出:

    4
    8
    32

由此可見,默認參數可以簡化函數的調用。但是設置默認參數時仍需注意以下幾點:


□ 默認參數需要放在必選參數之后,如果有多個默認參數,那么所有默認參數都要放在必選參數之后。

□ 只為很少變化的參數設置默認參數。


下面舉一個現實中使用默認參數的例子,在小學生入學登記時需要填寫學生姓名、性別、年齡、城市信息。分析需求發現,對于一所學校的新生,他們的年齡基本一致都是7歲或8歲入學,而城市基本一致,性別只有男、女兩種情況。由此可見,如果將性別、年齡、城市設置為默認參數的話會大大提高學生信息錄入效率,據此編寫函數,如圖5-3所示。

圖5-3

輸出結果如圖5-4所示。

圖5-4

5.3.3 關鍵字參數

Python中有兩種類型的關鍵字參數:


□ 對于函數調用方,可以使用參數名傳遞參數值的參數;

□ 對于函數定義方,可以定義一個參數,這個參數類似于**kwargs形式,這個參數會接收所有命名參數。


上面關于小學生信息注冊的函數就屬于第一種關鍵字參數,我們發現,在調用register函數的時候使用了類似于gender = ‘男'這樣的寫法,這就是第一種關鍵字參數。

下面以第二種情況舉個例子:

編寫函數:

    def foo(*positional, **keywords):
        print("Positional:", positional)
        print("Keywords:", keywords)

調用函數:

    >>> foo('one', 'two', 'three')

輸出:

    Positional: ('one', 'two', 'three')
    Keywords: {}

由此可見參數*positional接收了全部位置參數(positional argument)。

下面再看看關鍵字參數的調用:

    >>> foo(a='one', b='two', c='three')

輸出:

    Positional: ()
    Keywords: {'a': 'one', 'b': 'two', 'c': 'three'}

此時雖然傳遞的參數個數、參數值都沒有變,但是為每個參數都傳遞了名字,輸出結果正好相反,第一次*positional接收了參數,第二次**keywords接收了參數。另外還可以看出positional是元組類型,keywords是字典類型。

下面再看一個混合調用的情況:

    >>> foo('one','two',c='three',d='four')

輸出:

    Positional: ('one', 'two')
    Keywords: {'c': 'three', 'd': 'four'}

符合我們的推測,*positional接收位置參數, **keywords接收命名參數。

主站蜘蛛池模板: 孙吴县| 泾阳县| 仙桃市| 翁源县| 高州市| 道孚县| 浪卡子县| 伊通| 盖州市| 栾城县| 深泽县| 民丰县| 定日县| 岳池县| 潮安县| 江津市| 韶山市| 五华县| 扶余县| 宁蒗| 凌云县| 乐陵市| 鲜城| 广州市| 扎鲁特旗| 元阳县| 濉溪县| 贞丰县| 浮梁县| 太湖县| 田阳县| 玛曲县| 平阴县| 鹤峰县| 沈丘县| 乐山市| 玉屏| 阿拉善右旗| 镇坪县| 繁峙县| 郎溪县|