元组啊,不就是不可变的列表吗?

news2025/7/25 7:09:45

在这里插入图片描述
B站|公众号:啥都会一点的研究生

相关阅读

整理了几个100%会踩的Python细节坑,提前防止脑血栓
整理了十个100%提高效率的Python编程技巧,更上一层楼
Python-列表,从基础到进阶用法大总结,进来查漏补缺
Python-元组,从基础到进阶用法大总结及与列表核心区别,进来查漏补缺
Python-字典,从基础到进阶用法大总结,进来查漏补缺
Python-集合,从基础到进阶大总结,进来查漏补缺
这些包括我在内都有的Python编程陋习,趁早改掉
订阅专栏 ===> Python

问:元组是什么

答:呃,呃,内个,嗷,不就是“不可变的列表”嘛。

这个概括对吗?不能说对错,只能说概括不完全,元组除开用作不可变的列表,另一个常被忽略但极其实用的作用是,用于没有字段名的记录,本期我试图和大家一起学习归纳元组的常用方法,争取更上一层楼

首先来看看大家熟知的用法,用作不可变的列表,一句话概括就是,除了跟增删元素相关的方法外,元组支持列表的其他所有方法,为了方便说明,使用dir()分别查看列表与元组的内置方法与属性

dir(list)
# ['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__delitem__', 
'__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', 
'__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', 
'__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
 '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__',
  '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 
  'remove', 'reverse', 'sort']

dir(tuple)
# ['__add__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__dir__', 
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', 
'__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__',
 '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', 
 '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']

使用help()则可以查看内置方法与属性的说明,知道大家十有八九不会再逐个help查看,行吧,我来吧,带大家一一查看对比列表与元组中除开object类支持的方法外的其他方法和属性,以列表为参考进行比照

首先看属性,列表与元组都支持的有这些

s.__add__(s2)     # 拼接,s + s2,不改变s
s.__contains__(e) # s是否包含e,e in s
s.__getitem__(p)  # 获取s中位置p的元素,s[p]
s.__iter__()      # 获取s的迭代器
s.__len__()       # 获取元素数量,len(s)
s.__mul__(n)      # n个s的重复拼接,s * n,不改变s
s.__rmul__(n)     # 反向拼接,n * s

然后就是列表支持但元组不支持的

s.__iadd__(s2)      # 拼接, s += s2,改变s
s.__delitem__(p)    # 删除s中位于p的元素 del s[p]
s.__imul__(n)       # n个s的重复拼接,s *= n,改变s
s.__reversed__()    # 返回 s 的倒序迭代器
s.__setitem__(p, e) # 将s中位置p的元素替换为e,s[p] = e

接着,我们再一起来看看列表与元组都支持的方法

s.count(e) # e在s中的个数
s.index(e) # e在s中第一次出现的位置索引

是的,没了,紧接着看看列表支持但元组不支持的方法

s.append(e)              # 在s尾部新增元素
s.clear()                # 清空s所有元素,保留s对象
s.copy()                 # 浅拷贝s
s.extend(it)             # 将可迭代对象it追加给s
s.insert(p, e)           # 在s的p位置之前插入元素e
s.pop([p])               # 删除s中最后或(可选的)位于p的元素,并返回它的值
s.remove(e)              # 删除 s 中的第一次出现的e值
s.reverse()              # 把 s 的元素倒序排列,改变s
s.sort([key], [reverse]) # 对s中的元素进行排序,可选的参数有键(key)和是否倒序(reverse),改变s

OK,归纳完毕,想必大家对元组充当不可变列表,哪些可用,哪些不可用有了进一步了解,我是不会主动问大家要三连的

接下来继续看看另一个用途,数据记录,如果仅把元组理解为不可变的列表,那所含元素的总数和对应位置似乎就变得可有可无,但若当成字段集合,那么这些信息就变得很重要了,举些例子来说明

比如,在元组中存放直线的斜率与截距

line_k_b = (1.0322, -10.6667) # k, b

元组同样支持存放不同类型的数据

