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

您的位置:首頁技術文章
文章詳情頁

詳解Python 函數參數的拆解

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

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

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

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

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

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

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}

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

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

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

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

函數參數拆解的調用舉例

>>> 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 有點不一樣,它的內容必須是函數 print_vector 的形參 ’x’, ’y’, ’z’ 作為 key 的三個元素。

以下是各種錯誤

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

>>> print_vector(**{’y’: 2, ’z’: 1, ’x’: 3})<3, 2, 1>>>> print_vector(**{’y’: 2, ’z’: 1, ’a’: 3}) #元素個數是3 個,但出現 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’ 對應的元素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’

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

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

>>> 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, 但也別想強塞第四個元素給該函數(只定義的三個參數)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

上面這兩個錯誤與賦值時的拆解因元素個數不匹配時的錯誤是相對應的

>>> 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 中的術語是 Iterable Unpacking, 找到兩個相關的 PEP 448, PEP 3132。在實際上用處還是很大的,比如在拆分字符串時只關系自己有興趣的字段

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 在拆解時非常聰明,它知道怎么去對應位置,用了星號(*) 的情況,明白如何處理前面跳過多少個,中間跳過多少個,或最后收集多少個元素。

鏈接:

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

以上就是詳解Python 函數參數的拆解的詳細內容,更多關于python 函數參數拆解的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲91精品| 国产精品va| 丁香婷婷久久| 日韩极品在线观看| 亚洲免费网址| 一区在线视频观看| 婷婷综合亚洲| 九九精品调教| av资源亚洲| 一本大道色婷婷在线| 91精品xxx在线观看| 婷婷成人在线| av成人国产| 欧美日韩黄网站| 国产精品探花在线观看| 国产欧美日韩一区二区三区四区 | 欧美黑人做爰爽爽爽| 国产精品伦一区二区| 精品九九在线| 精品中文字幕一区二区三区| 麻豆精品视频在线观看视频| 欧美韩日一区| 性欧美xxxx免费岛国不卡电影| 免费av一区| 日本午夜精品视频在线观看| 美日韩一区二区三区| 91精品一区二区三区综合| 国产中文一区| 欧美精品中文字幕亚洲专区| 国产一区二区三区不卡视频网站 | 91在线成人| 欧美激情aⅴ一区二区三区| 91中文字幕精品永久在线| 激情综合自拍| 国产日韩欧美在线播放不卡| 黄色网一区二区| 亚洲欧美日韩在线观看a三区| 88久久精品| 日韩电影免费网址| 亚洲一区二区三区中文字幕在线观看| 国产精品一区毛片| 亚洲电影在线一区二区三区| 国产精品视频一区二区三区| 婷婷色综合网| 国产精品毛片aⅴ一区二区三区| 久久中文视频| 手机精品视频在线观看| 国产精品精品国产一区二区| 午夜在线一区二区| 日韩大片免费观看| 国产日韩高清一区二区三区在线 | 日韩电影在线视频| 国产精品一区二区三区美女| 日韩视频二区| 91亚洲成人| 欧美国产专区| 欧美日本久久| 成人自拍av| 久久国产高清| 亚洲激情五月| 1024精品一区二区三区| 日韩.com| 精品精品国产三级a∨在线| 日韩va亚洲va欧美va久久| 伊人精品在线| 欧美成人日韩| 亚洲国内精品| 女同性一区二区三区人了人一| 国产91欧美| 精品国产三区在线| 韩日一区二区| 日韩av有码| 日韩欧美国产精品综合嫩v| 中文字幕人成乱码在线观看| 精品国产网站| 水蜜桃精品av一区二区| 久久不卡国产精品一区二区| 欧美日韩午夜电影网| 国产精品亚洲一区二区在线观看| 日精品一区二区三区| 日韩高清在线观看一区二区| 日韩1区2区日韩1区2区| 青青草国产精品亚洲专区无| 国产精品一站二站| 国产欧美日韩一区二区三区四区| 日本视频一区二区| 国产欧美日韩综合一区在线播放| 国内揄拍国内精品久久| 激情久久中文字幕| 日本不卡的三区四区五区| 蜜桃精品视频| 免费在线观看日韩欧美| 精品一区二区三区中文字幕| 亚洲不卡系列| 91嫩草精品| 久久久精品五月天| 国产亚洲观看| 亚洲手机在线| 欧美日韩一区二区高清| 欧美日韩1区| 里番精品3d一二三区| 久久久久久自在自线| 欧美在线资源| 日韩一区二区三区精品| 国产精品一区亚洲| 久久久水蜜桃av免费网站| 国产偷自视频区视频一区二区| 爽爽淫人综合网网站| 日本一区二区中文字幕| 国产精品tv| 99久久久久国产精品| 亚洲一区日韩在线| 免费看一区二区三区| 国产91在线精品| 女人天堂亚洲aⅴ在线观看| 91成人精品在线| 国产尤物精品| 国产精品巨作av| 精品1区2区3区4区| 欧美黑人巨大videos精品| 伊人久久成人| 国产麻豆一区| 在线视频日韩| av资源新版天堂在线| 久久亚洲二区| 午夜久久中文| 欧美有码在线| 国产综合视频| 精品国产a一区二区三区v免费| 午夜日韩av| 不卡专区在线| 捆绑调教美女网站视频一区| 石原莉奈在线亚洲二区| 日韩欧美国产精品综合嫩v| 日本成人在线视频网站| 国产精品av久久久久久麻豆网| 精品成av人一区二区三区| 日韩一区二区三区免费视频| 午夜国产精品视频| 国产麻豆一区| 蜜桃久久精品一区二区| 亚洲午夜精品久久久久久app| 精品欧美日韩精品| 欧美黑人做爰爽爽爽| 亚洲精品一级| 免费久久99精品国产自在现线| 日韩av片子| 日韩免费高清| 久久久久国产精品一区三寸| 国产一区国产二区国产三区| 国产精品一区二区精品视频观看| 亚洲深深色噜噜狠狠爱网站| av成人国产| 日韩中文字幕一区二区三区| 综合激情一区| 免费在线观看精品| 日本综合视频| 欧美一区网站| 精品日本视频| 99久久亚洲精品蜜臀| 中文一区一区三区高中清不卡免费| 免费在线观看一区| 日韩三区在线| 亚洲欧美日韩国产一区| 日本不卡一二三区黄网| 欧美一区网站| av资源中文在线| 91精品高清| 日韩一区二区三区精品视频第3页| 欧美综合国产| 国产精品久久久久久久久久久久久久久 | 国产欧美一级| 精品国产精品久久一区免费式| 高潮久久久久久久久久久久久久| 色婷婷色综合| 蜜臀va亚洲va欧美va天堂| 国产毛片精品| 精品国产亚洲一区二区在线观看| 日韩高清中文字幕一区二区| 亚洲少妇一区| 美女久久久久久| 伊人精品在线| 国产欧美大片| 91久久久精品国产| 国产日产高清欧美一区二区三区| av免费不卡国产观看| 亚洲一区二区小说| 日韩免费看片| 88久久精品| 99成人在线| 国产精品免费不| 午夜宅男久久久| 91看片一区| 国产精品一区毛片| 香蕉精品视频在线观看| 青青久久av| 日本天堂一区| 久久麻豆视频| 国产日韩专区| 日韩欧美二区|