【python小技巧2】星號(*)和斜杠(/)的妙用

先來自測一下:
答案:
如果你感到猶豫,請接著往下看吧。

一、星號的用途
a * b 代表乘法,如 3 * 2 得到 6
a ** b 代表乘方,如 3 ** 2 得到 9
x ** y <==>?pow(x, y)? ? ? ? x ** y % z <==>?pow(x, y, z)
細(xì)節(jié):先算乘方后算乘法,且同為乘法從左向右,同為乘方從右向左。所以開頭的 c 的值是 512 而不是 128,更不是 65536
函數(shù)定義時:
*args 這種寫法,稱為可變長位置參數(shù)。
額外的位置參數(shù)將“吸入”這個args,args是一個元組。
**kwargs 這種寫法,稱為可變長關(guān)鍵字參數(shù)。
額外的關(guān)鍵字參數(shù)將以鍵值對的形式“吸入”這個kwargs中,kwargs是一個字典。
注意:可變長關(guān)鍵字參數(shù) 和 可變長位置參數(shù)都至多存在一個
以上兩種參數(shù),統(tǒng)稱可變長參數(shù)
且 *args 必須在 **kwargs 前面
def?f(a, *, b):?pass這種寫法
將后面的所有參數(shù)設(shè)置為 keyword only argument,即只能用關(guān)鍵字傳參。
這里的 a 兩種傳參都可以,而 b 只能使用關(guān)鍵字傳參。為什么?因?yàn)檫@個 * 雖然沒有參數(shù)名字,但它將所有額外的位置參數(shù)都“吸入”這個 * 里,所以 b 只能用關(guān)鍵字傳參
序列解包 / 拆包
*args 將一個序列展開
**kwargs 將一個字典以鍵值對形式展開(其實(shí)不止字典,任何 mapping 都可以,常見的還有?collections.defaultdict,?collections.OrderedDict?以及 collections.Counter 等)
e.g.
????????????不僅可以在函數(shù)調(diào)用時解包傳參,也可用在賦值語句等。e.g.
????????????也可寫在左值,用于拆包哦
????????????注意: 這樣寫出來的 b 是一個列表,不是元組
????5. 正則表達(dá)式
????????匹配前面的子表達(dá)式 0 次或多次

二、斜杠的用途
a / b 代表 truediv,emmm...將其譯為真除吧(網(wǎng)上沒找到更好的翻譯),返回浮點(diǎn)數(shù),如 11 / 2?得到 5.5
a // b 代表floordiv,即整除,返回整數(shù),如 11 // 2?得到 5
函數(shù)定義時,斜杠前面的參數(shù)成為 positional only argument,只能使用位置傳參,不能使用關(guān)鍵字。e.g.
總結(jié):
* 用于乘法、乘方等;也用于序列解包拆包;函數(shù)定義時作可變長參數(shù)標(biāo)志,將其后面的參數(shù)設(shè)置為僅關(guān)鍵字參數(shù)
/ 用于 2 種除法;函數(shù)定義時將其前面的參數(shù)設(shè)置為僅位置參數(shù)
END

參考資料:
https://docs.python.org/3.8/tutorial/controlflow.html