最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年09月02日 10:03:22   作者:Yanbin  
這篇文章主要介紹了Python 函數(shù)參數(shù)的拆解,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下

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

*args**kwars 是函數(shù)可定義一個(gè)形參來(lái)接收傳入的不定數(shù)量的實(shí)參。

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

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

唯一的不同時(shí)作為參數(shù)的集合傳入函數(shù)時(shí)必須前面加上 ***, 以此宣告該參數(shù)將被拆解,而非一個(gè)整體作為一個(gè)函數(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)] # * 號(hào)能把集合打散,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ǔ)后,再回到原書中的例子,當(dāng)我們定義如下打印 3-D 坐標(biāo)的函數(shù)

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

依次傳入三個(gè)參數(shù)的方式就不值不提了,現(xiàn)在就看如何利用函數(shù)的參數(shù)拆解特性,只傳入一個(gè)集合參數(shù),讓該 print_vector 函數(shù)準(zhǔn)確從集合中獲得相應(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) # 相當(dāng)于 print_vector(*dict_vec.keys())
<y, z, x>
>>> print_vector(**dict_vec) # 相當(dāng)于 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 有點(diǎn)不一樣,它的內(nèi)容必須是函數(shù) print_vector 的形參 'x', 'y', 'z' 作為 key 的三個(gè)元素。

以下是各種錯(cuò)誤

**dict_vec 元素個(gè)數(shù)不對(duì),或 key 不匹配時(shí)的錯(cuò)誤

>>> print_vector(**{'y': 2, 'z': 1, 'x': 3})
<3, 2, 1>
>>> print_vector(**{'y': 2, 'z': 1, 'a': 3})  #元素個(gè)數(shù)是3 個(gè),但出現(xiàn) x, y, z 之外的 key
Traceback (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, 但有四個(gè)元素,key 'a' 不能識(shí)別
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' 對(duì)應(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'

不帶星星的錯(cuò)誤

>>> 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'

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

集合長(zhǎng)度與函數(shù)參數(shù)個(gè)數(shù)不匹配時(shí)的錯(cuò)誤

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

上面這兩個(gè)錯(cuò)誤與賦值時(shí)的拆解因元素個(gè)數(shù)不匹配時(shí)的錯(cuò)誤是相對(duì)應(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)

當(dāng)然在賦值時(shí) Python 可以像下面那樣做

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

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

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

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

鏈接:

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

以上就是詳解Python 函數(shù)參數(shù)的拆解的詳細(xì)內(nèi)容,更多關(guān)于python 函數(shù)參數(shù)拆解的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • NetworkX之Prim算法(實(shí)例講解)

    NetworkX之Prim算法(實(shí)例講解)

    下面小編就為大家分享一篇NetworkX之Prim算法實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Python Selenium 設(shè)置元素等待的三種方式

    Python Selenium 設(shè)置元素等待的三種方式

    這篇文章主要介紹了Python Selenium 設(shè)置元素等待的三種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Python?標(biāo)準(zhǔn)庫(kù)?fileinput與文件迭代器

    Python?標(biāo)準(zhǔn)庫(kù)?fileinput與文件迭代器

    這篇文章主要介紹了Python標(biāo)準(zhǔn)庫(kù)fileinput與文件迭代器,fileinput模塊可以對(duì)一個(gè)或多個(gè)文件中的內(nèi)容進(jìn)行迭代、遍歷等操作,更多詳細(xì)內(nèi)容需要的朋友可以參考一下
    2022-09-09
  • Qt Quick QML-500行代碼實(shí)現(xiàn)合成大西瓜游戲

    Qt Quick QML-500行代碼實(shí)現(xiàn)合成大西瓜游戲

    合成大西瓜游戲是前段時(shí)間比較火的小游戲,最近小編閑來(lái)無(wú)事,通過(guò)研究小球碰撞原理親自寫碰撞算法實(shí)現(xiàn)一個(gè)合成大西瓜游戲,下面小編把我的實(shí)現(xiàn)思路及核心代碼分析出來(lái),供大家參考
    2021-05-05
  • Python利用D3Blocks繪制可動(dòng)態(tài)交互的圖表

    Python利用D3Blocks繪制可動(dòng)態(tài)交互的圖表

    今天小編給大家來(lái)介紹一款十分好用的可視化模塊,D3Blocks,不僅可以用來(lái)繪制可動(dòng)態(tài)交互的圖表,并且導(dǎo)出的圖表可以是HTML格式,方便在瀏覽器上面呈現(xiàn),感興趣的可以了解一下
    2023-02-02
  • Python基于YOLOv8和OpenCV實(shí)現(xiàn)車道線和車輛檢測(cè)功能

    Python基于YOLOv8和OpenCV實(shí)現(xiàn)車道線和車輛檢測(cè)功能

    使用YOLOv8(You Only Look Once)和OpenCV實(shí)現(xiàn)車道線和車輛檢測(cè),目標(biāo)是創(chuàng)建一個(gè)可以檢測(cè)道路上的車道并識(shí)別車輛的系統(tǒng),并估計(jì)它們與攝像頭的距離,這篇文章主要介紹了Python基于YOLOv8和OpenCV實(shí)現(xiàn)車道線和車輛檢測(cè),需要的朋友可以參考下
    2025-01-01
  • Python常用工具類之a(chǎn)dbtool示例代碼

    Python常用工具類之a(chǎn)dbtool示例代碼

    本文主要介紹了Python中常用工具類之a(chǎn)db命令的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Python中的命名元組簡(jiǎn)單而強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)示例詳解

    Python中的命名元組簡(jiǎn)單而強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)示例詳解

    namedtuple是Python中一個(gè)非常有用的數(shù)據(jù)結(jié)構(gòu),它提供了一種簡(jiǎn)單的方式創(chuàng)建具有固定字段的輕量級(jí)對(duì)象,通過(guò)使用namedtuple,可以提高代碼的可讀性和可維護(hù)性,避免了使用類定義對(duì)象的復(fù)雜性,這篇文章主要介紹了Python中的命名元組簡(jiǎn)單而強(qiáng)大的數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下
    2024-05-05
  • Python MD5加密實(shí)例詳解

    Python MD5加密實(shí)例詳解

    這篇文章主要介紹了Python MD5加密實(shí)例詳解的相關(guān)資料,這里提供實(shí)現(xiàn)方法及實(shí)例,需要的朋友可以參考下
    2017-08-08
  • python 實(shí)現(xiàn)PIL模塊在圖片畫線寫字

    python 實(shí)現(xiàn)PIL模塊在圖片畫線寫字

    這篇文章主要介紹了python 實(shí)現(xiàn)PIL模塊在圖片畫線寫字,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05

最新評(píng)論

都兰县| 宁波市| 青龙| 会东县| 彭州市| 根河市| 武陟县| 桑日县| 海盐县| 广东省| 潮安县| 四川省| 营山县| 黔西县| 沾益县| 资阳市| 龙川县| 桃源县| 抚州市| 岳西县| 新丰县| 乐陵市| 永顺县| 霍山县| 渑池县| 九江市| 南阳市| 佛教| 泽库县| 高雄县| 南皮县| 大姚县| 临邑县| 肥乡县| 茶陵县| 吉安市| 工布江达县| 桐乡市| 长宁县| 清苑县| 青州市|