01-解压序列-*号表达式

解压序列与解压可迭代对象赋值给多个变量

问题1-解压序列

现在有一个序列,列表,元组,怎么将其中的N个成员依次赋值给N个变量?

解决办法

多个变量对应解压赋值;

要点:变量个数要与序列的成员的个数一致

# 完全解压,变量个数与序列成员的个数必须要一致否则会报错
lst = [1, 2, 3]
a, b, c = lst
print(a, b, c)
# 1 2 3

# ‘舍弃’成员解压, 就是用占位表示但是我们不使用这个变量(并不是真正的舍弃)
tup = ('liyao', 18, 13844814510)
name, age, _ = tup
print(name, age)
# liyao 18

问题 2-解压可迭代对象(个数不对应)

如果我们要解压的可迭代对象的个数超过我们定义的变量个数的时候

解决办法

星号表达式 来表示 1 到 N个变量

星号表达式是列表类型

# 相当于除了你指定对应的变量之外的其他成员的占位
lst = [1, 2, 3, 4, 5, 6]
first, *middle, end = lst
print(first) # 1
print(*middle) [2, 3, 4, 5]
print(end) # 6

# 占位的位置根据需要可以不同
lst = ['li_yao', 24, [13844321456, 18745634526]]
name, age, *phone = lst
print(name) # 'liyao'
print(age)  # 24
print(*phone) # [13844321456, 18745634526]

lst = ['li_yao', 24, [13844321456, 18745634526]]
*name_age, phone = lst
print(name_age)
print(*phone)
# ['li_yao', 24]
# [13844321456, 18745634526]

# 有些时候解压一些成员但是不需要刻意使用一些特殊的符号占用然后舍弃就可以
lst = ['li_yao', 24, 18, [2014, 9, 1]]

name, *_, (year, *_) = lst
print(name)
print(year)

拓展

# 根据元组中第一项决定使用那个函数,然后传入后面的成员作为对应参数
records = [
    ('foo', 1, 2),
    ('foo', 3, 4),
    ('bar', 'hello'),
]

def do_foo(x, y):
    print('foo', x, y)

def do_bar(x, s):
    print('foo', s)
    
    
for tag, *args in records:   # 注意for循环 tag *args 得到的是一个元组
    if tag == 'foo':
        do_foo(*args)
    elif tag == 'bar':
        do_bar(*arsg)
posted @ 2018-12-06 23:43  一如少年模样  阅读(218)  评论(0)    收藏  举报