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个元素
相关文章
相关标签/搜索