name, age, height, weight = ('CaiXukong', 30, 142.01, 180.02)

当数据增多时,通常还会以元组列表的形式存放并且搭配循环遍历,使用%格式运算符可以匹配元组中对应元素

user_infos = [('ZS', '001'), ('LS', '002'), ('WW', '003')]

for user_info in user_infos:
    print('%s/%s' % user_info)
    
"""
ZS/001
LS/002
WW/003
"""

此外,还可以使用拆包提取元素

user_infos = [('ZS', '001'), ('LS', '002'), ('WW', '003')]

for name, uid in user_infos:
    print(name)
    
"""
ZS
LS
WW
"""

关于拆包,最常见的就是平行赋值,比如之前的例子,把一个可迭代对象中的元素赋值到对应变量组成的元组中,对应变量组成的元组也就是说其实name, age, height, weight也为元组

name, age, height, weight = ('CaiXukong', 30, 142.01, 180.02)

说到这里当然得提一下利用这个特性快速进行值交换的例子,我们可以使用如下方法交换两个变量的值

b, a = a, b

然后通常搭配*运算符把一个可迭代对象拆开作为函数的参数,比如使用divmod得到10除以8的商和余数,提一嘴,其实函数返回值也是元组类型

divmod(10, 8) # 1, 2

type(divmod(10, 8)) # <class 'tuple'>

将10和8存入元组中并结合*运算符喂给函数同样达到目的

data = (10, 8)
quotient, remainder = divmod(*data)

# quotient : 1
# remainder : 2

但有时候不是对所有数据感兴趣,比如只会用到余数,那么则可以使用_占位符处理这种情况

data = (10, 8)
_, remainder = divmod(*data)

# remainder : 2

讲到这个,那如果我不感兴趣的数据很多怎么办,诶没关系,*运算符可以助你宠幸关心的数据,我们知道在Python中经常使用*args来获取不确定的参数,这个用法也被扩展到了平行赋值中,一起来看看这个例子

a, b, *rest = range(10)
# 0 1 [2, 3, 4, 5, 6, 7, 8, 9]

a, b, *rest = range(3)
# 0 1 [2]

a, b, *rest = range(2)
# 0 1 []

虽然这个运算符只能出现在一个变量名之前,但是这个变量可以在赋值表达式的任意位置出现,不止尾部,比如中间和头部

a, *middle, b = range(10)
# 0 [1, 2, 3, 4, 5, 6, 7, 8] 9

*head, b, c = range(10)
# [0, 1, 2, 3, 4, 5, 6, 7] 8 9

元组的拆包同样也可以用于嵌套结构,比如这个例子

*head, (b, c) = (1, 2, (3, 4)) 
# [1, 2] 3 4

注意了如果bc不加括号,则得到的结果完全就不同了

*head, b, c = (1, 2, (3, 4)) 
# [1] 2 (3, 4)

讲完了拆包,下一个要讲的则是具名元组namedtuple,它继承了普通元组的属性,那是干嘛的呢,元组如果作为记录来用,缺少给记录的字段命名的功能。而namedtuple常用来构建一个带字段名的元组和一个有名字的类,怎么用呢,来看看这个例子

先看第二行,创建一个具名元组需要两个参数,一个类名,一个该类各字段的名字,后者可以是由若干字符串组成的可迭代对象,或由空格分开的字段名组成的单字符串

下一行,存放在对应字段里的数据要以一串参数的形式传入,然后便可以通过字段名或者位置来获取一个字段的信息

from collections import namedtuple
User = namedtuple('User', ['name', 'age', 'height', 'weight'])
# User = namedtuple('User', 'name age height weight')
CaiXukang = User('CaiXukang', 30, 142.01, 180.02)

print(CaiXukang.weight) # 180.02

ok,以上呢就是本期的全部内容,整理不易,有任何错误与补充欢迎在评论区指出,我是啥都生,我们下期再见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/35421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ABAP】EXIT_SAPLMBMB_001无法Debug调试问题处理

