玩轉python:通俗易懂掌握高級數據結構:collections模塊之namedtuple

引言

namedtuple是Python中collections模塊提供的一個強大工具,用于創建具有字段名的元組。它不僅具備元組的不可變性,還能通過字段名訪問元素,極大地提高了代碼的可讀性和可維護性。本文將詳細介紹namedtuple的關鍵用法和特性,并通過8個豐富的案例幫助讀者掌握其應用。


具名元組關鍵用法和特性
特性/方法描述
不可變性一旦創建,namedtuple的內容不可修改,適合存儲常量數據。
字段名訪問可以通過字段名(如obj.field)訪問元素,代碼更易讀。
內存效率與普通類相比,namedtuple占用更少內存,性能更高。
定義方式使用namedtuple(typename, field_names)創建。
_fields返回所有字段名的元組。
_make(iterable)從可迭代對象創建namedtuple實例。
_asdict()namedtuple轉換為字典。
_replace(**kwargs)返回一個新的namedtuple實例,替換指定字段的值。

1. namedtuple的概念

namedtuplecollections模塊中的一個工廠函數,用于創建具有字段名的元組。它的主要特點是:

  • 不可變性:一旦創建,內容不可修改。
  • 字段名訪問:可以通過字段名訪問元素,代碼更易讀。
  • 內存效率:與普通類相比,namedtuple占用更少內存,性能更高。

2. namedtuple的用法

2.1 創建namedtuple
from collections import namedtuple# 定義一個表示二維點的namedtuple
Point = namedtuple('Point', ['x', 'y'])# 創建實例
p = Point(10, 20)
print(p.x, p.y)  # 輸出: 10 20
2.2 訪問字段
# 通過字段名訪問
print(p.x)  # 輸出: 10
print(p.y)  # 輸出: 20# 通過索引訪問
print(p[0])  # 輸出: 10
print(p[1])  # 輸出: 20

3. namedtuple的常見方法

3.1 _fields:查看字段名
print(p._fields)  # 輸出: ('x', 'y')
3.2 _make(iterable):從可迭代對象創建實例
# 從列表創建
p2 = Point._make([30, 40])
print(p2)  # 輸出: Point(x=30, y=40)
3.3 _asdict():轉換為字典
print(p._asdict())  # 輸出: {'x': 10, 'y': 20}
3.4 _replace(**kwargs):替換字段值
# 替換x的值
p3 = p._replace(x=100)
print(p3)  # 輸出: Point(x=100, y=20)

4. namedtuple的8個應用案例

案例1:表示二維坐標
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(f"坐標: ({p.x}, {p.y})")  # 輸出: 坐標: (10, 20)
案例2:表示RGB顏色
Color = namedtuple('Color', ['red', 'green', 'blue'])
white = Color(255, 255, 255)
print(f"白色: {white}")  # 輸出: 白色: Color(red=255, green=255, blue=255)
案例3:表示學生信息
Student = namedtuple('Student', ['name', 'age', 'grade'])
s = Student('Alice', 20, 'A')
print(f"學生: {s.name}, 年齡: {s.age}, 成績: {s.grade}")  # 輸出: 學生: Alice, 年齡: 20, 成績: A
案例4:表示日期
Date = namedtuple('Date', ['year', 'month', 'day'])
d = Date(2023, 10, 5)
print(f"日期: {d.year}-{d.month}-{d.day}")  # 輸出: 日期: 2023-10-5
案例5:表示書籍信息
Book = namedtuple('Book', ['title', 'author', 'year'])
b = Book('Python編程', 'Guido van Rossum', 2020)
print(f"書籍: {b.title}, 作者: {b.author}, 出版年份: {b.year}")  # 輸出: 書籍: Python編程, 作者: Guido van Rossum, 出版年份: 2020
案例6:表示幾何圖形
Circle = namedtuple('Circle', ['radius', 'center'])
c = Circle(5, Point(0, 0))
print(f"圓: 半徑={c.radius}, 中心=({c.center.x}, {c.center.y})")  # 輸出: 圓: 半徑=5, 中心=(0, 0)
案例7:表示購物車商品
Product = namedtuple('Product', ['name', 'price', 'quantity'])
item = Product('手機', 2999, 2)
print(f"商品: {item.name}, 單價: {item.price}, 數量: {item.quantity}")  # 輸出: 商品: 手機, 單價: 2999, 數量: 2
案例8:表示網絡請求的響應
Response = namedtuple('Response', ['status_code', 'data', 'headers'])
res = Response(200, {'message': '成功'}, {'Content-Type': 'application/json'})
print(f"響應: 狀態碼={res.status_code}, 數據={res.data}, 頭信息={res.headers}")  # 輸出: 響應: 狀態碼=200, 數據={'message': '成功'}, 頭信息={'Content-Type': 'application/json'}

