python基础语法之拆包(解包)

article/2025/9/23 5:23:00

理解和使用python中的拆包会让我们的代码变得流畅,不仅对自己的手关节有好处,也使看官觉得很赏心悦目,既然拆包这么香那就抓紧用起来吧。

1、直接交换变量的本质

在C,C++和Java语言中如果想交换两个变量的值就必须用到第三个临时变量,但是在python中我们竟然可以做到不用经过第三方的手直接进行交换了,即省去了第三个变量又尽显优雅,那么他是如何实现的呢。

a = 1
b = 2
a, b = b, a

我们先说python中一个重要的数据结构,那就是元组,在元组( )可以省略,那么上面的a, b = b, a等式右边的b, a就自行构成了一个元组。
在这里插入图片描述
所以左边就变成了对元组的拆包过程。直接交换变量的实质就是一个打包和拆包的过程。

2、常见的拆包操作

1、元组的拆包

tup = (1, 2, 3)
# 方式一
a, b, c = tup  # 要求元组内的个数与接收的参数个数相同
print(a, b, c)

结果如下:

1 2 3

# 方式二
print(*tup)  # 使用*进行拆包,结果同上
add(*tup)

如下方式是错误的

a, b, c = *tup

这两种方式分别在什么情况下使用呢?

  • 方式一一般在要获取元组的值时使用
  • 方式二一般在函数调用时使用,见下面的函数中的装包与拆包

下面介绍一点稍微复杂一点的拆包

tup = (1, 2, 3, 4, 5, 6)

比如说这个又6个数据的元组,我们感兴趣的只有开头和结尾的数据,不想要中间的数据,那需要像上面那样弄6个参数来接受吗?

a, *_, b = tup  # 中间的数据被打包到了 _ 中,我们只获取到了开头和结尾的数据

从上面这个例子中我们可以看到,*这个符号既可以用来拆包也可以用来打包。可以把任意多的数据打包起来。拆包过程中如果使用了 * 号,我们只能提取开头或者结尾的感兴趣数据。

还有下面这种,多层包含的拆包。(也可以包含列表和字典的数据结构)

tup = (1, 2, (3, 4, 5), 6)

拆包

a, b, c, d = tup

结果如下:

1 2 (3, 4, 5) 6

c就是中间哪个元组了。如果想进一步拆包,重复上述步骤即可。
我们看到,多余的3, 4, 5这三个参数被打包到了*args这个参数中去了。

2、列表的拆包与元组一样

3、字典的拆包

其实用法与元组和列表一样,只不过字典拆包得到值是key而已。

dick = {"张三":18, "李四":22, "王五":24}
a, b, c = dick

张三 李四 王五

4、函数参数的装包与拆包

我们会经常看到如下形式定义的函数

def func(a, b, *args):print(a, b)print(type(args))print(args)

如果我们这样func(1, 2, 3, 4, 5, 6)调用函数,结果如下:

1 2
<class ‘tuple’>
(3, 4, 5, 6)

从结果出发我们可以得出如下结论:

  1. *args会把多余参数打包
  2. 打包之后的类型为元组

我们还可以这样传参数,

lis = (1, 2, 3, 4, 5, 6)
func(*lis)  # 回应上面方式二的使用情况

3、常见的应用场景

上面可以说是拆包的初相识,下面我们在来看看它的应用场景还有那些。

  • 元组和列表的拆包打印
stars = ("黎明", "华仔", "郭富城", "张学友")
print("四大天王:%s, %s, %s, %s" % stars)

如果你写成下面这样的,会使什么感受。太不pythonic了吧。

stars = ("黎明", "华仔", "郭富城", "张学友")
print("四大天王:%s, %s, %s, %s" % (stars[0], stars[1], stars[2], stars[3]))

再来看看列表的打印。你们可能感觉列表和元组的结果一样,但事实往往和我们想的它就不一样。

stars = ["黎明", "华仔", "郭富城", "张学友"]
print("四大天王:%s, %s, %s, %s" % stars)

在这里插入图片描述
报错,我只想说一句fucker,具体的原因我也没查到。猜测是%后面不接受这种长度或者数据可变的数据类型作为参数,当然只是猜测。
怎么解这个BUG呢,

stars = ["黎明", "华仔", "郭富城", "张学友"]
print("四大天王:%s, %s, %s, %s" % (*stars,))

