python中拆包操作的詳解( 和 操作符)

2021-10-24 08:42:57 字數 2106 閱讀 7434

這個pep提出了*的可迭代拆包操作和**字典拆包操作的延伸用法,以允許在更多的位置、任意的(arbitrary )次數和其他情況(circumstances)下進行拆包。具體來說,在函式呼叫、理解和生成器表示式以及顯示中。

函式呼叫被提出支援任意次數的的拆包,而不僅僅只進行一次:

>>

>

print(*

[1],

*[2]

,3)1

23>>

>

dict(**

, y=2,

**)

拆包操作被提出在元組、列表、集合和字典形式內允許。

>>

>

*range(4

),4(

0,1,

2,3,

4)>>

>[*

range(4

),4]

[0,1

,2,3

,4]>>

>

>>

>

}

在字典中,對於相同的鍵,其後面對應的值會覆蓋(override)之前對應的值

>>

>

}>>

>

,'x':1

}

這個pep不包括在列表推導式、字典推導式和集合推導式內的拆包操作,儘管這並沒有在未來的提案中被排除(rule out)。

目前使用的*可迭代拆包操作符具有不必要的限制,會損害可讀性。

function(

**kw_arguments,

**more_arguments)

function(

*arguments, argument)

它極大地簡化了 型別的加法操作,如合併字典,並以一種明確和定義良好的方式進行。

combination =

instead of:

combination = first_dictionary.copy()

combination.update()

在喜歡使用表示式的情況下,這一點尤為重要。這也很有用,因為它是將迭代數加總到乙個列表中的一種更易讀的方式,比如my_list + list(my_tuple) + list(my_range),現在只相當於[*my_list, *my_tuple, *my_range]。

函式呼叫可以接受數量不受限制的和**解包。對位置引數相對於解包的順序沒有限制,對關鍵字引數相對於**解包的順序也沒有限制。

目前,如果乙個引數被多次給出–比如乙個位置引數既通過位置又通過關鍵字給出–就會引發typeerror。對於通過多次**解包提供的重複引數這種錯誤仍然存在,例如 f(**, **)。

tuples、list、set和dictionary將允許解包。這就好比在解包的地方按順序插入了來自解包項的元素,就像在函式呼叫中的解包一樣。字典需要**解包,其他的都需要*解包。

字典中的鍵按從右到左的優先順序順序排列,所以, 『a』: 2, **}評價為。對解包的數量和位置沒有限制。

函式呼叫中引數的允許順序比以前複雜了。對這些規則最簡單的解釋可能是 「位置引數先於關鍵字引數和解包;*解包先於解包」。

而∗ el

emen

ts,=

iter

able

*elements, = iterable

∗eleme

nts,

=ite

rabl

e會導致元素是乙個列表,ele

ment

s=∗i

tera

ble,

elements = *iterable,

elemen

ts=∗

iter

able

,會導致元素是乙個元組。這樣做的原因可能會讓不熟悉該結構的人感到困惑。

有人對字典中的重複鍵被允許,但在函式呼叫語法中的重複鍵會引起錯誤的意外差異表示擔憂。雖然目前的語法已經存在這種情況,但這個建議可能會加劇這個問題。這個問題在實踐中到底有多大,還有待觀察。

python3拆包詳解

python3拆包詳解 對於可迭代物件,如元組 列表 字串 集合 字典這些可迭代物件都可以被拆包,拆包是指將乙個結構中的資料拆分為多個單獨變數中。拆包的方式大致有兩種,一種是以變數的方式來接收,另一種是用 號。下面先講第一種方式。a computer 2,8000,2018,10,16 這個元組的意...

TCP的粘包和拆包

簡單地說,比如客戶端呼叫 client.send 1 client.send 2 clinet.send 3 底層的tcp可能會把這幾個小包合起來成為乙個大包,因此底層可能的呼叫是client.send 123 另一種情況是伺服器沒有及時處理資料 伺服器先後收到三個包 1 2 3 伺服器沒有及時處理...

詳解Python中的閉包

定義 python中閉包的定義是 在乙個內部函式裡,對在外部作用域 非全域性作用域 的變數進行引用,則內部函式就被認為是閉包 closure 我們來結合 看一下閉包的概念 在函式addx 內部存在函式addy 因此,addy 就是內部函式。下面對函式addx 呼叫 我們可以發現addx 8 的型別是...