python中星号怎么打出来_Python中的星号:用途及使用方法
原作者:Trey Hunner
Python中 *和**很常見。無論是對(duì)于編程萌新還是許多從其他編程語言(可能無與之完全等效的運(yùn)算符)遷移過來的的人,這兩個(gè)運(yùn)算符有時(shí)可能有點(diǎn)兒神秘。在此,我想詳述這些運(yùn)算符的用途及其多種使用方式。
這些年來,*和**運(yùn)算符的本領(lǐng)越來越大,我將討論當(dāng)前這些運(yùn)算符的所有使用方式,并標(biāo)注哪些用途僅適用于Python的現(xiàn)代版本。所以,如果您在Python 2時(shí)代就學(xué)會(huì)了*和**,我還是建議您至少瀏覽一下這篇文章,因?yàn)镻ython 3為這些運(yùn)算符添加了很多新用途。
如果您初學(xué)Python,還不熟悉關(guān)鍵字參數(shù)(又名命名參數(shù)),那么我建議先閱讀我的關(guān)于Python關(guān)鍵字參數(shù)的文章。
不在本文詳述范圍內(nèi)的內(nèi)容:
本文所述的*和**,指的是*和**前綴運(yùn)算符,而不是中綴運(yùn)算符。
所以指的不是乘法和乘冪:
本文所述之內(nèi)容:我們講的是*和**前綴運(yùn)算符,即在變量前面使用的*和**運(yùn)算符。例如:
這包括:
使用*和**將參數(shù)傳遞給函數(shù)
使用*和**捕捉傳遞到函數(shù)中的參數(shù)
使用*接受強(qiáng)制關(guān)鍵字參數(shù)
使用*在元組拆包封期間時(shí)捕獲各項(xiàng)
使用*將迭代器解解包到列表/元組中
用**把詞典解包到其他詞典
即便您認(rèn)為您熟悉所有這些*和**的使用方法,我仍建議您查看下面的每個(gè)代碼塊,以確保它們都是您熟悉的。在過去的幾年中,Python核心開發(fā)人員一直在為這些運(yùn)算符添加新功能,*和**的一些新用途很容易被忽略。
星號(hào)在函數(shù)調(diào)用中解包參數(shù)
調(diào)用函數(shù)時(shí),使用*運(yùn)算符可將迭代對(duì)象解包到不同參數(shù)中:
print(*fruits)將fruits列表中的所有項(xiàng)作為單獨(dú)的參數(shù)傳遞到print函數(shù)調(diào)用中,我們甚至不需要知道列表包含多少個(gè)參數(shù)。
*運(yùn)算符不僅僅是語法糖。如果沒有*,除非列表是固定長度的,否則無法做到將特定迭代對(duì)象中的所有項(xiàng)作為單獨(dú)的參數(shù)提交。
下面是另一個(gè)例子:
在這里,我們接受以列表為元素的列表,并返回 “轉(zhuǎn)置”后的列表:
**運(yùn)算符執(zhí)行類似的操作,但是使用關(guān)鍵字參數(shù)。**操作符允許我們?nèi)∫粋€(gè)鍵值對(duì)字典,并將其在函數(shù)調(diào)用中解包成關(guān)鍵字參數(shù):
根據(jù)我的經(jīng)驗(yàn),**用于將關(guān)鍵字參數(shù)解包到函數(shù)調(diào)用中并不常見。我看到的最常見的地方是執(zhí)行繼承:調(diào)用super()通常會(huì)用到*和**。
截至Python3.5,函數(shù)調(diào)用中*和**均可被多次使用。
使用*多次有時(shí)也挺方便的:
使用**多次與之類似:
但是,當(dāng)使用**多次時(shí),需要小心。Python中的函數(shù)不能多次指定相同的關(guān)鍵字參數(shù),因?yàn)槊總€(gè)字典中與**一起使用的鍵必須是不同的,否則將拋出異常。
星號(hào)用于打包函數(shù)中的參數(shù)
*運(yùn)算符在定義函數(shù)時(shí),用于收集所有的位置參數(shù)到一個(gè)新的元組:
Python的print和zip函數(shù)接受任意數(shù)量的位置參數(shù)。這個(gè)運(yùn)用*的參數(shù)打包方法允許我們構(gòu)造同print和zip相類似的接受任意數(shù)量參數(shù)的函數(shù)。
**運(yùn)算符還有另一面:在定義函數(shù)時(shí),可以使用**將賦予該函數(shù)的任何關(guān)鍵字參數(shù)捕捉到字典中:
**將捕捉我們賦予這個(gè)函數(shù)的任何關(guān)鍵字參數(shù),并將其放入一個(gè)字典中,該字典將引用attributes參數(shù)。
同時(shí)使用位置參數(shù)與強(qiáng)制關(guān)鍵字參數(shù)時(shí)
自Python 3始,我們現(xiàn)有一個(gè)特殊的語法來接受強(qiáng)制關(guān)鍵字參數(shù)。強(qiáng)制關(guān)鍵字參數(shù)是只能使用關(guān)鍵字語法指定的函數(shù)參數(shù),這意味著它們不能依據(jù)相對(duì)位置指定。
若要接受強(qiáng)制關(guān)鍵字參數(shù),可在定義函數(shù)時(shí)于*后放置命名參數(shù):
上面的函數(shù)可以這樣使用:
參數(shù)dictionary和default在*keys之后出現(xiàn),這意味著它們只能被指定為關(guān)鍵字參數(shù)。如果我們?cè)噲D依據(jù)位置指定它們,我們將收到報(bào)錯(cuò):
Python中的此種情況將在PEP 3102詳述
無位置參數(shù)只有強(qiáng)制關(guān)鍵字參數(shù)時(shí)
強(qiáng)制關(guān)鍵字參數(shù)特性很酷,但若想在不捕獲過多的無限位置參數(shù)的情況下獲取強(qiáng)制關(guān)鍵字參數(shù),該如何操作?
Python語法里允許用一個(gè)略怪異的*實(shí)現(xiàn)它:
這個(gè)函數(shù)接受iterable參數(shù),該參數(shù)可以按相對(duì)位置被指定(作為第一個(gè)參數(shù)),或者依據(jù)名稱指定,而fillvalue參數(shù)是強(qiáng)制關(guān)鍵字參數(shù)。這意味著我們可以這樣調(diào)用with_previous:
但不是這樣:
此函數(shù)接受兩個(gè)參數(shù),其一fillvalue必須被指定為關(guān)鍵字參數(shù)。
我在捕捉任意數(shù)量的位置參數(shù)時(shí)通常使用強(qiáng)制關(guān)鍵字參數(shù),但有時(shí)還是會(huì)使用*來強(qiáng)制參數(shù)僅通過位置指定。
Python內(nèi)置的sorted函數(shù)實(shí)際上使用了這種方法。如果查看sorted的幫助信息,您將看到以下內(nèi)容:
此例有一個(gè)單獨(dú)的*,在sorted的文檔化的參數(shù)中。
星號(hào)用于元組解包
Python 3還新增了一種使用*運(yùn)算符的方法,它只與前文所述的函數(shù)定義與函數(shù)調(diào)用時(shí)*表現(xiàn)出的特性有關(guān)。
如今*運(yùn)算符也可以用于元組解包:
如果您想知道“自己的代碼中可以在哪里使用它”,請(qǐng)看一下我所著關(guān)于Python中的元組解包的文章中的示例。在這篇文章中,我展示了使用*運(yùn)算符替代完成序列切片的一些場景。
通常,當(dāng)我講授*時(shí),總強(qiáng)調(diào)只能在一個(gè)簡單的多重賦值調(diào)用中使用一種*表達(dá)。這在技術(shù)上是不正確的,因?yàn)樵谇短仔问降慕獍锌梢允褂脙煞N(我在元組解包文章中會(huì)談到嵌套形式的解包):
不過我還沒找到這個(gè)的好例子,即使你找到了,我也不建議使用它,因?yàn)樗雌饋碛悬c(diǎn)晦澀。
Python 3中PEP是PEP 3132加入了這個(gè),并不長。
未完,下篇請(qǐng)看今日推送的第二篇文字
英文原文:http://treyhunner.com/2018/10/asterisks-in-python-what-they-are-and-how-to-use-them/
譯者:盈韜
總結(jié)
以上是生活随笔為你收集整理的python中星号怎么打出来_Python中的星号:用途及使用方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab模拟斜抛运动60,大学物理教
- 下一篇: Android端外推送到底有多烦?(转载