Python3 序列解包 *

本文介绍了Python3中的序列解包语法,通过示例展示了如何利用它简化代码,包括获取序列的首部、中部和剩余部分,以及嵌套解包。通过序列解包,可以更方便地处理字符串和列表等序列类型的数据,提高代码的可读性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python 中有很多很实用的语法糖,这些语法糖可以帮助我们简化代码、更易理解等优点,接下里再看一个 Python3 中特别实用的语法序列解包(序列解包是 Python 3.0 之后才有的语法)。

那什么是序列解包呢?先看一个例子:

>>> a, b, c = 1, 2, 3
>>> a
1
>>> b
2
>>> c
3
>>> 
这种方法并不限于列表和元组,而是适用于任意序列类型(甚至包括字符串和字节序列)。只要赋值运算符左边的变量数目与序列中的元素数目相等,你都可以用这种方法将元素序列解包到另一组变量中。

解包的使用还可以更有逼格,可以利用 * 表达式获取单个变量中的多个元素,只要它的解释没有歧义即可。

* 获取的值默认为 list

# 获取剩余部分:

>>> a, b, *c = 0, 1, 2, 3
>>> a
0
>>> b
1
>>> c
[2, 3]
# 获取中间部分:

>>> a, *b, c = 0, 1, 2, 3
>>> a
0
>>> b
[1, 2]
>>> c
3
# 如果左值比右值要多,那么带 * 的变量默认为空

>>> a, b, *c = 0, 1
>>> a
0
>>> b
1
>>> c
[]


>>> a, *b, c = 0, 1
>>> a
0
>>> b
[]
>>> c
1


# 嵌套解包

>>> (a, b), (c, d) = (1, 2), (3, 4)
>>> a
1
>>> b
2
>>> c
3
>>> d
4
>>> a, b, c, d
(1, 2, 3, 4)


接下来实战一下,假如一个字符串 'ABCDEFGH',要输出下列格式:

A ['B', 'C', 'D', 'E', 'F', 'G', 'H']
B ['C', 'D', 'E', 'F', 'G', 'H']
C ['D', 'E', 'F', 'G', 'H']
D ['E', 'F', 'G', 'H']
E ['F', 'G', 'H']
F ['G', 'H']
G ['H']
H []


即每次取出第一个作为首,然后的字符串拆成列表,放置在后面

一般的处理过程是:

1. 将切片中索引为 0 的字符赋值给 a

2. 将切片中索引为 1 之后字符再赋值给 s

3. 用 list 函数将字符串转变为列表

4. 用 while 循环来 s 来判断,为空,则退出循环

>>> s = 'ABCDEFGH'
>>> while s:
...     x, s = s[0], list(s[1:])
...     print(x, s)
... 
A ['B', 'C', 'D', 'E', 'F', 'G', 'H']
B ['C', 'D', 'E', 'F', 'G', 'H']
C ['D', 'E', 'F', 'G', 'H']
D ['E', 'F', 'G', 'H']
E ['F', 'G', 'H']
F ['G', 'H']
G ['H']
H []


上面的处理,可以用序列解包的方法会来处理。序列解包,在赋值时无疑更方便、更简洁、更好理解、适用性更强!

运用序列解包的功能重写上面的代码:

>>> s = 'ABCDEFGH'
>>> while s:
...     x, *s = s
...     print(x, s)
... 
A ['B', 'C', 'D', 'E', 'F', 'G', 'H']
B ['C', 'D', 'E', 'F', 'G', 'H']
C ['D', 'E', 'F', 'G', 'H']
D ['E', 'F', 'G', 'H']
E ['F', 'G', 'H']
F ['G', 'H']
G ['H']
H []

————————————————
版权声明:本文为优快云博主「极客点儿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/yilovexing/article/details/80576788

### Python解包符号 `*` 的作用 在 Python 中,解包符号 `*` 并不与传统意义上的指针相关联。它的主要功能是对序列或迭代器进行解包操作,或者用于函数定义和调用时处理可变数量的位置参数。 #### 1. 序列解包 当 `*` 被用来解包序列时,它可以将一个容器(如列表、元组等)拆分为单独的元素并分配给多个变量。这种情况下,`*` 不涉及内存地址的操作[^1]。 示例代码如下: ```python a, *b, c = [1, 2, 3, 4, 5] print(a) # 输出 1 print(b) # 输出 [2, 3, 4] print(c) # 输出 5 ``` #### 2. 函数调用中的解包 在函数调用过程中,如果有一个含多个值的容器,可以通过 `*` 将其解包为独立的参数传递给函数。这使得无需手动逐一提取容器内的每一个值[^3]。 示例代码如下: ```python def add(x, y, z): return x + y + z numbers = [1, 2, 3] result = add(*numbers) print(result) # 输出 6 ``` #### 3. 函数定义中的可变参数 在函数定义阶段,`*` 可以捕获任意数量的位置参数并将它们存储在一个元组中。这种方式允许创建能够接受不同数目输入参数的灵活接口[^5]。 示例代码如下: ```python def concatenate_strings(*args): result = ''.join(args) return result output = concatenate_strings("Hello", " ", "World") print(output) # 输出 Hello World ``` ### 是否与指针相关? 尽管某些编程语言(例如 C 或 C++)通过指针来实现类似的动态行为,但在 Python 中并没有真正的指针概念。因此,虽然表面上看起来有些相似之处,但实际上两者的工作机制完全不同——Python 使用的是对象引用而非直接操纵内存地址[^1]。 ### 总结 综上所述,在 Python 编程环境中,“*” 主要承担着数值运算符之外的角色,比如执行序列解包或是管理不定数目的函数参数;而这些用途均未涉及到底层硬件层面的具体细节诸如指向某个特定存储单元之类的动作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值