09_常用内置模块进阶

第9课:常用内置模块进阶

课程目标

  • 深入学习Python常用内置模块
  • 掌握collections、itertools、functools等模块
  • 学习json、csv、pickle等数据处理模块

1. collections模块

1.1 Counter类

from collections import Counter# 统计元素出现次数
text = "hello world python programming"
char_count = Counter(text)
print("字符统计:", char_count)# 统计单词出现次数
words = text.split()
word_count = Counter(words)
print("单词统计:", word_count)# 获取最常见的元素
print("最常见的3个字符:", char_count.most_common(3))

1.2 defaultdict类

from collections import defaultdict# 默认字典,自动创建默认值
d = defaultdict(list)
d['a'].append(1)
d['a'].append(2)
d['b'].append(3)
print("defaultdict:", dict(d))# 统计单词首字母
words = ['apple', 'banana', 'apricot', 'blueberry']
letter_words = defaultdict(list)
for word in words:letter_words[word[0]].append(word)
print("按首字母分组:", dict(letter_words))

1.3 namedtuple类

from collections import namedtuple# 创建命名元组
Point = namedtuple('Point', ['x', 'y'])
p1 = Point(3, 4)
p2 = Point(6, 8)print(f"点1: ({p1.x}, {p1.y})")
print(f"点2: ({p2.x}, {p2.y})")# 创建学生记录
Student = namedtuple('Student', ['name', 'age', 'grade'])
students = [Student('张三', 20, 85),Student('李四', 19, 92),Student('王五', 21, 78)
]for student in students:print(f"{student.name}: {student.age}岁,成绩{student.grade}")

2. itertools模块

2.1 无限迭代器

import itertools# 无限计数
counter = itertools.count(1, 2)  # 从1开始,步长为2
print("前5个偶数:")
for i, num in enumerate(counter):if i >= 5:breakprint(num, end=" ")
print()# 无限循环
cycle_items = itertools.cycle(['A', 'B', 'C'])
print("循环前10次:")
for i, item in enumerate(cycle_items):if i >= 10:breakprint(item, end=" ")
print()

2.2 组合迭代器

import itertools# 排列
items = ['a', 'b', 'c']
permutations = list(itertools.permutations(items, 2))
print("2个元素的排列:", permutations)# 组合
combinations = list(itertools.combinations(items, 2))
print("2个元素的组合:", combinations)# 笛卡尔积
colors = ['红', '蓝']
sizes = ['S', 'M', 'L']
products = list(itertools.product(colors, sizes))
print("颜色和尺寸的笛卡尔积:", products)

3. functools模块

3.1 partial函数

from functools import partial# 创建偏函数
def greet(greeting, name):return f"{greeting}, {name}!"hello = partial(greet, "Hello")
goodbye = partial(greet, "Goodbye")print(hello("张三"))
print(goodbye("李四"))

3.2 reduce函数

from functools import reduce# 计算列表元素的和
numbers = [1, 2, 3, 4, 5]
total = reduce(lambda x, y: x + y, numbers)
print(f"总和: {total}")# 计算列表元素的最大值
max_num = reduce(lambda x, y: x if x > y else y, numbers)
print(f"最大值: {max_num}")# 阶乘计算
def factorial(n):return reduce(lambda x, y: x * y, range(1, n + 1))print(f"5的阶乘: {factorial(5)}")

4. json模块

4.1 基本操作

import json# Python对象转JSON字符串
data = {'name': '张三','age': 25,'city': '北京','skills': ['Python', 'Java', 'SQL'],'married': False,'salary': None
}json_string = json.dumps(data, ensure_ascii=False, indent=2)
print("JSON字符串:")
print(json_string)# JSON字符串转Python对象
parsed_data = json.loads(json_string)
print("\n解析后的数据:")
print(f"姓名: {parsed_data['name']}")
print(f"技能: {', '.join(parsed_data['skills'])}")# 写入JSON文件
with open('data.json', 'w', encoding='utf-8') as f:json.dump(data, f, ensure_ascii=False, indent=2)

5. csv模块

5.1 读写CSV文件

import csv# 写入CSV文件
students = [['姓名', '年龄', '成绩', '城市'],['张三', 20, 85, '北京'],['李四', 19, 92, '上海'],['王五', 21, 78, '广州']
]with open('students.csv', 'w', newline='', encoding='utf-8') as f:writer = csv.writer(f)writer.writerows(students)print("CSV文件写入完成")# 读取CSV文件
with open('students.csv', 'r', encoding='utf-8') as f:reader = csv.reader(f)for row in reader:print(row)

6. 练习项目

项目:数据分析工具

