摘要:有一點(diǎn)需要注意的是,默認(rèn)參數(shù)需要設(shè)置在必選參數(shù)后面,并且默認(rèn)參數(shù)既可以通過位置調(diào)用,也可以通過關(guān)鍵字調(diào)用。通過位置指定參數(shù)通過位置指定參數(shù)報(bào)錯(cuò),默認(rèn)參數(shù)必須在必選參數(shù)后面參數(shù)默認(rèn)值既支持關(guān)鍵字參數(shù),也支持僅限關(guān)鍵字參數(shù)。
函數(shù)參數(shù)處理機(jī)制是Python中一個(gè)非常重要的知識點(diǎn),隨著Python的演進(jìn),參數(shù)處理機(jī)制的靈活性和豐富性也在不斷增加,使得我們不僅可以寫出簡化的代碼,也能處理復(fù)雜的調(diào)用。
關(guān)鍵字參數(shù)調(diào)用時(shí)指定參數(shù)的名稱,且與函數(shù)聲明時(shí)的參數(shù)名稱一致。
關(guān)鍵字參數(shù)是Python函數(shù)中最基礎(chǔ)也最常見的,我們寫一個(gè)記賬的函數(shù),參數(shù)是需要記錄的時(shí)間和金額。
def add_record(date, amount): print("date:", date, "amount:", amount)
這里的amount參數(shù)就是一個(gè)關(guān)鍵字參數(shù),關(guān)鍵字參數(shù)支持兩種調(diào)用方式:
位置調(diào)用
關(guān)鍵字調(diào)用
位置調(diào)用,就是按參數(shù)的位置進(jìn)行調(diào)用,例如傳入兩個(gè)參數(shù),第一個(gè)是字符串2018-07-06,第二個(gè)是整數(shù)10,那么這兩個(gè)參數(shù)會被分別賦予date和amount變量,如果順序反過來,則這兩個(gè)參數(shù)分別賦予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
關(guān)鍵字調(diào)用,可以忽略參數(shù)順序,直接指定參數(shù)。
add_record(amount=10, date="2018-07-06") # 雖然參數(shù)順序反了,但是使用了關(guān)鍵字調(diào)用,所以依然輸出date: 2018-07-06 amount: 10僅限關(guān)鍵字參數(shù)
我們定義一個(gè)Person類,并實(shí)現(xiàn)它的__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
當(dāng)初始化這個(gè)類的時(shí)候,我們可以使用關(guān)鍵字調(diào)用,也可以使用位置調(diào)用。
Person("Wendy", 24, "female", 160, 48) Person("John", age=27, gender="male", height=170, weight=52)
對比上面兩種方式,我們會發(fā)現(xiàn)參數(shù)多的時(shí)候通過關(guān)鍵字指定參數(shù)不僅更加清晰,也更具有可讀性。如果我們希望函數(shù)只允許關(guān)鍵字調(diào)用,該如何做呢?Python 3.0中,引入了一種新的僅限關(guān)鍵字參數(shù),能實(shí)現(xiàn)我們的需求。
下面將age以后的參數(shù)修改為只允許關(guān)鍵字調(diào)用,定義函數(shù)時(shí)想指定僅限關(guān)鍵字參數(shù),要把它們放到前面有星號的參數(shù)后面,在Python中有星號的參數(shù)是可變參數(shù)的意思,如果不想支持可變參數(shù),可以在參數(shù)中放一個(gè)星號作為分割。
class Person(object): # 參數(shù)中的星號作為關(guān)鍵字參數(shù)和僅限關(guān)鍵字參數(shù)的分割 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) # 報(bào)錯(cuò),age以后參數(shù)不允許位置調(diào)用 Person("John", age=27, gender="male", height=170, weight=52) # 正常執(zhí)行
普通參數(shù)和僅限關(guān)鍵字參數(shù)中間由一個(gè)星號隔離開,星號以后的都是僅限關(guān)鍵字參數(shù),只可以通過關(guān)鍵字指定,而不能通過位置指定。
參數(shù)默認(rèn)值在函數(shù)聲明時(shí),指定參數(shù)默認(rèn)值,調(diào)用時(shí)不傳入?yún)?shù)則使用默認(rèn)值,相當(dāng)于可選參數(shù)。
def add_record(date, amount=0): print("date:", date, "amount:", amount) add_record("2018-07-06") # 輸出date: 2018-07-06 amount: 0
上面代碼中沒有傳入amount參數(shù),所以amount直接被置為默認(rèn)值0。有一點(diǎn)需要注意的是,默認(rèn)參數(shù)需要設(shè)置在必選參數(shù)后面,并且默認(rèn)參數(shù)既可以通過位置調(diào)用,也可以通過關(guān)鍵字調(diào)用。
add_record("2018-07-06", 10) # 通過位置指定參數(shù) add_record("2018-07-06", amount=10) # 通過位置指定參數(shù) add_record(amount=10, "2018-07-06") # 報(bào)錯(cuò),默認(rèn)參數(shù)必須在必選參數(shù)后面
參數(shù)默認(rèn)值既支持關(guān)鍵字參數(shù),也支持僅限關(guān)鍵字參數(shù)。
可變長參數(shù)“可變長”顧名思義是允許在調(diào)用時(shí)傳入多個(gè)參數(shù),可變長參數(shù)適用于參數(shù)數(shù)量不確定的場景,可變參數(shù)有兩種,一種是關(guān)鍵字可變長參數(shù),另一種是非關(guān)鍵字可變長參數(shù)。
非關(guān)鍵字可變長參數(shù)的寫法是在參數(shù)名前加一個(gè)星號,Python會將這些多出來的參數(shù)的值放入一個(gè)元組中,由于元組中只有參數(shù)值而沒有參數(shù)名稱,所以是非關(guān)鍵字參數(shù)。
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) # 直接傳入時(shí),列表a會被當(dāng)作一個(gè)元素,所以輸出([1, 2, 3, 4, 5],) print_args(*a) # 在傳參時(shí)加星號可以將可迭代參數(shù)解包,所以列表a中每一個(gè)元素都被當(dāng)作一個(gè)參數(shù)傳入,輸出(1, 2, 3, 4, 5)
關(guān)鍵字可變長參數(shù)的寫法是在參數(shù)名前加兩個(gè)星號,Python會將這些多出來的參數(shù)的值放入一個(gè)字典中,由于字典中只有參數(shù)值而沒有參數(shù)名稱,所以是關(guān)鍵字參數(shù)。
def print_kwargs(**kw_args): print(kw_args) a = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5} print_kwargs(**a) # 使用關(guān)鍵字可變參數(shù)時(shí), {"a": 1, "c": 3, "b": 2, "e": 5, "d": 4}函數(shù)注解
Python 3中為函數(shù)定義增加的另一個(gè)新功能是函數(shù)注解,所謂函數(shù)注解,就是可以在函數(shù)參數(shù)和返回值上添加任意的元數(shù)據(jù)。
def create_person(name: str, age: int, gender: str = "female", height: int = 160) -> bool: return True
用create_person方法舉例,可以看到在每個(gè)參數(shù)后面都跟了一個(gè)參數(shù)類型,在函數(shù)后面則是返回值類型,函數(shù)注解可以用在文檔編寫、類型檢查中,在支持函數(shù)注解的IDE中,如果傳入?yún)?shù)和返回的類型不符合函數(shù)注解中的類型,IDE會提示錯(cuò)誤。
但是函數(shù)注解只是一個(gè)元數(shù)據(jù),Python解釋器執(zhí)行時(shí)候并不會去檢查類型,所以下面這種情況也是合法的。
Person(name=123, age="John") # 并不會報(bào)錯(cuò)總結(jié)
Python有著非常好入門的特點(diǎn),但是隨著語言本身的演進(jìn),很多高級功能也在持續(xù)加入,用好這些功能可以使我們的Python代碼擁有更高的可讀性,適應(yīng)更加復(fù)雜的應(yīng)用場景。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41965.html
摘要:然而為了讓我們更方便的使用這個(gè)常用功能,語言本身也在對字符串格式化方法進(jìn)行迭代。不少使用過的小伙伴會知道其中的模板字符串,采用直接在字符串中內(nèi)嵌變量的方式進(jìn)行字符串格式化操作,在版本中也為我們帶來了類似的功能字面量格式化字符串,簡稱。 字符串格式化對于每個(gè)語言來說都是一個(gè)非?;A(chǔ)和常用的功能,學(xué)習(xí)Python的同學(xué)大概都知道可以用%語法來格式化字符串。然而為了讓我們更方便的使用這個(gè)常用...
摘要:私房菜輸出私房菜方法使用方法方法是中出現(xiàn)的一種代替操作符的字符串格式化方法,同樣可以用來連接字符串。私房菜方法使用方法字符串有一個(gè)內(nèi)置方法,其參數(shù)是一個(gè)序列類型,例如數(shù)組或者元組等。 showImg(https://segmentfault.com/img/bVbcR8e?w=578&h=375); 字符串連接,就是將2個(gè)或以上的字符串合并成一個(gè),看上去連接字符串是一個(gè)非?;A(chǔ)的小問題...
摘要:的異步函數(shù)不會馬上執(zhí)行,而是先注冊監(jiān)聽,等到事件觸發(fā)了,就將這個(gè)回調(diào)函數(shù)壓入事件隊(duì)列中,等待順序運(yùn)行的任務(wù)隊(duì)列空了以后,再執(zhí)行事件隊(duì)列中的函數(shù)。 第五章 語法 {…}一個(gè)代碼塊會返回最后一個(gè)語句的結(jié)果值,可以用eval()去獲得(不建議),{}在不同情況下意思不同,可以是語句塊、對象常量、解構(gòu)賦值或者命名函數(shù)參數(shù),在代碼塊中有一個(gè)坑,{}+[]//0,{}是一個(gè)空執(zhí)行塊(不執(zhí)行任...
前言 很多的小伙伴在,學(xué)習(xí) PHP 的時(shí)候最早面對的問題之一就是 require 、 include 和 require_once 、include_once 的相愛相殺。 在了解了它們相愛相殺的故事后,往往就開始使用起了框架。框架固然是干活的好工具,但是你知道你平時(shí) new 一個(gè)新類的時(shí)候,發(fā)生了什么嗎?有想過為什么我們 遵循規(guī)范 就會自動(dòng)的幫我們做好一切的加載嗎? 讓我們一切來探索發(fā)現(xiàn)其中的奧...
摘要:回調(diào)函數(shù)是處理異步邏輯最基礎(chǔ)的方法,但也有著各種的缺點(diǎn)?;卣{(diào)函數(shù)必須遵守的原則就是信任,但要核實(shí)。異步的進(jìn)化一前面一部分已經(jīng)描述到了回調(diào)函數(shù)的兩個(gè)問題分別是缺乏順序性和缺乏可信任性。 要帶著問題學(xué),活學(xué)活用,學(xué)用結(jié)合,急用先學(xué),立竿見影,在「用」字上狠下功夫。 廢話少說。這是這個(gè)專題的第二部分內(nèi)容,異步。主要總結(jié)了《你不知道的JavaScript(中卷)》中有關(guān)于異步的內(nèi)容。顯然一下子...
閱讀 2120·2023-04-26 00:50
閱讀 2490·2021-10-13 09:39
閱讀 2225·2021-09-22 15:34
閱讀 1619·2021-09-04 16:41
閱讀 1348·2019-08-30 15:55
閱讀 2441·2019-08-30 15:53
閱讀 1714·2019-08-30 15:52
閱讀 754·2019-08-29 16:19