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