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"
'''
事实上,这种解压列表、元组的方式还适用于字符串、迭代器、生成器等。
代码示例:
>>> 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数据分析资料