- 解压序列赋值给多个变量
- 问题:
- 有一个包含N个元素的元组或者序列,怎样将里面的值解压后同时赋给N个变量
- 解决方案:
任何的序列(或可迭代对象)都可以通过一个简单的赋值语句解压并赋值给多个变量。
唯一的前提是变量的数量必须和序列元素的数量是一样的
p = (4, 5)
x, y = p
print(x)
print(y)
data = ["ACME",50,91.1,(2012,12,21)]
name, shares, price, date = data
print(name)
print(date)
print(name,shares,price,date)
- 字符串,文件对象,迭代器和生成器 都可以用这种方法赋值
s = "hello"
a, b, c, d, e = s
print(a)
- 如果只解压一部分,丢弃其他的值,可以用任意变量名去占位,到时候丢掉这个变量就行了。
- 要保证占位变量名在其他地方没有被使用到
data = ["ACME", 50, 91.1, (2012,12,21)]
_, shares, price, _ = data
print(price)
- 解压可迭代对象给多个变量
- 问题:
- 如果一个可迭代对象的元素个数超过变量个数时,会抛出一个ValueError。 那么这样才能从这个可迭代对象中解压出N个元素。
- 解决方案:
- python的星号表达式可以解决这个问题。
record = ("Dave","dave@example.com","773-555-1212","847-555-1212")
name, email, *phone_numbers = record
print(name) --->Dave
print(phone_numbers) ---> ['773-555-1212', '847-555-1212']
**注意:**phone_numbers 这个变量解压出来的永远是列表类型
- 星号表达式也能用在列表的开始部分
*trailing, current = [10,8,7,1,9,8,10,3]
print(trailing)
print(current)
- 扩展的迭代解压语法是专门为解压不确定个数或任意个数元素的可迭代对象涉及的。 通常,这些可迭代对象的元素结构有确定的规则(比如第一个元素后面都是电话号码),星号 表达式让开发人员可以容易的利用这些规则来解压出元素来。
- 值得注意的是,星号表达式在迭代元素为可变长元组的序列时是很有用的。 比如下面是一个带有标签的元组序列:
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)
- 星号解压语法在字符串操作的时候也会很有用,比如字符串的分割
line = "nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false"
uname, *fields, homedir, sh = line.split(":")
print(uname)
print(fields)
print(homedir)
print(sh)
- 有时候,解压一些元素后想丢弃它们,不能简单实用*,可以实用一个普通的废弃名称. 比如_或者ign。
record = ("ACME",50,123.45,(12,18,2012))
name, *_, (*_, year) = record
print(name)
print(year)
- 可以用分割语法去实现递归算法。递归不是python擅长的。因此对这个不要太认真。
items = [1,10,7,4,5,9]
def sum(items):
head, *tail = items
return head + sum(tail) if tail else head
print(sum(items))