總結

namedtuple是Python中一個非常實用的工具,能夠顯著提升代碼的可讀性和性能。通過本文的詳細講解和8個實際案例,讀者可以快速掌握namedtuple的使用方法,并在實際項目中靈活應用。無論是表示簡單的二維坐標,還是復雜的網絡響應,namedtuple都能勝任!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/73217.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73217.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/73217.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

我的創作紀念日:730天的技術寫作之旅

我的創作紀念日:730天的技術寫作之旅 機緣 從一篇案例分析開始 2023年3月13日,我寫下了第一篇技術博客《軟考高級-系統分析師-案例分析-系統維護與設計模式》。那時的初心很簡單: 沉淀實戰經驗——在備考軟考系統分析師時,發現…

使用 Arduino 和 ESP8266 Wi-Fi 模塊發送電子郵件

使用 Arduino Uno 和 ESP8266 Wi-Fi 模塊發送電子郵件 我們正在邁向物聯網 (IoT) 世界。這項技術在電子和嵌入式系統中起著非常重要的作用。從任何微控制器或嵌入式系統發送電子郵件都是非常基本的事情,這在 IoT 中是必需的。因此,在本文中,我們將學習“如何使用 Wi-Fi 和…

golang算法二叉樹對稱平衡右視圖

100. 相同的樹 給你兩棵二叉樹的根節點 p 和 q ,編寫一個函數來檢驗這兩棵樹是否相同。 如果兩個樹在結構上相同,并且節點具有相同的值,則認為它們是相同的。 示例 1: 輸入:p [1,2,3], q [1,2,3] 輸出&#xff1a…

c++介紹智能指針 十二(1)

普通指針:指向內存區域的地址變量。使用普通指針容易出現一些程序錯誤。 如果一個指針所指向的內存區域是動態分配的,那么這個指針變量離開了所在的作用域,這塊內存也不會自動銷毀。動態內存不進行釋放就會導致內存泄露。如果一個指針指向已…

亞馬遜COSMO算法解讀:新搜索時代的流量分配與DeepBI AI驅動的智能優化策略

亞馬遜COSMO算法的推出,標志著其搜索和推薦系統進入了智能化、個性化的新階段。該算法通過分析用戶購物習慣、搜索歷史、瀏覽行為等數據,為買家提供精準推薦,同時對賣家的運營策略提出了更高的要求。在這一背景下,AI驅動的DeepBI能…

C++編譯問題——1模板函數的實現必須在頭文件中

今天編譯數據結構時&#xff0c;遇見一個編譯錯誤 假設你有一個頭文件 SeqList.h 和一個源文件 SeqList.cpp。 SeqList.h #ifndef SEQLIST_H #define SEQLIST_H#include <stdexcept> #include <iostream>template<typename T> class SeqList { private:sta…

安卓實現魔改版 CRC32 算法

版權歸作者所有&#xff0c;如有轉發&#xff0c;請注明文章出處&#xff1a;https://cyrus-studio.github.io/blog/ 關于 CRC32 算法介紹可以參考這篇文章&#xff1a;常用加解密算法介紹 標準 CRC32 算法 創建 crc32.cpp&#xff0c;使用 C 實現標準 CRC32 算法 #include …

OneHot編碼與OrdinalEncoder編碼的區別與應用解析

OneHot編碼和OrdinalEncoder編碼是兩種常見的類別特征編碼方式&#xff0c;它們的主要目的是將類別數據轉換為數值數據&#xff0c;以便機器學習算法能夠處理。下面是對這兩種編碼方式的詳細解釋和比較&#xff1a; 一、OneHot編碼 1. 定義&#xff1a; OneHot編碼是一種將每…

python離線安裝

Python Releases for Windows | Python.org 下載包地址widows一般是64bit的包 下載完成后雙擊&#xff0c;在彈出的首個頁面會看到下面的圖 第一步&#xff1a;建議手動安裝 第二步&#xff1a;一定要勾選把版本加入到Path路徑 然后就是無腦下一步&#xff0c;到這一步就可…