【ABAP】EXIT_SAPLMBMB_001无法Debug调试问题处理 不久前看到SAP Community里面有这样一个问题&#xff0c;可能比较老了&#xff0c;但个人觉得比较新奇&#xff0c;就去做了下面一个测试。 首先通过事务代码“CMOD”对增强“MB_CF001”&#xff08;更新物料凭证时的客户功能出…

《从零开始:机器学习的数学原理和算法实践》chap6

《从零开始&#xff1a;机器学习的数学原理和算法实践》chap6 学习笔记 文章目录6.1 凸函数6.2 梯度下降引入梯度是什么为啥梯度是上升最快的方向捏梯度下降与参数求解梯度下降过程演示6.3 代码实践 梯度下降一元函数的梯度下降多元函数的梯度下降6.1 凸函数 凸集 何为凸集 凸集…

c# 多线程

案例1 单线程与多线程对比 单线程会卡主线程,此时会将ui界面给卡住。而多线程开启以后就好了 不会卡住主线程,且运行速度快,相当于多个同时运动。 单线程按钮 private void singlethread_Click(object sender, EventArgs e){for

Kafka多生产者消费者自动配置

背景 项目中不同的业务可能会使用多个kafka&#xff0c;按默认的Kafka配置&#xff0c;最多是支持消费者和生产者使用不同的Kafka&#xff0c;如果两个生产者使用不同的Kafka则需要自定义配置&#xff0c;生成对应的bean。 解决方案 多生产者&#xff0c;多消费者&#xff0…

PowerDesigner 设置

PowerDesigner 设置前言推荐PowerDesigner 设置简单设置sql反向生成物理模型物理模型创建索引最后前言 以下内容源自自己 仅供学习交流使用 推荐 第11章 数据库的设计规范【2.索引及调优篇】【MySQL高级】 powerdesign 通过sql反向生成ER模型 PowerDesiner 15 在物理模型中…

Python测试框架之unittest和pytest 的区别

一、Unittest Unittest是Python标准库中自带的单元测试框架&#xff0c;Unittest有时候也被称为PyUnit&#xff0c;就像JUnit是Java语言的标准单元测试框架一样&#xff0c;Unittest则是Python语言的标准单元测试框架。 Unittest支持自动化测试&#xff0c;测试用例的初始化、…

FFN -> GLU -> GAU

1 GLU GLU的起源是2016年由Yann N. Dauphin在 论文:Language Modeling with Gated Convolutional Networks 在语言模型的建模方法上相比于循环神经网络更具有竞争力&#xff0c;提出了一种简单的线性门控单元来堆叠卷积层从而使得文本中的token可以并行化处理来获得上下文的语义…

HTTP响应详解

目录 一.状态码 小结&#xff08;记住&#xff09; 二.认识响应正文&#xff08;body&#xff09; 三.如何构造http请求 一.状态码 是一个数字&#xff0c;这个数字描述了当前这次请求的状态&#xff08;成功&#xff0c;失败&#xff0c;失败的原因&#xff09; http的状态…

Typora基础篇

Markdown基础 标题 #标题名字&#xff08;#号的个数代表标题的级数&#xff09; 文件-偏好设置-Markdown里面如果勾选了严格模式&#xff0c;那#与标题名称之间就需要加上一个空格一级标题用1个# 二级标题用2个# 三级标题用3个# 四级标题用4个# 五级标题用5个# ####### …

262-视口,布局视口,视觉视口,移动端适配,less语法,比哪里,DPR,RRI,less的弊端,运算,嵌套,混合,继承,混入,运算,

262-CSS中的单位 ◼ 前面编写的CSS中,我们经常会使用px来表示一个长度(大小),比如font-size设置为18px,width设置为100px。 ◼ px是一个长度(length)单位,事实上CSS中还有非常多的长度单位。 ◼ 整体可以分成两类:  绝对长度单位(Absolute length units);  相…

【uniapp】安装与使用uView组件库:

文章目录一、官网文档二、安装【1】进入控制台【2】初始化package.json【3】安装uView-ui【4】配置main.js【5】配置uni.scss【6】配置easycom组件模式【7】app.vue引入基础样式三、效果一、官网文档 https://www.uviewui.com/ 二、安装 【1】进入控制台 【2】初始化package…

基于sklearn的集成学习实战

集成学习投票法与bagging 投票法 sklearn提供了VotingRegressor和VotingClassifier两个投票方法。使用模型需要提供一个模型的列表&#xff0c;列表中每个模型采用tuple的结构表示&#xff0c;第一个元素代表名称&#xff0c;第二个元素代表模型&#xff0c;需要保证每个模型…

《计算机体系结构量化研究方法第六版》1.3 计算机体系结构的定义

1.3.1 指令集体系结构&#xff1a;计算机体系结构的近距离审视 1、这里通过指令集体系结构 ISA来指代程序员可以看到的实际指令集。ISA相当于软件和硬件之间的界限。 &#xff08;1&#xff09;ISA分类 几乎所有的ISA都被划分到了通用寄存器体系结构中&#xff0c;在这种体系…

能源消耗监测管理系统:实现企业用能定额、降低成本节能管理

现如今&#xff0c;很多企业还停留在安装各种节能产品或者是传统节能技术来达到节能目的&#xff0c;但是这些方法不能从根本上实现节能目标&#xff0c;从而导致企业效益。 在国家推动下&#xff0c;能源管理系统加入了互联网的技术以及数字化技术来协同管理&#xff0c;软硬…

二叉树链式结构的实现及简单操作(画图超详细解释)

二叉树链式结构的实现及简单操作前置说明前序遍历中序遍历后序遍历层序遍历如何判断一颗二叉树是完全二叉树通过前序遍历的数组构建二叉树销毁二叉树总结前置说明 由于我们要对二叉树进行操作&#xff0c;我们就得现有一个二叉树&#xff0c;而二叉树的构建又比较复杂&#xf…

李宏毅机器学习作业10——Adversarial Attack

目录 目标和方法 评价方法 导包 Global Settings Data transform Dataset 代理网络 评估模型在非攻击性图像上的表现 Attack Algorithm FGSM I-FGSM MI-FGSM Diverse Input (DIM) 攻击函数 Attack Ensemble Attack 集成模型函数 构建集成模型 进行攻击 FG…

【Node.js】第八章 express编写接口

目录 1. 编写接口 1.1 编写GET接口 2.2 编写POST接口 2. 接口跨域问题 2.1 跨域问题 2.2 使用cors中间件解决跨域问题 2.3 CORS ​2.4 JSONP接口 1. 编写接口 1.1 编写GET接口 2.2 编写POST接口 2. 接口跨域问题 2.1 跨域问题 2.2 使用cors中间件解决跨域问题 cor…

家里Win7电脑如何连接公司Win10电脑?快解析+远程桌面

什么是远程桌面&#xff1f;通俗地讲&#xff0c;就是可以在任何地点登陆位于其他地点的电脑&#xff0c;可以看到远程登陆电脑的一切东西&#xff0c;可以进行添加、改变、删除文件等任何操作&#xff0c;就像自己在那台电脑前操作一样。远程桌面有丰富的应用场景&#xff0c;…

如何在TIA博途中在线更新PLC的CPU固件版本?

如何在TIA博途中在线更新PLC的CPU固件版本? S7-1200PLC最新的V4.6.0版本的固件出来了,本次就以V4.6版本的固件为例,演示如何在博途中对PLC的固件版本进行更新。 (为防止更新过程中出现意外,强烈建议对PLC的程序进行备份!备份!备份!) 如下图所示,打开某个项目,选中PL…

nm命令使用详解,让你加快学习速度

nm 命令详解 符号是每个ELF文件的一个重要部分&#xff0c;因为它保存了程序实现或使用的所有(全局)变量和函数。符号表中保存了查找程序符号、为符号赋值、重定位符号所需要的全部信息。Linux中 nm用来列出目标文件的符号表;如果nm指令没有指出目标文件&#xff0c;则nm假定目…