亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

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

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

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

唯一的不同時作為參數(shù)的集合傳入函數(shù)時必須前面加上 ***, 以此宣告該參數(shù)將被拆解,而非一個整體作為一個函數(shù)參數(shù)。加上 * ** 與 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}

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

有了上面的基礎后,再回到原書中的例子,當我們定義如下打印 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ù)準確從集合中獲得相應的 x, y, 和 z 的值。

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

>>> 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 有點不一樣,它的內容必須是函數(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 之外的 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, 但有四個元素,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'

把集合對象整體作為第一個參數(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ù)不匹配時的錯誤是相對應的

>>> 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 Generalizations
PEP 3132 -- Extended Iterable Unpacking

以上就是詳解Python 函數(shù)參數(shù)的拆解的詳細內容,更多關于python 函數(shù)參數(shù)拆解的資料請關注腳本之家其它相關文章!

相關文章

  • pytorch自定義二值化網(wǎng)絡層方式

    pytorch自定義二值化網(wǎng)絡層方式

    今天小編就為大家分享一篇pytorch自定義二值化網(wǎng)絡層方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Django 數(shù)據(jù)庫同步操作技巧詳解

    Django 數(shù)據(jù)庫同步操作技巧詳解

    這篇文章主要介紹了Django 數(shù)據(jù)庫同步操作技巧詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Django數(shù)據(jù)結果集序列化并展示實現(xiàn)過程

    Django數(shù)據(jù)結果集序列化并展示實現(xiàn)過程

    這篇文章主要介紹了Django數(shù)據(jù)結果集序列化并展示實現(xiàn)過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Django ModelSerializer實現(xiàn)自定義驗證的使用示例

    Django ModelSerializer實現(xiàn)自定義驗證的使用示例

    本文主要介紹了Django ModelSerializer實現(xiàn)自定義驗證的使用示例,多種字段驗證器幫助開發(fā)者確保數(shù)據(jù)的完整性和準確性,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • 淺談tensorflow之內存暴漲問題

    淺談tensorflow之內存暴漲問題

    今天小編就為大家分享一篇淺談tensorflow之內存暴漲問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Python科學畫圖代碼分享

    Python科學畫圖代碼分享

    這篇文章主要介紹了Python科學畫圖代碼分享,涉及matplotlib庫的簡單介紹,分享了matplotlib繪圖庫書籍的下載地址,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Python?matplotlib繪制散點圖配置(萬能模板案例)

    Python?matplotlib繪制散點圖配置(萬能模板案例)

    這篇文章主要介紹了Python?matplotlib繪制散點圖配置(萬能模板案例),散點圖是指在??回歸分析???中,數(shù)據(jù)點在直角坐標系平面上的?分布圖???,散點圖表示因變量隨??自變量???而?變化???的大致趨勢,據(jù)此可以選擇合適的函數(shù)??對數(shù)???據(jù)點進行?擬合
    2022-07-07
  • Python如何實現(xiàn)文本轉語音

    Python如何實現(xiàn)文本轉語音

    文本轉語音,一般會用在無障礙開發(fā)。下面介紹如何使用Python實現(xiàn)將文本文件轉換成語音輸出。跟著小編一起來看看吧。
    2016-08-08
  • Python實現(xiàn)12種降維算法的示例代碼

    Python實現(xiàn)12種降維算法的示例代碼

    數(shù)據(jù)降維算法是機器學習算法中的大家族,與分類、回歸、聚類等算法不同,它的目標是將向量投影到低維空間,以達到某種目的如可視化,或是做分類。本文將利用Python實現(xiàn)12種降維算法,需要的可以參考一下
    2022-04-04
  • 關于Python中 循環(huán)器 itertools的介紹

    關于Python中 循環(huán)器 itertools的介紹

    循環(huán)器是對象的容器,包含有多個對象。通過調用循環(huán)器的next()方法 (__next__()方法,在Python 3.x中),循環(huán)器將依次返回一個對象。直到所有的對象遍歷窮盡,循環(huán)器將舉出StopIteration錯誤。這篇文章將對此做一個詳細介紹,感興趣的小伙伴請參考下面文字內容
    2021-09-09

最新評論