当前位置: 首页 > news >正文

【Python Cookbook】S01E15 将名称映射到序列的元素中

目录

  • 问题
  • 解决方案
  • 讨论

问题

对于访问列表或元组中的元素,我们通常使用索引或者下标的方法。但是这明显会降低代码的可阅读性。如果我们想通过命名来提高代码的可阅读性,减少结构中对位置的依赖,怎么做?

解决方案

python 提供 collection.namedtuple() 方法(本文中称:命名元组),其根据提供的类型名称以及相应的字段,返回一个可实例化的类,包含定义好的字段传入值等:

from collections import namedtupleSubscriber = namedtuple('Subscriber', ['addr', 'joined'])
sub = Subscriber('x.hongd@hamail.com', '2012-12-31')
print("sub = ", sub)
print("sub.addr = ", sub.addr)
print("sub.joined = ", sub.joined)

在这里插入图片描述

同其他的元组一样,namedtuple() 函数支持所有普通元组的操作,例如分解:

addr, joined = sub
print("addr = ", addr)
print("joined = ", joined)

重要的是,命名元组 的主要作用在于将代码同它控制的元素位置间解耦。即,假如我们通过元素的位置来访问数据,当表单中新增一列数据时,会导致代码崩溃不可用,但是如果事先将返回的元组转型为 命名元组,即 namedtuple(),只需微调即可:

# 同控制的元素位置间未解耦
def compute_cost(records):total = 0.0for rec in records:total += rec[1] * rec[2]return total
# 解耦
from collections import namedtupleStock = namedtuple('Stock', ['name', 'shares', 'price'])
def compute_cost(records):total = 0.0for rec in records:s = Stock(*rec)total += s.shares * s.pricereturn total

Stock(*rec) 这行代码使用 * 操作符来解包 rec 元组,将其中的每个元素作为参数传递给 Stock 构造函数,创建一个新的 Stock 对象 s。如此,s 就有了 namesharesprice 属性,可以直接通过属性访问。

讨论

namedtuple() 对比字典,其占用更小的空间来存储,更加高效,但是正如其是元组类型,其内容以及值是不可变的。要修改任何属性,需要通过 namedtuple() 实例的 replace() 方法来实现。

该方法会创建一个全新的命名元组,并修改对应的属性的值:

s = Stock('ACME', 100, 123.45)
s.shares = 75
>>> AttributeError: can't set attributes = s._replace(shares=75)
print(s)

相关文章:

  • Next.js API Routes:构建服务端功能
  • vue限制日期选择器不能选今年后的日期
  • Unity开发——编辑器打包、3种方式加载AssetBundle资源
  • day25-XML
  • 二叉树非递归遍历(C++)
  • springcloud Feign调用拦截器(统一处理拷贝请求头实现透传信息、内部调用鉴权、打印feign调用)
  • 【C++入门到精通】C++ thread线程库 [ C++入门 ]
  • 就凭这张图,下订华为享界S9
  • Linux系统使用Docker安装Drupal结合内网穿透实现远程访问管理后台
  • CMakeFile.txt通过sysroot方式后生成makefile报错
  • 构建LangChain应用程序的示例代码:7、如何使用Amazon Personalize服务的教程
  • git随记
  • ant design vue 表格错位,表头错位
  • 【安装笔记-20240528-Linux-在 Vultr 云服务器上安装 OpenWRT】
  • DP读书:《半导体物理学(第八版)》(七) 金属与半导体的接触- 10 min 速通(载流子分布)
  • Android优雅地处理按钮重复点击
  • CentOS 7 防火墙操作
  • CSS居中完全指南——构建CSS居中决策树
  • Flex布局到底解决了什么问题
  • Java 网络编程(2):UDP 的使用
  • js如何打印object对象
  • orm2 中文文档 3.1 模型属性
  • Promise面试题,控制异步流程
  • spark本地环境的搭建到运行第一个spark程序
  • springboot_database项目介绍
  • sublime配置文件
  • 关于extract.autodesk.io的一些说明
  • 简析gRPC client 连接管理
  • 学习Vue.js的五个小例子
  • 学习笔记:对象,原型和继承(1)
  • 用简单代码看卷积组块发展
  • 云大使推广中的常见热门问题
  • C# - 为值类型重定义相等性
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​​​​​​​​​​​​​​Γ函数
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ​520就是要宠粉,你的心头书我买单
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​io --- 处理流的核心工具​
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • (2)STM32单片机上位机
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (floyd+补集) poj 3275
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (vue)页面文件上传获取:action地址
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (十三)MipMap
  • (十五)、把自己的镜像推送到 DockerHub
  • (四)opengl函数加载和错误处理
  • ****Linux下Mysql的安装和配置