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

Python技法-序列拆分詳解

 更新時(shí)間:2021年10月10日 15:13:51   作者:lonelyprince7  
Python中的任何序列(可迭代的對(duì)象)都可以通過(guò)賦值操作進(jìn)行拆分,包括但不限于元組、列表、字符串、文件、迭代器、生成器等。

元組拆分

元組拆分是最為常見(jiàn)的一種拆分,示例如下:

p = (4, 5)
x, y = p 
print(x, y) # 4 5

如果寫(xiě)成

x, y, z = p

那么就會(huì)拋出ValueError異常:“not enough values to unpack (expected 3, got 2)”
如果寫(xiě)成

p = (4, 5, 6)
x, y = p

那么就會(huì)拋出ValueError異常:“too many values to unpack (expected 2)”

字符串拆分

字符串的拆分示意如下:

s = 'Hello'
a, b, c, d, e = s
print(a) # H

拆分時(shí)丟棄值

如果在拆分時(shí)想丟棄某些特定的值,可以用一個(gè)用不到的變量名來(lái)作為丟棄值的名稱(常選'_'做為變量名),如下所示:

s = 'Hello'
a, b, _, d, _ = s
print(a) # H

嵌套序列拆分

Python也提供簡(jiǎn)潔的對(duì)嵌套序列進(jìn)行拆分的語(yǔ)法。如下所示我們對(duì)一個(gè)比較復(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)這個(gè)表示時(shí)間戳的元組,那么你就得這樣寫(xiě):

data = ['zhy', 50, 123.0, (2000, 12, 21)]
name, shares, price, date = data
print(date) # (2000, 12, 21)

從任意長(zhǎng)度的可迭代對(duì)象中拆分

之前我們說(shuō)過(guò),如果我們想從可迭代對(duì)象中分解出\(N\)個(gè)元素,但如果這個(gè)可迭代對(duì)象長(zhǎng)度超過(guò)\(N\),則會(huì)拋出異常"too many values to unpack"。針對(duì)這個(gè)問(wèn)題的解決方案是采用"*"表達(dá)式。

比如我們給定學(xué)生的分?jǐn)?shù),想去掉一個(gè)最高分和一個(gè)最低分,然后對(duì)剩下的學(xué)生求平均分,我們可以這樣寫(xiě):

def avg(data: list):
    return sum(data)/len(data)
# 去掉最高分,最低分然后做均分統(tǒng)計(jì)
def drop_first_last(grades):
    first, *middle, last = grades
    return avg(middle)
print(drop_first_last([1,2,3,4])) # 2.5

還有一種情況是有一些用戶記錄,記錄由姓名+電子郵件+任意數(shù)量的電話號(hào)碼組成,則我們可以這樣分解用戶記錄:

record = ['zhy', 'zhy1056692290@qq.com', '773-556234', '774-223333']
name, email, *phone_numbers = record
print(phone_numbers) # ['773-556234', '774-223333']

事實(shí)上,如果電話號(hào)碼為空也是合法的,此時(shí)phone_numbers為空列表。

record = ['zhy', 'zhy1056692290@qq.com']
name, email, *phone_numbers = record
print(phone_numbers) # []

還有一種使用情況則更為巧妙。如果我們需要遍歷變長(zhǎng)元組組成的列表,這些元組長(zhǎng)度不一。那么此時(shí)*表達(dá)式可大大簡(jiǎn)化我們的代碼。

records = [('foo', 1, 2), ('bar', 'hello'), ('foo', 3, 4)]
for tag, *args in records:
    if tag == 'bar':
        print(args)
# ['hello']

在對(duì)一些復(fù)雜的字符串進(jìn)行拆分時(shí),*表達(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á)式也可以和我們前面說(shuō)的嵌套拆分和變量丟棄一起結(jié)合使用。

record = ['ACME', 50, 123.45, (128, 18, 2012)]
name, *_, (*_, year) = record
print(year) # 2012

最后再介紹*表達(dá)式用于遞歸函數(shù)的一種黑魔法,比如與遞歸求和結(jié)合可以這樣寫(xiě):

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

不過(guò),Python由于自身遞歸棧的限制,并不擅長(zhǎng)遞歸。我們最后一個(gè)遞歸的例子可以做為一種學(xué)術(shù)上的嘗試,但不建議在實(shí)踐中使用它。

參考文獻(xiàn)

[1] Martelli A, Ravenscroft A, Ascher D. Python cookbook[M]. " O'Reilly Media, Inc.", 2005. 數(shù)學(xué)是符號(hào)的藝術(shù),音樂(lè)是上界的語(yǔ)言。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

最新評(píng)論

甘谷县| 日喀则市| 铜梁县| 略阳县| 贵南县| 奉节县| 陆良县| 上蔡县| 左权县| 湄潭县| 铁岭县| 鹤庆县| 宜春市| 满洲里市| 北碚区| 林周县| 海淀区| 池州市| 乐安县| 井冈山市| 荥经县| 灵石县| 肥乡县| 任丘市| 莆田市| 黄石市| 淅川县| 桂阳县| 益阳市| 龙泉市| 资源县| 恩平市| 濮阳市| 丹凤县| 华宁县| 麻城市| 仁化县| 太原市| 江川县| 丹阳市| 文安县|