No.1
解压序列赋值给多个变量
问题
一个包含 N 个元素的元组或者是列表,怎么才能容易的把里面的元素一次性赋值给几个变量
解决方案
任何的序列(或者是可迭代对象)可以用的赋值语句自动赋值给多个变量。但是要保证元素个数和变量个数相同。
代码示例:
>>> a = (4, 5)
>>> a1, a2 = a
>>> a1
4
>>> a2
5
>>>
>>> b = [ 'Ac', 1, 2, (3, 4, 5) ]
>>> b1, b2, b3, b4 = b
>>> b1
'Ac'
>>> b4
(3, 4, 5)
>>> b1, b2, b3, (b4_1, b4_2, b4_3) = b
>>> b1
'Ac'
>>> b2
1
>>> b4_1
3
>>> b4_2
4
>>>
元素个数和变量个数不一致的话,会抛出异常
代码示例:
>>> a = (4, 5)
>>> a1, a2, a3 = a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: need more than 2 values to unpack
>>>
事实上,这种解压列表、元组的方式还适用于字符串、迭代器、生成器等。
代码示例:
>>> a = 'Hello'
>>> a1, a2, a3, a4, a5 = a
>>> a1
'H'
>>> a2
'e'
有些时候,我们并不关心所有的数据,仅仅需要其中一部分数据,我们可以用_作为变量名,接受我们并不需要的数据。
代码示例:
>>> b = [ 'Ac', 1, 2, (3, 4, 5) ]
>>> _, b1, b2, _ = b
>>> b1
1
>>> b2
2
No.2
解压可迭代对象赋值给多个变量
问题
当元素个数与变量个数不一致的时候,会抛出一个 ValueError 。这个时候该怎么解决呢?
解决方案
现在我们开始接触python高阶用法里面的一个最基础的知识----拆包装包语法
>>>a, *b = [1,2,3]
>>>a
1
>>>b
[2, 3]
这里原本是两个元素赋值给一个元素,是非法操作,但是通过一个*号,把他们进行装包,放入b列表。
同样,有时候,你想解压一些不需要的元素,你不能简单就使用 * , 但是你可以使用一个普通的废弃名称,比如 _ 或者 ign (ignore)。
代码示例:
>>> a = ('ac', 1, 2, (3, 4, 5))
>>> a1, *_, (*_, a2) = a
>>> a1
'ac'
>>> a2
5
>>>
要注意的是,许多python库代码的形参都会使用 *args接受变量,这个用途实际上类似于java的构造函数,能接受任意多个变量,这也是python的强大之处。
def run(a,*args):
#第一个参数传给了a
print(a)
# args是一个元组,里面是2和3两个参数
print(args)
# *args是将这个元组中的元素依次取出来
print("对args拆包")
print(*args) # *args 相当于 a,b = args
print("将未拆包的数据传给run1")
run1(args)
print("将拆包后的数据传给run1")
run1(*args)
def run1(*args):
print("输出元组")
print(args)
print("对元组进行拆包")
print(*args)
run(1,2,3) #后面的2和3
上述代码的结果为:
1
(2, 3)
对args拆包
2 3
将未拆包的数据传给run1
输出元组
((2, 3),)
对元组进行拆包
(2, 3)
将拆包后的数据传给run1
输出元组
(2, 3)
对元组进行拆包
2 3
这段代码很容易被绕晕,抓住这几点:
1.形参中的args其实真正接收数据的args,它是一个元组,把传进来的数据放在了args这个元组中。
2. 函数体里的args依然是那个元组,但是args的含义就是把元组中的数据进行拆包,也就是把元组中的数据拆成单个数据。
3. 对于args这个元组,如果不对其进行解包,就将其作为实参传给其它以*args作为形参的函数时,args这个元组会看看作一个整体,作为一个类型为元组的数据传入。
今天的内容到此为止,后续有更加精彩的python小知识的文章更新,欢迎阅读。
对您能有哪怕一点帮助,就是我坚持写下去的动力。
扫码关注我
微信公众号: 暮秋梵星
后台回复:“深度学习”,获取亚马逊李沐大神的动手学习深度学习电子书,以及配套代码