您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)Python中序列拆分的過程是怎么樣的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
元組拆分是最為常見的一種拆分,示例如下:
p = (4, 5) x, y = p print(x, y) # 4 5
如果寫成
x, y, z = p
那么就會拋出ValueError異常:“not enough values to unpack (expected 3, got 2)”
如果寫成
p = (4, 5, 6) x, y = p
那么就會拋出ValueError異常:“too many values to unpack (expected 2)”
字符串的拆分示意如下:
s = 'Hello' a, b, c, d, e = s print(a) # H
如果在拆分時想丟棄某些特定的值,可以用一個用不到的變量名來作為丟棄值的名稱(常選'_'做為變量名),如下所示:
s = 'Hello' a, b, _, d, _ = s print(a) # H
Python也提供簡潔的對嵌套序列進(jìn)行拆分的語法。如下所示我們對一個比較復(fù)雜的異質(zhì)列表進(jìn)行拆分:
data = ['zhy', 50, 123.0, (2000, 12, 21)] name, shares, price, (year, month, day) = data print(year) # 2000
如果你想完整地得到(2000, 12, 21)這個表示時間戳的元組,那么你就得這樣寫:
data = ['zhy', 50, 123.0, (2000, 12, 21)] name, shares, price, date = data print(date) # (2000, 12, 21)
之前我們說過,如果我們想從可迭代對象中分解出\(N\)個元素,但如果這個可迭代對象長度超過\(N\),則會拋出異常"too many values to unpack"。針對這個問題的解決方案是采用"*"表達(dá)式。
比如我們給定學(xué)生的分?jǐn)?shù),想去掉一個最高分和一個最低分,然后對剩下的學(xué)生求平均分,我們可以這樣寫:
def avg(data: list): return sum(data)/len(data) # 去掉最高分,最低分然后做均分統(tǒng)計 def drop_first_last(grades): first, *middle, last = grades return avg(middle) print(drop_first_last([1,2,3,4])) # 2.5
還有一種情況是有一些用戶記錄,記錄由姓名+電子郵件+任意數(shù)量的電話號碼組成,則我們可以這樣分解用戶記錄:
record = ['zhy', 'zhy1056692290@qq.com', '773-556234', '774-223333'] name, email, *phone_numbers = record print(phone_numbers) # ['773-556234', '774-223333']
事實(shí)上,如果電話號碼為空也是合法的,此時phone_numbers為空列表。
record = ['zhy', 'zhy1056692290@qq.com'] name, email, *phone_numbers = record print(phone_numbers) # []
還有一種使用情況則更為巧妙。如果我們需要遍歷變長元組組成的列表,這些元組長度不一。那么此時*表達(dá)式可大大簡化我們的代碼。
records = [('foo', 1, 2), ('bar', 'hello'), ('foo', 3, 4)] for tag, *args in records: if tag == 'bar': print(args) # ['hello']
在對一些復(fù)雜的字符串進(jìn)行拆分時,*表達(dá)式也顯得特別有用。
line = "nobody:*:-2:-2:-2:Unprivileged User:/var/empty:/usr/bin/false" uname, *fields, home_dir, sh = line.split(':') print(home_dir) # /var/empty
*表達(dá)式也可以和我們前面說的嵌套拆分和變量丟棄一起結(jié)合使用。
record = ['ACME', 50, 123.45, (128, 18, 2012)] name, *_, (*_, year) = record print(year) # 2012
最后再介紹*表達(dá)式用于遞歸函數(shù)的一種黑魔法,比如與遞歸求和結(jié)合可以這樣寫:
items = [1, 10, 7, 4, 5, 9] def sum(items): head, *tail = items return head + sum(tail) if tail else head print(sum(items)) # 36
不過,Python由于自身遞歸棧的限制,并不擅長遞歸。我們最后一個遞歸的例子可以做為一種學(xué)術(shù)上的嘗試,但不建議在實(shí)踐中使用它。
Martelli A, Ravenscroft A, Ascher D. Python cookbook[M]. " O'Reilly Media, Inc.", 2005. 數(shù)學(xué)是符號的藝術(shù),音樂是上界的語言。
看完上述內(nèi)容,你們對Python中序列拆分的過程是怎么樣的有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。