你所不知道的Python | 函數參數的演進之路

函數參數處理機制是Python中一個很是重要的知識點,隨着Python的演進,參數處理機制的靈活性和豐富性也在不斷增長,使得咱們不只能夠寫出簡化的代碼,也能處理複雜的調用。python

關鍵字參數

調用時指定參數的名稱,且與函數聲明時的參數名稱一致。函數

關鍵字參數是Python函數中最基礎也最多見的,咱們寫一個記帳的函數,參數是須要記錄的時間和金額。spa

def add_record(date, amount):
    print('date:', date, 'amount:', amount)

這裏的amount參數就是一個關鍵字參數,關鍵字參數支持兩種調用方式:code

  • 位置調用
  • 關鍵字調用

位置調用,就是按參數的位置進行調用,例如傳入兩個參數,第一個是字符串2018-07-06,第二個是整數10,那麼這兩個參數會被分別賦予date和amount變量,若是順序反過來,則這兩個參數分別賦予amount和date變量。文檔

add_record('2018-07-06', 10)  # 輸出date: 2018-07-06 amount: 10
add_record(10, '2018-07-06')  # 輸出date: 10 amount: 2018-07-06

關鍵字調用,能夠忽略參數順序,直接指定參數。字符串

add_record(amount=10, date='2018-07-06')  # 雖然參數順序反了,可是使用了關鍵字調用,因此依然輸出date: 2018-07-06 amount: 10

僅限關鍵字參數

咱們定義一個Person類,並實現它的__init__方法it

class Person(object):
    def __init__(self, name, age,  gender, height, weight):
        self._name = name
        self._age = age
        self._gender = gender
        self._height = height
        self._weight = weight

當初始化這個類的時候,咱們能夠使用關鍵字調用,也能夠使用位置調用。入門

Person('Wendy', 24, 'female', 160, 48)
Person('John', age=27, gender='male', height=170, weight=52)

對比上面兩種方式,咱們會發現參數多的時候經過關鍵字指定參數不只更加清晰,也更具備可讀性。若是咱們但願函數只容許關鍵字調用,該如何作呢?Python 3.0中,引入了一種新的僅限關鍵字參數,能實現咱們的需求。class

下面將age之後的參數修改成只容許關鍵字調用,定義函數時想指定僅限關鍵字參數,要把它們放到前面有星號的參數後面,在Python中有星號的參數是可變參數的意思,若是不想支持可變參數,能夠在參數中放一個星號做爲分割。基礎

class Person(object):
        # 參數中的星號做爲關鍵字參數和僅限關鍵字參數的分割
    def __init__(self, name, *, age='22', gender='female', height=160, weight=50):
        self._name = name
        self._age = age
        self._gender = gender
        self._height = height
        self._weight = weight

Person('Wendy', 24, 'female', 160, 48)  # 報錯,age之後參數不容許位置調用
Person('John', age=27, gender='male', height=170, weight=52)  # 正常執行

普通參數和僅限關鍵字參數中間由一個星號隔離開,星號之後的都是僅限關鍵字參數,只能夠經過關鍵字指定,而不能經過位置指定。

參數默認值

在函數聲明時,指定參數默認值,調用時不傳入參數則使用默認值,至關於可選參數。

def add_record(date, amount=0):
    print('date:', date, 'amount:', amount)

add_record('2018-07-06')  # 輸出date: 2018-07-06 amount: 0

上面代碼中沒有傳入amount參數,因此amount直接被置爲默認值0。有一點須要注意的是,默認參數須要設置在必選參數後面,而且默認參數既能夠經過位置調用,也能夠經過關鍵字調用。

add_record('2018-07-06', 10)  # 經過位置指定參數
add_record('2018-07-06', amount=10)  # 經過位置指定參數
add_record(amount=10, '2018-07-06')  # 報錯,默認參數必須在必選參數後面

參數默認值既支持關鍵字參數,也支持僅限關鍵字參數。

可變長參數

「可變長」顧名思義是容許在調用時傳入多個參數,可變長參數適用於參數數量不肯定的場景,可變參數有兩種,一種是關鍵字可變長參數,另外一種是非關鍵字可變長參數。

非關鍵字可變長參數的寫法是在參數名前加一個星號,Python會將這些多出來的參數的值放入一個元組中,因爲元組中只有參數值而沒有參數名稱,因此是非關鍵字參數。

def print_args(*args):
    print(args)

print_args(1, 2, 3, 4, 5)  # 輸出元組(1, 2, 3, 4, 5)

a = [1, 2, 3, 4, 5]
print_args(a)  # 直接傳入時,列表a會被看成一個元素,因此輸出([1, 2, 3, 4, 5],)
print_args(*a)  # 在傳參時加星號能夠將可迭代參數解包,因此列表a中每個元素都被看成一個參數傳入,輸出(1, 2, 3, 4, 5)

關鍵字可變長參數的寫法是在參數名前加兩個星號,Python會將這些多出來的參數的值放入一個字典中,因爲字典中只有參數值而沒有參數名稱,因此是關鍵字參數。

def print_kwargs(**kw_args):
    print(kw_args)

a = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
print_kwargs(**a)  # 使用關鍵字可變參數時, {'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4}

函數註解

Python 3中爲函數定義增長的另外一個新功能是函數註解,所謂函數註解,就是能夠在函數參數和返回值上添加任意的元數據。

def create_person(name: str, age: int, gender: str = 'female', height: int = 160)  -> bool:
    return True

用create_person方法舉例,能夠看到在每一個參數後面都跟了一個參數類型,在函數後面則是返回值類型,函數註解能夠用在文檔編寫、類型檢查中,在支持函數註解的IDE中,若是傳入參數和返回的類型不符合函數註解中的類型,IDE會提示錯誤。

可是函數註解只是一個元數據,Python解釋器執行時候並不會去檢查類型,因此下面這種狀況也是合法的。

Person(name=123, age='John')  # 並不會報錯

總結

Python有着很是好入門的特色,可是隨着語言自己的演進,不少高級功能也在持續加入,用好這些功能能夠使咱們的Python代碼擁有更高的可讀性,適應更加複雜的應用場景。

掃碼關注【Python私房菜】,我會在這裏持續發佈Python相關原創技術文章

相關文章
相關標籤/搜索