日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

詳解Python 函數(shù)參數(shù)的拆解

瀏覽:26日期:2022-07-12 15:14:23

本文為閱讀 《Python Tricks: The Book》一書的 3.5 Function Argument Unpacking 的筆記與擴充理解。函數(shù)參數(shù)拆解是定義可變參數(shù)(VarArgs) *args 和 **kwargs 的反向特性。

*args 和 **kwars 是函數(shù)可定義一個形參來接收傳入的不定數(shù)量的實參。

而這里的函數(shù)參數(shù)拆解是形參定義多個,在調(diào)用時只傳入一個集合類型對象(帶上 * 或 ** 前綴),如 list, tuple, dict, 甚至是 generator, 然后函數(shù)能自動從集合對象中取得對應(yīng)的值。

如果能理解下面賦值時的參數(shù)拆解和 Python 3.5 的新增 * ** 操作,那么于本文講述的特性就好理解了。

唯一的不同時作為參數(shù)的集合傳入函數(shù)時必須前面加上 * 或 **, 以此宣告該參數(shù)將被拆解,而非一個整體作為一個函數(shù)參數(shù)。加上 * 或 ** 與 Java 的 @SafeVarargs 有類似的功效,最接近的是 Scala 的 foo(Array[String]('d', 'e') : _*) 寫法。參見:Java 和 Scala 調(diào)用變參的方式

Python 的賦值拆解操作

>>> a, b = [1, 2] # a, b = (1, 2) 也是一樣的效果>>> print(a, b)1 2>>> a, b = {’x’: 1, ’y’:2}>>> print(a, b)x y>>> a, b = {’x’: 1, ’y’:2}.keys()>>> print(a, b)x y>>> a, b = {’x’: 1, ’y’:2}.values()>>> print(a, b)1 2>>> a, b = (x * x for x in range(2))>>> print(a, b)0 1

Python 3.5 的新增拆解操作

>>> [1, 2, *range(3), *[4, 5], *(6, 7)] # * 號能把集合打散,flatten(unwrap)[1, 2, 0, 1, 2, 4, 5, 6, 7]>>> {’x’: 1, **{’y’: 2, ’z’: 3}} # ** 把字典打散, flatten(unwrap) 操作{’x’: 1, ’y’: 2, ’z’: 3}

有些像是函數(shù)編程中的 flatten 或 unwrap 操作。

有了上面的基礎(chǔ)后,再回到原書中的例子,當我們定義如下打印 3-D 坐標的函數(shù)

def print_vector(x, y, z): print(’<%s, %s, %s>’ % (x, y, z))

依次傳入三個參數(shù)的方式就不值不提了,現(xiàn)在就看如何利用函數(shù)的參數(shù)拆解特性,只傳入一個集合參數(shù),讓該 print_vector 函數(shù)準確從集合中獲得相應(yīng)的 x, y, 和 z 的值。

函數(shù)參數(shù)拆解的調(diào)用舉例

>>> list_vec = [2, 1, 3]>>> print_vector(*list_vec)<2, 1, 3>>>> print_vector(*(2, 1, 3))<2, 1, 3>>>> dict_vec = {’y’: 2, ’z’: 1, ’x’: 3}>>> print_vector(*dict_vec) # 相當于 print_vector(*dict_vec.keys())<y, z, x>>>> print_vector(**dict_vec) # 相當于 print_vector(dict_vec[’x’], dict_vec[’y’], dict_vec[’z’]<3, 2, 1>>>> genexpr = (x * x for x in range(3))>>> print_vector(*genexpr)<0, 1, 4>>>> print_vector(*dict_vec.values()) # 即 print_vector(*list(dict_vec.values()))<2, 1, 3>

注意 **dict_vec 有點不一樣,它的內(nèi)容必須是函數(shù) print_vector 的形參 ’x’, ’y’, ’z’ 作為 key 的三個元素。

以下是各種錯誤

**dict_vec 元素個數(shù)不對,或 key 不匹配時的錯誤

>>> print_vector(**{’y’: 2, ’z’: 1, ’x’: 3})<3, 2, 1>>>> print_vector(**{’y’: 2, ’z’: 1, ’a’: 3}) #元素個數(shù)是3 個,但出現(xiàn) x, y, z 之外的 keyTraceback (most recent call last): File '<pyshell#39>', line 1, in <module> print_vector(**{’y’: 2, ’z’: 1, ’a’: 3})TypeError: print_vector() got an unexpected keyword argument ’a’>>> print_vector(**{’y’: 2, ’z’: 1, ’x’: 3, ’a’: 4}) # 包含有 x, y, z, 但有四個元素,key ’a’ 不能識別Traceback (most recent call last): File '<pyshell#40>', line 1, in <module> print_vector(**{’y’: 2, ’z’: 1, ’x’: 3, ’a’: 4})TypeError: print_vector() got an unexpected keyword argument ’a’>>> print_vector(**{’y’: 2, ’z’: 1}) # 缺少 key ’x’ 對應(yīng)的元素Traceback (most recent call last): File '<pyshell#41>', line 1, in <module> print_vector(**{’y’: 2, ’z’: 1})TypeError: print_vector() missing 1 required positional argument: ’x’

