1.1 将序列分解为单独的变量
任何可迭代的对象都可以通过一个简单的赋值操作来分解为单独的变量。唯一的要求是变量的总数和序列相吻合。
p = (4,5) # tuple x,y = p print(x) data = ['alice', 50, 91.1, (2012,12,21)] # list & tuple name, shares, price, (year,mon,day) = data print(name) s = 'hello' # string a,b,c,d,e = s print(c)
在分解操作中,可能想丢弃某些特定的值。 通常可以用一个用不到的变量名,以此作为用不到的值的名称。
data1 = ['amy', 45, 89.2, (2015, 8, 10)] _, shares, price, _ = data1 print(shares)
1.2 从任意长度的可迭代对象中分解元素
语法: *expr
*expr 可以放任何位置,包括第一位。 不过不过如果可迭代对象的长度超过n,就会导致"too many values to unpack"的异常。
# 例一
record = ('dave', 'dave@example.com', '888-555-1212','746-666-1212')
name, email, *phone_number = record
print(phone_number)
# 返回: ['888-555-1212', '746-666-1212']
# 例二
sales_record = [10,8,7,1,9,5,10,3]
*trailing_qtrs, current_qtrs = sales_record
print(trailing_qtrs) # 返回:[10, 8, 7, 1, 9, 5, 10]
print(current_qtrs) # 返回:3
# 例三:*expr 经常用于迭代一个变长的元组数列。
record1 = [
('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 record1:
if tag == "foo":
do_foo(*args)
elif tag == "bar":
do_bar(*args)
# 例四: 字符串处理,与string.split()一起用
line = "nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false"
uname, *field, homedir, sh = line.split(':')
print(uname,"\t", homedir, "\t", sh)
# 返回:nobody /var/empty /usr/bin/false
1.3 保存最后N个元素
浙公网安备 33010602011771号