为什么会这样呢,我不能只告诉你结果就完事了,那样没有意义,虽然我们不能把它的内裤拔下来一看究竟,那也得尝试拔他最外面的一层皮。
(*stars,)到底做了什么。一定注意括号内的,绝对不能丢。(*stars,)到底是何方神圣呢,看下面结果,这个操作直接把列表变成了一个元组,不是又学到了,列表转换成元组的又一种方法
在这里插入图片描述
还可以这么做,不过道理也是一样的:

print("四大天王:%s, %s, %s, %s" % tuple(stars))

即元组与列表的打印拆包中总结,只能默认拆包元组,如果是列表就先转换成元组在拆包。


http://chatgpt.dhexx.cn/article/hdYwgmZh.shtml

相关文章

Python中的解包

一、解包&#xff0c;英文名字叫UNPACKING,就是讲容器中所有的元素逐个取出来。 python中解包是自动完成的&#xff0c;例如&#xff1a; a,b,c [1,2,3] print(a,b,c) 1 2 3 除列表对象可以解包外PYTHON中的任何可迭代对象都可以进行解包&#xff0c;元组&#xff0c;字典&…

【Python小知识】:什么是序列解包

前言&#xff1a; &#x1f482;作者简介&#xff1a;大家好&#xff0c;我是翼同学&#xff01; &#x1f4c3;个人主页&#xff1a;翼同学的CSDN博客 &#x1f525;系列专栏&#xff1a;【python学习笔记】 &#x1f44f;备注&#xff1a;如果文章有误&#xff0c;请指正&…

python 抓包与解包

我使用的环境为&#xff1a;Windows10、python3.6、scapy 2.4.0 一、基本知识 Sniff方法定义&#xff1a;sniff(filter"",iface"any", prnfunction, countN)filter的规则使用 Berkeley Packet Filter (BPF)语法 iface用来指定要在哪个网络接口上进行抓包&…

.pkg文件解包

PePKG下载 1、拖入 RePKG.exe文件到cmd中 2、输入 extract&#xff0c;并将需要解包的 .pkg文件拖入cmd中 3、输入 -o 4、选择输出路径 创建一个文件拖入cmd中 回车即可完成解包

文件打包解包的方法

文件打包 前言 在很多情况下&#xff0c;软件需要隐藏一些图片&#xff0c;防止用户对其更改&#xff0c;替换。例如腾讯QQ里面的资源图片&#xff0c;哪怕你用Everything去搜索也搜索不到&#xff0c;那是因为腾讯QQ对这些资源图片进行了打包&#xff0c;当软件运行的时候解…

python中拆包解包用法详解

python可以对元组和字典进行拆包或解包操作。 1、拆包&#xff1a;元组 示例代码1&#xff1a; def return_num():return 100, 200num1, num2 return_num() print(num1) # 100 print(num2) # 200运行结果&#xff1a; 示例代码2&#xff1a; def return_num1():return 1…

android-apk解包打包

title: android-apk解包打包 categories: Android tags: [android, 加壳] date: 2022-09-28 10:29:51 comments: false mathjax: true toc: true android-apk解包打包, 以下所有操作都需要在配置好 java 环境下进行 前篇 android apk解包和打包 - https://blog.csdn.net/u0114…

Vue 3 之什么是 解包

Vue 3 之什么是 解包 前言结合代码分析总结 前言 从 Vue2 升到 Vue3 之后,用法上有了很大很大的变化 Vue3可以通过 ref 来声明一些响应式数据,可以是 any 类型的响应式数据 ,在 script 标签中访问和修改这个属性需要用 变量名.value Vue3 3.1 在 template 模板中使用定义的数…

python的解包

解包在英文里叫做 Unpacking&#xff0c;就是将容器里面的元素逐个取出来&#xff08;防杠精&#xff1a;此处描述并不严谨&#xff0c;因为容器中的元素并没有发生改变&#xff09;放在其它地方&#xff0c;好比你老婆去菜市场买了一袋苹果回来分别发给家里的每个成员&#xf…

apk解包+修改源码+重新打包 修改Android端app教程 修改apk文件教程