不帶星星的錯誤

>>> print_vector([2, 1, 3])Traceback (most recent call last): File '<pyshell#44>', line 1, in <module> print_vector([2, 1, 3])TypeError: print_vector() missing 2 required positional arguments: ’y’ and ’z’

把集合對象整體作為第一個參數(shù),所以未傳入 y 和 z,因此必須用前綴 * 或 ** 通告函數(shù)進行參數(shù)拆解

集合長度與函數(shù)參數(shù)個數(shù)不匹配時的錯誤

>>> print_vector(*[2, 1]) # 拆成了 x=2, y=1, 然后 z 呢?Traceback (most recent call last): File '<pyshell#47>', line 1, in <module> print_vector(*[2, 1])TypeError: print_vector() missing 1 required positional argument: ’z’>>> print_vector(*[2, 1, 3, 4]) # 雖然拆出了 x=2, y=1, z=3, 但也別想強塞第四個元素給該函數(shù)(只定義的三個參數(shù))Traceback (most recent call last): File '<pyshell#48>', line 1, in <module> print_vector(*[2, 1, 3, 4])TypeError: print_vector() takes 3 positional arguments but 4 were given

上面這兩個錯誤與賦值時的拆解因元素個數(shù)不匹配時的錯誤是相對應(yīng)的

>>> a, b = [1]Traceback (most recent call last): File '<pyshell#54>', line 1, in <module> a, b = [1]ValueError: not enough values to unpack (expected 2, got 1)>>> a, b = [1, 2, 3]Traceback (most recent call last): File '<pyshell#55>', line 1, in <module> a, b = [1, 2, 3]ValueError: too many values to unpack (expected 2)

當然在賦值時 Python 可以像下面那樣做

a, b, *c = [1, 2, 3, 4]>>> print(a, b, c)1 2 [3, 4]

補充(2020-07-02): 迭代的拆解在 Python 中的術(shù)語是 Iterable Unpacking, 找到兩個相關(guān)的 PEP 448, PEP 3132。在實際上用處還是很大的,比如在拆分字符串時只關(guān)系自己有興趣的字段

line = ’2020-06-19 22:14:00 2688 abc.json’date, time, size, name = line.split() # 獲得所有字段值_, time, _, name = line.split() # 只對 time 和 name 有興趣date, *_ = line.split() # 只對第一個 date 有興趣*_, name = line.split() # 只對最后的 name 有興趣date, *_, name = line.split() # 對兩邊的 date, name 有興趣

這樣就避免了用索引號來引用拆分后的值,如 split[0], splint[2] 等,有名的變量不容易出錯。注意到 Python 在拆解時非常聰明,它知道怎么去對應(yīng)位置,用了星號(*) 的情況,明白如何處理前面跳過多少個,中間跳過多少個,或最后收集多少個元素。

鏈接:

PEP 448 -- Additional Unpacking GeneralizationsPEP 3132 -- Extended Iterable Unpacking