Web開發-PHP應用文件操作安全上傳下載任意讀取刪除目錄遍歷文件包含

知識點&#xff1a; 1、安全開發-原生PHP-文件安全操作 2、安全開發-原生PHP-上傳讀取刪除包含等 3、安全開發-原生PHP-代碼審計文件安全 一、演示案例-WEB開發-文件安全-上傳下載讀取 文件上傳 $_FILES&#xff1a;PHP中一個預定義的超全局變量&#xff0c;用于在上傳文件時…

自然語言處理:文本聚類

介紹 大家好&#xff0c;博主又來和大家分享自然語言處理領域的知識了。今天給大家分享的內容是自然語言處理中的文本聚類。 文本聚類在自然語言處理領域占據著重要地位&#xff0c;它能將大量無序的文本按照內容的相似性自動劃分成不同的類別&#xff0c;極大地提高了文本處…

JavaScript 運算符詳解

引言 在 JavaScript 編程中&#xff0c;運算符是用于對數據進行操作的特殊符號。通過使用運算符&#xff0c;我們可以實現各種計算、比較和邏輯判斷等功能。JavaScript 中的運算符種類豐富&#xff0c;涵蓋了算術、比較、邏輯、賦值等多個方面。下面將詳細介紹各類運算符及其使…

基于javaweb的SpringBoot個人健康管理系統小程序微信小程序設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論…

責任鏈模式的C++實現示例

核心思想 責任鏈模式是一種行為設計模式&#xff0c;允許多個對象都有機會處理請求&#xff0c;從而避免請求的發送者與接收者之間的耦合。請求沿著處理鏈傳遞&#xff0c;直到某個對象處理它為止。 解決的問題 ?解耦請求發送者與處理者&#xff1a;請求的發送者無需知道具…

Java 無 GUI 瀏覽器:HtmlUnit 入門及實戰 [特殊字符]

文章目錄 HtmlUnit 入門功能簡介入門案例更多功能HtmlUnit 實戰需求頁面分析編碼參考? 本文目標: HtmlUnit 框架入門HtmlUnit 框架實戰:實現 HtmlUnit 訪問 Web 頁面,并實現 Web 頁面按鈕點擊,同時獲取到下載的文件。HtmlUnit 入門 ?? 官網:https://htmlunit.sourcefo…

微軟 NativeAOT

微軟Native AOT&#xff08;Ahead-Of-Time&#xff09;是.NET平臺中一種新的運行模式&#xff0c;它直接將IL&#xff08;Intermediate Language&#xff0c;中間語言&#xff09;代碼編譯為目標平臺的機器碼發布&#xff0c;與JIT&#xff08;Just-In-Time&#xff0c;即時編譯…

Vue項目搜索引擎優化(SEO)終極指南:從原理到實戰

文章目錄 1. SEO基礎與Vue項目的挑戰1.1 為什么Vue項目需要特殊SEO處理&#xff1f;1.2 搜索引擎爬蟲工作原理 2. 服務端渲染&#xff08;SSR&#xff09;解決方案2.1 Nuxt.js框架實戰原理代碼實現流程圖 2.2 自定義SSR實現 3. 靜態站點生成&#xff08;SSG&#xff09;技術3.1…

Java 枚舉

一、簡介 Java 枚舉是一種強大的工具&#xff0c;其本質上是一個繼承自 java.lang.Enum 的類&#xff0c;用于定義一組固定的常量&#xff0c;每個枚舉常量都是該枚舉類的一個實例。枚舉不僅提供了類型安全性&#xff0c;還可以像普通類一樣擁有字段、方法和構造函數。枚舉的使…

CentOS7安裝DNS服務器bind

文章目錄 安裝DNS服務設置配置文件自定義域名解析完整配置 需求是公司內網服務器無法連接外網&#xff0c;需要在本地搭建DNS服務&#xff0c;這樣物理機器遷移到內網后&#xff0c;通過域名解析訪問服務 DNS服務器 172.25.14.215 ip域名172.25.14.216mysql.server172.25.14.2…

DFS刷題(25.3.13)

題目1——烤雞 題目描述 題解 這是一個簡單的暴搜題目&#xff0c;由于一共由10種配料&#xff0c;每種配料可以放1到3克&#xff0c;因此只需要用dfs對每種配料放入的質量進行暴力搜索即可&#xff0c;如果放入的配料質量之和等于題目給出的美味程度 n n n&#xff0c;記錄一…