所谓的解包(Unpacking)实际上可以看做是去掉()
的元组或者是去掉{}
的字典。
解包sequence
p = (4,5)
x,y = p
print(x)
print(y)
#x=4
#y=5
data = ["Alice",50,91.1,(2012,12,21)]
name,shares,price,date = data
print(name)
print(date)
#"Alice"
#(2012,12,21)
name,shares,price,(year,mon,day) = data print(name) print(year) print(mon) print(day) #Alice #2012 #12 #21
解包string
s = "Hello" a,b,c,d,e = s print("a=",a,"b=",b,"c=",c,"d=",d,"e=",e) # a= H b= e c= l d= l e= o
解包指定定内容
data = ["ACME",50,91.1,(2012,12,21)] _,share,price,_ = data print(share) print(price) # 50 # 91.1
前后任意长度解包
中间
def drop_first_last(grades): first,*middle,last = grades # return "".join(middle) return middle print(drop_first_last("afafasfdsfa")) # fafasfdsf #不加"".join(middle),会返回一个列表['f', 'a', 'f', 'a', 's', 'f', 'd', 's', 'f']
最后
record = ("Dave","dave@example.com","773-555-1212","847-555-1212") name,email,*phone_numbers = record print(name) print(email) print(phone_numbers) # Dave # dave@example.com # ['773-555-1212', '847-555-1212']
第一个
*trailing, current = [10, 8, 7, 1, 9, 5, 10, 3] print(trailing) print(current) # [10, 8, 7, 1, 9, 5, 10] # 3
解包包含tag的元组
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:Unprivileged User:/var/empty:/usr/bin/false" uname,*field,homedir,sh = line.split(":") print(uname) print(homedir) print(sh) # nobody # /var/empty # /usr/bin/false
数组里面有元组的情况
record = ("ACME",50,123.45,(12,18,2012)) name,*_,(*_,year) = record print(name) print(year) # ACME # 2012