修改之前一定要先安装java开发环境&#xff0c;不会装的去自行百度。文章较长&#xff0c;耐心阅读。 一直在做Android应用开发&#xff0c;但对于从自己手中输出的apk包&#xff0c;了解并不是很深。最近想研究一下&#xff0c;消除下自己的一些技术盲点。 好吧&#xff0c;…

Python中的解包用法

Python中的解包用法 解包&#xff08;unpacking&#xff1a;解包&#xff0c;拆包&#xff09;&#xff0c;基本意思将容器里面的元素逐个取出来使用。封包&#xff08;packing&#xff1a;封包&#xff0c;打包&#xff09;基本意思将多个元素合起来作为一个整体使用。 可迭代…

SIP协议说明以及报文字段解析

SIP协议的概念&#xff1a; SIP 协议&#xff0c;即 会话初始协议&#xff08;Session Initiation Protocol&#xff09;&#xff0c;是一个应用层的 点对点协议&#xff0c;用于初始、管理和终止网络中的语音和视频会话&#xff0c;是 GB28181 的核心之一。 SIP是一个基于文本…

SIP 协议格式简介

消息体结构&#xff0c;由三部分组成&#xff1a; Request-Line / Status-Line (请求行 / 状态行)Header (消息头)Body (正文) 示例&#xff1a; Request-Line / Status-Line 介绍 Request-Line 格式&#xff1a; MethodRequest-URISIP-VersionCRLFINVITEsip:10011.1.1.1:5060…

会话初始协议---SIP协议【详解】

目录 ​ 一、SIP协议简介 二、SIP消息的两种会话模式 1、Session Model 2、Pager Model 三、SIP消息体格式 1、请求行(request-line) 2、状态行(status-line) 3、消息头 四、SIP消息举例 1、MESSAGE消息&#xff08;Pager Model&#xff09; 2、REGISTER消息 &…

SIP协议-02 原理讲解

文章目录 1 SIP实现机制2 SIP网络元素2.1 用户代理2.2 代理服务器2.3 重定向服务器2.4 位置服务器2.5 注册服务器 3 SIP中的几个重要概念3.1 Messages(消息)3.2 Dialog(对话)3.3 Transaction(事务)3.4 Session(会话) 4 工作流程4.1 登记注册4.2 建立呼叫4.3 重定向呼叫 5 SIP超…

SIP协议(二)

语音编码&#xff0c;语音帧&#xff0c;会议室 &#xff08;1&#xff09;语音编码&#xff0c;语音帧 &#xff08;2&#xff09;补充会议室的抓包 语音编码 现主要有的语音编码有: G.711, G.723, G.726 , G.729, ILBC&#xff0c;QCELP, EVRC, AMR, SMV 各种编解码都有其…

SIP协议解析与实现

SIP协议解析与实现 本文将按照RFC3261逐步的介绍SIP协议,介绍了c和c语言的实现&#xff0c;分析了osip库的使用和实现。 第一章 概述 一 概述 SIP协议是一个基于应用层的会话控制协议。它可以创建、修改、终止多媒体会话(会议)&#xff0c;也可以邀请参与者加入到一个现有的…

SIP协议-01 简介与入门

文章目录 1 介绍1.1 VoIP技术1.2 SIP&#xff08;Session Initiation Protocol&#xff09;1.3 SIP承载1.4 SIP的几个主要标准协议 2 SIP协议栈2.1 PJSIP协议栈2.2 ReSIProcate协议栈2.3 OPAL协议栈2.4 VOCAL协议栈2.5 sipX协议栈2.6 oSIP协议栈 SIP&#xff08;Session Initia…

通信系列2: 深入浅出SIP协议

传统电话是电磁波的通信&#xff0c;当电话技术发展到IP技术时代&#xff0c;SIP协议成为了电话通信标准协议&#xff0c;不仅可以通电话、还可以收发信息、视频、开会、放PPT。事实上&#xff0c;今天的通信业已全面采用SIP协议作为通信标准&#xff0c;无论是固定电话、还是移…

SIP协议简介(一)之SIP基本的概述

本篇文章主要是对RFC3261翻译进行的&#xff0c;也包含着自己的一些理解。希望能给需要的人带来一些帮助 补充说明&#xff1a;RFC即Request For Comments&#xff08;RFC&#xff09;&#xff0c;是一系列以编号排定的文件。文件收集了有关互联网相关信息&#xff0c;以及UNI…