国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

FingerLiu / 2839人閱讀

摘要:有一點需要注意的是,默認參數需要設置在必選參數后面,并且默認參數既可以通過位置調用,也可以通過關鍵字調用。通過位置指定參數通過位置指定參數報錯,默認參數必須在必選參數后面參數默認值既支持關鍵字參數,也支持僅限關鍵字參數。

函數參數處理機制是Python中一個非常重要的知識點,隨著Python的演進,參數處理機制的靈活性和豐富性也在不斷增加,使得我們不僅可以寫出簡化的代碼,也能處理復雜的調用。

關鍵字參數

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

關鍵字參數是Python函數中最基礎也最常見的,我們寫一個記賬的函數,參數是需要記錄的時間和金額。

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

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

位置調用

關鍵字調用

位置調用,就是按參數的位置進行調用,例如傳入兩個參數,第一個是字符串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__方法

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中,引入了一種新的僅限關鍵字參數,能實現我們的需求。

下面將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代碼擁有更高的可讀性,適應更加復雜的應用場景。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41965.html

相關文章

  • 所不知道Python | 字符串格式化演進之路

    摘要:然而為了讓我們更方便的使用這個常用功能,語言本身也在對字符串格式化方法進行迭代。不少使用過的小伙伴會知道其中的模板字符串,采用直接在字符串中內嵌變量的方式進行字符串格式化操作,在版本中也為我們帶來了類似的功能字面量格式化字符串,簡稱。 字符串格式化對于每個語言來說都是一個非?;A和常用的功能,學習Python的同學大概都知道可以用%語法來格式化字符串。然而為了讓我們更方便的使用這個常用...

    Blackjun 評論0 收藏0
  • 所不知道Python | 字符串連接秘密

    摘要:私房菜輸出私房菜方法使用方法方法是中出現的一種代替操作符的字符串格式化方法,同樣可以用來連接字符串。私房菜方法使用方法字符串有一個內置方法,其參數是一個序列類型,例如數組或者元組等。 showImg(https://segmentfault.com/img/bVbcR8e?w=578&h=375); 字符串連接,就是將2個或以上的字符串合并成一個,看上去連接字符串是一個非?;A的小問題...

    alin 評論0 收藏0
  • 所不知道JavaScript(三)

    摘要:的異步函數不會馬上執行,而是先注冊監聽,等到事件觸發了,就將這個回調函數壓入事件隊列中,等待順序運行的任務隊列空了以后,再執行事件隊列中的函數。 第五章 語法 {…}一個代碼塊會返回最后一個語句的結果值,可以用eval()去獲得(不建議),{}在不同情況下意思不同,可以是語句塊、對象常量、解構賦值或者命名函數參數,在代碼塊中有一個坑,{}+[]//0,{}是一個空執行塊(不執行任...

    OBKoro1 評論0 收藏0
  • 所不知道 ? PHP 自動加載

    前言 很多的小伙伴在,學習 PHP 的時候最早面對的問題之一就是 require 、 include 和 require_once 、include_once 的相愛相殺。 在了解了它們相愛相殺的故事后,往往就開始使用起了框架??蚣芄倘皇歉苫畹暮霉ぞ撸悄阒滥闫綍r new 一個新類的時候,發生了什么嗎?有想過為什么我們 遵循規范 就會自動的幫我們做好一切的加載嗎? 讓我們一切來探索發現其中的奧...

    sixgo 評論0 收藏0
  • JavaScript精進之路 — 異步實現(上)

    摘要:回調函數是處理異步邏輯最基礎的方法,但也有著各種的缺點?;卣{函數必須遵守的原則就是信任,但要核實。異步的進化一前面一部分已經描述到了回調函數的兩個問題分別是缺乏順序性和缺乏可信任性。 要帶著問題學,活學活用,學用結合,急用先學,立竿見影,在「用」字上狠下功夫。 廢話少說。這是這個專題的第二部分內容,異步。主要總結了《你不知道的JavaScript(中卷)》中有關于異步的內容。顯然一下子...

    kidsamong 評論0 收藏0

發表評論

0條評論

FingerLiu

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<