python的一些骚套路,学会这些让你高效编程,文末有资料赠送

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小知识的文章更新,欢迎阅读。

对您能有哪怕一点帮助,就是我坚持写下去的动力。

在这里插入图片描述

扫码关注我

微信公众号: 暮秋梵星

后台回复:“深度学习”,获取亚马逊李沐大神的动手学习深度学习电子书,以及配套代码

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值