Python實用技法第1篇:可迭代物件分解為單獨的變數

Mark發表於2019-02-16

下一篇文章:Python實用技法第2篇:使用deque保留最新的N個元素

1、需求?

現在有一個包含N個元素的元組或序列,現在想將它分解為N個單獨的變數。

2、解決方案?

在python中,任何序列、元組、可序列號物件,都可以通過一個簡單的賦值操作來分解為單獨的變數。

唯一要求是變數的總數和結構要和序列的相吻合。如果不吻合就會報錯

例項展示:

#將序列分解為單獨的變數
m=(1,2)
x,y=m
print("x=",x)
print("y=",y)

print("*"*30)

data=["mark",18,"超級帥",(1992,5,4)]
name,age,feature,birthday=data
print("name=",name)
print("age=",age)
print("feature=",feature)
print("birthday=",birthday)
print("*"*30)


name,age,feature,(year,mon,day)=data
print("name=",name)
print("age=",age)
print("feature=",feature)
print("year=",year)
print("mon=",mon)
print("day=",day)

結果

x= 1
y= 2
******************************
name= mark
age= 18
feature= 超級帥
birthday= (1992, 5, 4)
******************************
name= mark
age= 18
feature= 超級帥
year= 1992
mon= 5
day= 4

3、思考?

實際上不僅僅只是元組列表,只要物件是可迭代的,那麼就可以執行分解操作,這包括字串、檔案、迭代器、生成器。

例項展示:

#將序列分解為單獨的變數
mark="mark"
m,a,r,k=mark
print(m)
print(a)
print(r)
print(k)
print("*"*30)

#有時候我們想丟棄某個值,單由於變數數量必須和要分解的物件的可分解數量相同,此時我們可以使用_來表示要丟棄的值。

mark="mark"
m,a,r,_=mark
print(m)
print(a)
print(r)
#其實_還是一個變數,指示看起來舒服點
print(_)

結果:

m
a
r
k
******************************
m
a
r
k

4、需求升級?

假如可序列號物件可分解為N個元素,難道我們就要建立N個元素嗎?如果N值非常大怎麼辦?

5、解決方案升級?

Python中的『*表示式』可以滿足上述需求。例如,有無數個成績列表:grades,現在想去掉第一個成績和最後一個成績,然後求剩下成績的平均值:

程式碼

import numpy as np

grades=list(range(10))#定義一個0-999的分數列表
print("grades:"+str(grades))
first,*middle,last=grades
print("middle:"+str(middle))
print("去掉第一個和最後一個分數後的平均值:"+str(np.mean(middle)))

結果

grades:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
middle:[1, 2, 3, 4, 5, 6, 7, 8]
去掉第一個和最後一個分數後的平均值:4.5

當然這個【*表示式】可以位於第一個位置,也可以是最後一個,或者其它位置。

假如有一些使用者記錄,記錄由姓名和電子郵件地址組成,後面跟著任意數量的電話號碼:

record=(`mark`,`1782980833@qq.com`,`18321859453`,`18956245389`)
name,email,*phone_numbers=record

print(name)
print(email)
print(phone_numbers)

執行結果:

mark
1782980833@qq.com
[`18321859453`, `18956245389`]

6、*表示式技巧

*表示式在迭代一個變長的元組序列時尤其有用

程式碼:

records=[
    (`foo`,1,2),
    (`bar`,`hello`),
    (`foo`,3,4),
]

def do_foo(x,y):
    print(`foo`,x,y)

def do_bar(s):
    print(`bar`,s)

for tag,*args in records:
    if tag==`foo`:
        do_foo(*args)
    elif tag==`bar`:
        do_bar(*args)

結果:

foo 1 2
bar hello
foo 3 4

當和某些特定的字串處理操作(例如拆分操作)相結合時,也非常有用

程式碼:

line=`nobody:*:-2:-2:unp user:/var/empty:/user/nim/false`

uname,*fileds,homedir,sh=line.split(`:`)
print(uname)
print(homedir)
print(sh)

結果:

nobody
/var/empty
/user/nim/false

下一篇文章:Python實用技法第2篇:使用deque保留最新的N個元素

相關文章