以上就是詳解Python 函數(shù)參數(shù)的拆解的詳細內(nèi)容,更多關(guān)于python 函數(shù)參數(shù)拆解的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久婷婷久久| 日韩一区二区在线免费| 999在线观看精品免费不卡网站| 99成人超碰| 欧美女激情福利| 首页国产欧美久久| 日韩欧美三区| 国际精品欧美精品| 欧美成人基地| 亚洲在线观看| 国产亚洲网站| 日本aⅴ精品一区二区三区 | 亚洲青青久久| 国产精品一区二区中文字幕| 成人日韩av| 日韩一区二区久久| 久久国产免费看| 欧洲av不卡| 中文字幕一区二区精品区| 国产高清亚洲| 久久青草久久| 中文无码久久精品| 亚洲精品影院在线观看| 美女久久久久久 | 欧美1区二区| 国产中文一区| 日本va欧美va瓶| 91一区二区| 中文字幕亚洲在线观看| 日本蜜桃在线观看视频| 中文字幕一区二区三区在线视频| 精品视频黄色| 免费欧美在线视频| 天堂√8在线中文| 久久亚洲欧洲| 国产精品白浆| 模特精品在线| 国产精品久久久久蜜臀| 一区二区三区国产在线| а√在线中文在线新版| 中文字幕亚洲精品乱码| 亚洲风情在线资源| 日韩精品视频在线看| 都市激情国产精品| 日产欧产美韩系列久久99| 久久激情婷婷| 国产激情久久| 天堂久久一区| 欧美精品一二| 免费在线亚洲| 丝袜美腿一区二区三区| 国产 日韩 欧美一区| 国产亚洲高清在线观看| 男女男精品网站| 久久国产精品成人免费观看的软件| 国产伦精品一区二区三区视频 | 欧美午夜三级| 亚洲一区亚洲| 日韩欧美少妇| 国产高清精品二区| 欧美专区在线| 欧美特黄一级大片| 精品一区二区三区视频在线播放 | 亚洲男女自偷自拍| 亚洲天堂免费电影| 久久在线91| 欧美天堂一区二区| 亚洲精品看片| 视频一区在线播放| 午夜欧美理论片| 丝袜av一区| 中文字幕在线视频久| 精品一区二区三区在线观看视频| 亚洲青青久久| 亚洲一区免费| 亚洲欧美日本国产专区一区| 亚洲韩日在线| 久久精品影视| 尤物tv在线精品| 婷婷成人在线| 欧美肉体xxxx裸体137大胆| 日韩电影免费在线观看| 国产一区日韩| 国产成人精品一区二区免费看京 | 日韩和欧美的一区| 蜜臀av亚洲一区中文字幕| 国产精品99免费看| 久久蜜桃av| 91久久中文| 久久午夜精品一区二区| 男女性色大片免费观看一区二区| 国产精品毛片| 天堂av在线一区| 亚洲综合日本| 亚洲综合专区| 久久精品xxxxx| 久久wwww| 国产传媒在线| 91精品在线观看国产| 久久精品播放| 国精品一区二区三区| 亚洲成人不卡| 亚洲女同一区| 亚洲精品婷婷| 国产精品一区二区精品 | 麻豆精品在线| caoporn视频在线| 999国产精品永久免费视频app| 免费欧美一区| 综合一区av| 国产精品亚洲二区| 国产成人久久精品一区二区三区| 成人亚洲欧美| 一区在线免费观看| 免费国产亚洲视频| 国产亚洲字幕| 成人三级高清视频在线看| 欧美日韩在线网站| 免费在线成人网| 国产精品sm| 伊人精品一区| 日本在线视频一区二区| 久久gogo国模啪啪裸体| 久久久久久久久久久妇女 | 国产精品精品| 亚洲国产一区二区三区在线播放| 久久av在线| 国产一精品一av一免费爽爽| 麻豆国产精品视频| 狠狠干综合网| 麻豆精品久久久| 亚洲高清久久| 91久久精品无嫩草影院| 国产成人77亚洲精品www| 欧美日韩国产高清电影| 日韩午夜视频在线| 成人日韩av| 巨乳诱惑日韩免费av| 嫩草伊人久久精品少妇av杨幂| 欧美日一区二区| 国产乱子精品一区二区在线观看 | 欧美中文一区| 久久久久久美女精品| 日本午夜精品视频在线观看| 天堂8中文在线最新版在线| 亚洲资源在线| 日本精品不卡| 国产欧美午夜| 好吊视频一区二区三区四区| 国产精品一区三区在线观看| 午夜国产一区二区| 你懂的网址国产 欧美| 在线视频日韩| 免费观看久久av| 日韩黄色在线观看| 四虎884aa成人精品最新| 日本午夜精品久久久| 人人香蕉久久| 四虎在线精品| 日韩1区在线| 日韩av一区二区在线影视| 国产 日韩 欧美一区| 欧美视频二区| 亚洲主播在线| 亚洲精品在线影院| 精品捆绑调教一区二区三区| 中文字幕视频精品一区二区三区| 99久久精品费精品国产| 日韩午夜视频在线| 不卡在线一区二区| 精品国产乱码久久久久久樱花 | 视频福利一区| 国产精品tv| 日韩高清一区| 久久国产福利| 国产在线欧美| 久久精品动漫| 国产精品99一区二区三| 国产精品久久久久久妇女 | 久久国产亚洲精品| 精品三级久久久| 青青国产91久久久久久| 免费的成人av| 国产亚洲一级| 亚洲黄色影院| 亚洲激情久久| 999精品一区| 正在播放日韩精品| 福利视频一区| 欧美极品中文字幕| 欧美日韩一区二区三区在线电影| 久久国产精品99国产| 欧美~级网站不卡| 播放一区二区| 日韩欧美另类一区二区| 在线天堂中文资源最新版| 精品国产一区二区三区2021| 国产精品chinese| 久久久国产精品网站| 久久影院资源站|