Python實用技法第1篇:可迭代對象分解爲單獨的變量

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

一、需求🙀

如今有一個包含N個元素的元組或序列,如今想將它分解爲N個單獨的變量。

二、解決方案😸

在python中,任何序列、元組、可序列號對象,均可以經過一個簡單的賦值操做來分解爲單獨的變量。python

惟一要求是變量的總數和結構要和序列的相吻合。若是不吻合就會報錯segmentfault

實例展現:code

#將序列分解爲單獨的變量
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

三、思考🤔

實際上不單單只是元組列表,只要對象是可迭代的,那麼就能夠執行分解操做,這包括字符串、文件、迭代器、生成器。字符串

實例展現:get

#將序列分解爲單獨的變量
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

四、需求升級🙀

假如可序列號對象可分解爲N個元素,難道咱們就要建立N個元素嗎?若是N值很是大怎麼辦?

五、解決方案升級😸

Python中的『*表達式』能夠知足上述需求。例如,有無數個成績列表:grades,如今想去掉第一個成績和最後一個成績,而後求剩下成績的平均值:it

代碼ast

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)))

結果email

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']

六、*表達式技巧

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

代碼:

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個元素
相關文章
相關標籤/搜索