from collections import Counter, defaultdict
import json
import csvclass DataAnalyzer:def __init__(self):self.data = []def load_from_csv(self, filename):"""从CSV文件加载数据"""with open(filename, 'r', encoding='utf-8') as f:reader = csv.DictReader(f)self.data = list(reader)print(f"从{filename}加载了{len(self.data)}条数据")def analyze_numeric_field(self, field_name):"""分析数值字段"""values = [float(item[field_name]) for item in self.data if item[field_name].replace('.', '').isdigit()]if not values:return Noneanalysis = {'count': len(values),'sum': sum(values),'average': sum(values) / len(values),'min': min(values),'max': max(values)}return analysisdef analyze_categorical_field(self, field_name):"""分析分类字段"""values = [item[field_name] for item in self.data if item[field_name]]counter = Counter(values)analysis = {'unique_count': len(counter),'most_common': counter.most_common(5),'total_count': len(values)}return analysisdef group_by_field(self, group_field, value_field):"""按字段分组统计"""grouped_data = defaultdict(list)for item in self.data:if item[group_field] and item[value_field]:try:value = float(item[value_field])grouped_data[item[group_field]].append(value)except ValueError:continue# 计算每组的统计信息group_stats = {}for group, values in grouped_data.items():group_stats[group] = {'count': len(values),'average': sum(values) / len(values),'min': min(values),'max': max(values)}return group_statsdef main():"""主程序"""print("=== 数据分析工具 ===")analyzer = DataAnalyzer()# 创建示例数据sample_data = [{'姓名': '张三', '年龄': 25, '工资': 8000, '部门': '技术部', '城市': '北京'},{'姓名': '李四', '年龄': 30, '工资': 12000, '部门': '技术部', '城市': '上海'},{'姓名': '王五', '年龄': 28, '工资': 10000, '部门': '销售部', '城市': '广州'},{'姓名': '赵六', '年龄': 35, '工资': 15000, '部门': '管理部', '城市': '北京'}]# 保存示例数据到CSVwith open('sample_data.csv', 'w', newline='', encoding='utf-8') as f:fieldnames = ['姓名', '年龄', '工资', '部门', '城市']writer = csv.DictWriter(f, fieldnames=fieldnames)writer.writeheader()writer.writerows(sample_data)print("示例数据已保存到sample_data.csv")# 加载数据analyzer.load_from_csv('sample_data.csv')# 分析数值字段print("\n=== 年龄分析 ===")age_analysis = analyzer.analyze_numeric_field('年龄')if age_analysis:print(f"年龄统计: {age_analysis}")print("\n=== 工资分析 ===")salary_analysis = analyzer.analyze_numeric_field('工资')if salary_analysis:print(f"工资统计: {salary_analysis}")# 分析分类字段print("\n=== 部门分析 ===")dept_analysis = analyzer.analyze_categorical_field('部门')if dept_analysis:print(f"部门统计: {dept_analysis}")# 分组分析print("\n=== 按部门分组分析工资 ===")dept_salary = analyzer.group_by_field('部门', '工资')for dept, stats in dept_salary.items():print(f"{dept}: {stats}")if __name__ == "__main__":main()

7. 总结

本节课我们学习了:

  • collections模块的高级数据结构
  • itertools模块的迭代器工具
  • functools模块的函数工具
  • json、csv等数据处理模块
  • 编写了数据分析工具

8. 下节课预告

下节课我们将学习:

  • 第三方库的安装和使用
  • 项目实战练习
  • Python编程最佳实践

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

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

相关文章

⚡ Ranger 基础命令与功能详解

📌 1. Ranger简介 Ranger(游侠)是一款 Linux 专用的 指令式文件管理器,其操作风格类似 Vim,通过输入指令即可完成目录跳转、文件编辑、移动、复制等操作。 相比于 mc(Midnight Commander)&…

CUDA安装教程(包括cuDNN的教程)一个博客带你了解所有问题

前言 windows10 版本安装 CUDA ,首先需要下载两个安装包 CUDA toolkit(toolkit就是指工具包)cuDNN 注:cuDNN 是用于配置深度学习使用 官方教程 CUDA:Installation Guide Windows :: CUDA Toolkit Documentation …

ArkTS 语言全方位解析:鸿蒙生态开发新选择

在鸿蒙生态蓬勃发展的当下,一款高效、健壮的开发语言成为开发者的迫切需求。ArkTS 语言应运而生,作为鸿蒙生态的核心应用开发语言,它在 TypeScript(简称 TS)基础上进行创新扩展,为开发者打造高性能、易维护…

JavaScript性能优化实战:从瓶颈识别到极致体验

文章目录JavaScript性能优化实战:从瓶颈识别到极致体验1. 引言:为什么JavaScript性能至关重要1.1 性能对用户体验的影响1.2 JavaScript性能瓶颈的多样性2. JavaScript内存管理优化2.1 JavaScript内存模型详解2.2 垃圾回收机制与优化策略2.3 内存分析实战…

批量归一化:不将参数上传到中心服务器,那服务器怎么进行聚合?

联邦批量归一化(FedBN) 是一种联邦学习客户端本地模型优化算法。它的核心思想是:在联邦学习的客户端本地训练过程中,保留并独立更新批量归一化层(Batch Normalization, BN)的参数,而不将这些参数…

Qt中使用MySQL数据库

