008. 谈谈python中的解包
- 这是个简单的知识点,但有的学员并不理解
- unpacking解包
- 解,对应的是*或者**,也有自动解包之说
- 包对应的可迭代对象
自动解包
- 赋值的demo
a,b = [1,2]
print(a # 1
print(b # 2
- 将容器里面的元素逐个取出来分别赋值
- 不一定是列表,可以是元组、字典、字符串等一切可迭代的对象
- 比如这样
t1,t2 = (1,2
s1,s2 = 'ab'
d1,d2 = {'name':'wuxianfeng','age':18} # d1 是 name,d2 是age
- 不过要注意的是字典的解包,只是个key
- 也可以这样
a, *b, c = range(5 # b 就是[1,2,3]
数据过多的解包,星号
- 有的时候数据可能会过多,那就要用到星号了
- 比如这样
a,b,c = 1,2,3,4
# 报错了
ValueError Traceback (most recent call last
<ipython-input-6-e6e12dfe99e4> in <module>
----> 1 a,b,c = 1,2,3,4
ValueError: too many values to unpack (expected 3
- 怎么解决?
a,*b,c = 1,2,3,4
# 此时的b的值为 [2, 3],是个列表
# 如果这样
a,b,*c = 1,2,3,4 # 那么c就是[3,4]
- 有点像这样
list1 = [1,2,3,4,5,6,7,8]
first , rest = list1[0],list1[1:]
first , *rest = list1 # 以上两种写法一样的,都能让rest是 [2,3,4,5,6,7,8]
星号在函数中的使用
示例代码
def fun(x,y:
print(f'x={x}'
print(f'y={y}'
fun(1,2
# 输出如下..
# x=1
# y=2
那如果这样呢
fun([1,2]
# 报错了
TypeError Traceback (most recent call last
<ipython-input-8-6924a6444e6f> in <module>
----> 1 fun([1,2]
TypeError: fun( missing 1 required positional argument: 'y'
但你可以这样
fun(*[1,2] # x=1 y=2
fun(*'ab' # x=a y=b
fun(*(3,4 # x=3 y=4
如果这样呢
fun(*{'name':'wuxianfeng','age':18}
# x=name
# y=age
如果这样写呢?
for a, *b in [(1, 2, 3, (4, 5, 6, 7]:
print(b
下面2个语句都对吗?对的话,a的值是啥
*a, = range(5
*a = range(5
两个星号的解包
换个函数