不懂python拆包?看完保证让你明白

​No.1

解压序列赋值给多个变量

问题

一个包含 N 个元素的元组或者是列表,怎么才能容易的把里面的元素一次性赋值给几个变量

解决方案

任何的序列(或者是可迭代对象)可以用的赋值语句自动赋值给多个变量。但是要保证元素个数和变量个数相同。

代码示例

>>> a = (4,5)>>> a1, a2 = a>>> a14>>> a25>>>>>> 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'>>> b21>>> b4_13>>> b4_24>>>

元素个数和变量个数不一致的话,会抛出异常

代码示例

'''

>>> a = (4,5)>>> a1, a2, a3 = aTraceback (most recent call last):File"", line1,inValueError:need more than2values to unpack>>>

'''

事实上,这种解压列表、元组的方式还适用于字符串、迭代器、生成器等。

代码示例

>>> a ='Hello'>>> a1, a2, a3, a4, a5 = a>>> a1'H'>>> a2'e'

有些时候,我们并不关心所有的数据,仅仅需要其中一部分数据,我们可以用_作为变量名,接受我们并不需要的数据。

代码示例:

>>> b = ['Ac',1,2, (3,4,5) ]>>>_, b1, b2,_= b>>> b11>>> b22

No.2

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

问题

当元素个数与变量个数不一致的时候,会抛出一个 ValueError 。这个时候该怎么解决呢?

解决方案

现在我们开始接触python高阶用法里面的一个最基础的知识----拆包装包语法

>>>a, *b = [1,2,3]>>>a1>>>b[2, 3]

这里原本是两个元素赋值给一个元素,是非法操作,但是通过一个*号,把他们进行装包,放入b列表。

同样,有时候,你想解压一些不需要的元素,你不能简单就使用 * , 但是你可以使用一个普通的废弃名称,比如 _ 或者 ign (ignore)。

代码示例:

>>> a = ('ac',1,2, (3,4,5))>>> a1, *_, (*_, a2) = a>>> a1'ac'>>> a25>>>

要注意的是,许多python库代码的形参都会使用 *args接受变量,这个用途实际上类似于java的构造函数,能接受任意多个变量,这也是python的强大之处。

defrun(a,*args):#第一个参数传给了a    print(a)# args是一个元组,里面是2和3两个参数    print(args)# *args是将这个元组中的元素依次取出来print("对args拆包")print(*args)# *args 相当于 a,b = argsprint("将未拆包的数据传给run1")    run1(args)print("将拆包后的数据传给run1")    run1(*args) defrun1(*args):print("输出元组")    print(args)print("对元组进行拆包")    print(*args) run(1,2,3)#后面的2和3

上述代码的结果为:

1(2,3)对args拆包23将未拆包的数据传给run1输出元组((2,3),)对元组进行拆包(2,3)将拆包后的数据传给run1输出元组(2,3)对元组进行拆包2 3

这段代码很容易被绕晕,抓住这几点:

1.形参中的*args其实真正接收数据的args,它是一个元组,把传进来的数据放在了args这个元组中。

2. 函数体里的args依然是那个元组,但是*args的含义就是把元组中的数据进行拆包,也就是把元组中的数据拆成单个数据。

3. 对于args这个元组,如果不对其进行解包,就将其作为实参传给其它以*args作为形参的函数时,args这个元组会看看作一个整体,作为一个类型为元组的数据传入。


公主号:  暮秋梵星

回复“深度学习”: 获取AI相关资料

回复“数据分析”: 获取python数据分析资料

你可能感兴趣的:(不懂python拆包?看完保证让你明白)