一、MySQL 入门 核心概念 在 QT 中操作数据库,主要使用两个模块: QSqlDatabase:代表一个数据库连接。 QSqlQuery:用于执行 SQL 语句(如 SELECT, INSERT, UPDATE, DELETE)并处理结果。 环境准备 在编写代码之前,你需要确保系统已具备以下条件: 1. 安装 MySQL 从 M…

Android - 统一资源标识符 Uri

一、概念URI(Uniform Resource Identifier)统一资源标识符,用于标识资源的字符串(如图片、网页、文件、应用等)。1.1 与 URL 的区别URL(统一资源定位符)是 URI(统一资源标识符&#…

开源 AR 眼镜怎么选?OpenGlass ,OSSG,cheApR 分析推荐

开源项目横评(看完你会知道自己属于哪一类) 1)OpenGlass:最低成本跑通“能用的AI眼镜” 卖点:用不到$25的通用元件,把任意普通眼镜改造成“可黑客化”的智能眼镜;能录制、识别、翻译、记人等。…

RAGFlow (一) 开发环境搭建

本文介绍如何在Windows上进行RAGFlow开发环境搭建 一. 环境准备 前提条件 CPU ≥ 4 核内存 ≥ 16 GB磁盘 ≥ 50 GBDocker ≥ 24.0.0 & Docker Compose ≥ v2.26.1 安装Docker Desktop为wsl安装Ubuntu 1.启用 WSL2​​(Windows Subsystem for Linux&#xff09…

k8sday13数据存储(1.5/2)

目录 二、高级核心存储 1、PV 1.1配置文件 ①、访问模式(accessModes) ②、回收策略(persistentVolumeReclaimPolicy) ③、存储类别 ④、状态(Status) 1.2创建测试 ①、准备NFS环境 ②、创建PV …

【力扣 Hot100】每日一题

D15 鲁迅曾说,尽量每天都让自己充实一点,你可以刷一个小时的短视频,打一个小时的王者荣耀,但尽量再留一个小时出来读一下书、教程、博客,让自己的大脑保持活跃,而不是垃圾场。如果真的没有事情做&#xff…

Sql server的行转列

业务场景:有如下一张表,希望汇总成下面的查询结果。 原始数据表 EmployeeTable:一个员工身兼多个岗位。 Employee Role Level 张三 工程师 3 张三 经理 5 李四 工程师 2 李四 主管…

某市-2025【网安·论道】决赛-misc1-翻转-wp

题目给了个图片以及一句提示 “斯蒂xx会帮助你” 直接就能想到 ste 开头的那几个工具,但是我比赛时候电脑什么ste开头的工具都没装,只能回来做了。 └─$ exiftool x.jpeg ExifTool Version Number : 13.00 File Name : …

[系统架构设计师]大数据架构设计理论与实践(十九)

[系统架构设计师]大数据架构设计理论与实践(十九) 一.传统数据处理系统的问题 1.传统数据库的数据过载问题 传统应用的数据系统架构设计时,应用直接访问数据库系统。当用户访问量增加时,数据库无 法支撑日益增长的用户请求的负载&…

UniAD

1. 算法动机及开创性思路 1)UniAD算法简介 算法全称:Planning-oriented Autonomous Driving核心特点: 统一框架整合感知、预测、规划模块CVPR 2023最佳论文采用查询(query)方式连接各模块 名称含义: Unified:统一多模块…

ESP-NOW详解(esp-idf)

esp-now目前主要支持单播和广播,广播地址为ff:ff:ff:ff:ff:ff,广播可以向范围内所有拥有esp-now接收的设备发送数据 注意事项,网络模式是可以设置网络mac地址的,在单播中,目标设备网络模式选择为ap时,mac地址会发生改…

`strlen` 字符串长度函数

1) 函数的概念与用途 strlen 是 C 语言标准库中最基础且使用最频繁的字符串处理函数之一,它的名字来源于"string length"(字符串长度)。这个函数的功能非常明确:计算一个以空字符结尾的字符串的长度。 可以将 strlen 想…

TorchInductor - Introduction

PyTorch 2.x通过TorchDynamo通过Python Bytecode的动态变换实现了图捕获功能,需要搭配一个Compiler Backend完成图编译。 Pytorch尝试集成了多个后端,并使用一个轻量级的autotuner来选择最优的后端图编译结果。这个解决方案存在2个问题: 这…

Adobe Illustrator默认键盘快捷键

目录 默认键盘快捷键 常用的快捷键 处理文档 选择工具 查看图稿 处理所选对象 绘制 编辑形状 处理实时上色组 处理对象 创建可变宽度点 处理文字 使用面板 动作面板 “画笔”面板 “字符”和“段落”面板 “颜色”面板 “渐变”面板 “图层”面板 “色板”…

「数据获取」《中国能源统计年鉴》(1986-2023)(获取方式看绑定的资源)

01、数据简介一、年鉴基本定位与发展历程《中国能源统计年鉴》作为一部权威性极强的能源领域资料典籍,始终以全面、精准反映中国能源建设推进、生产运行、消费态势以及供需平衡状况为核心使命。其编纂工作发轫于 1986 年,最初由国家统计局工业交通统计司…