news 2026/4/24 10:23:44

Python学习7 之 【open、enumerate、zip、生成器】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python学习7 之 【open、enumerate、zip、生成器】

目录

1.open

参数总览

mode 参数

encoding 编码参数

errors 错误处理参数

2.enumerate

参数

返回值

应用

3.zip

语法参数

特点

4.生成器

生成器的两种创建方式

生成器的核心方法

细节


1.open

  • 参数总览

参数类型默认值说明示例
filestr必需文件路径(绝对/相对路径)'data.txt''./folder/file.csv'
modestr'r'文件打开模式'r''w''a''rb''w+'
encodingstrNone(平台依赖)文本编码方式'utf-8''gbk''ascii'
errorsstr'strict'编码错误处理方式'ignore''replace''strict'
newlinestrNone换行符处理'\n''\r\n'''
bufferingint-1缓冲策略1(行缓冲)、0(无缓冲)
closefdboolTrue是否关闭文件描述符TrueFalseopen() 函数核心参数
  • mode 参数

mode读写文件存在文件不存在指针位置典型用途
'r'只读打开报错FileNotFoundError开头读取文本文件
'w'只写清空内容创建新文件开头写入/覆盖文件
'a'只写保留内容创建新文件末尾追加内容
'x'只写报错FileExistsError创建新文件开头安全创建新文件
'r+'读写打开报错开头读取并修改
'w+'读写清空内容创建新文件开头读写(会清空)
'a+'读写保留内容创建新文件末尾读取+追加
'rb'只读(二进制)打开报错开头图片、音频等
'wb'只写(二进制)清空内容创建新文件开头写入二进制数据
'ab'追加(二进制)保留内容创建新文件末尾追加二进制数据
  • encoding 编码参数

编码说明适用场景
'utf-8'国际通用编码最推荐,跨平台,支持所有语言
'gbk'简体中文扩展Windows中文环境遗留文件
'gb2312'简体中文(旧)老旧Windows系统文件
'ascii'英文字符纯英文文件(中文会报错)
'utf-8-sig'带BOM的UTF-8处理Excel导出的UTF-8文件
  • errors 错误处理参数

行为示例效果
'strict'遇到错误立即报错默认,最严格
'ignore'忽略错误字符'你好\x80世界''你好世界'
'replace'替换错误字符'你好\x80世界''你好�世界'
'backslashreplace'用转义序列替换'\x80''\\x80'
  • 示例
使用场景代码说明
读UTF-8文本open('file.txt', 'r', encoding='utf-8')最常用
写UTF-8文本open('file.txt', 'w', encoding='utf-8')覆盖写入
追加文本open('file.txt', 'a', encoding='utf-8')保留原内容
读二进制open('image.jpg', 'rb')图片/视频
写二进制open('output.jpg', 'wb')下载文件
读写模式open('file.txt', 'r+', encoding='utf-8')需手动控制指针
安全创建open('new.txt', 'x', encoding='utf-8')防止覆盖
忽略编码错误open('bad.txt', 'r', encoding='utf-8', errors='ignore')容忍乱码
# 最常用的3种写法 with open('file.txt', 'r', encoding='utf-8') as f: # 读 data = f.read() with open('file.txt', 'w', encoding='utf-8') as f: # 写 f.write('Hello') with open('file.txt', 'a', encoding='utf-8') as f: # 追加 f.write('New line')

2.enumerate

核心作用:在迭代可迭代对象时,自动生成索引,避免手动维护计数器

# 没有 enumerate(原始方式) fruits = ['apple', 'banana', 'orange'] index = 0 for fruit in fruits: print(index, fruit) index += 1 # 输出:0 apple, 1 banana, 2 orange # 使用 enumerate(优雅方式) for index, fruit in enumerate(fruits): print(index, fruit) # 输出完全相同,但代码更简洁
  • 参数

参数类型默认值说明示例
iterable可迭代对象必需任何支持迭代的对象列表、元组、字符串、字典等
startint0起始索引值110-5
# start 参数示例 colors = ['red', 'green', 'blue'] # 从0开始(默认) for i, color in enumerate(colors): print(i, color) # 0 red, 1 green, 2 blue # 从1开始(人类友好) for i, color in enumerate(colors, start=1): print(i, color) # 1 red, 2 green, 3 blue # 从10开始 for i, color in enumerate(colors, 10): print(i, color) # 10 red, 11 green, 12 blue
  • 返回值

enumerate() 返回一个枚举对象(迭代器),每次产生一个元组 (索引, 值)

# 查看 enumerate 对象 fruits = ['apple', 'banana', 'orange'] e = enumerate(fruits) print(e) # <enumerate object at 0x...> print(type(e)) # <class 'enumerate'> print(list(e)) # [(0, 'apple'), (1, 'banana'), (2, 'orange')] # 枚举对象只能迭代一次(迭代器特性) e = enumerate(fruits) print(list(e)) # [(0, 'apple'), (1, 'banana'), (2, 'orange')] print(list(e)) # [] 第二次为空! # 手动获取下一个值 e = enumerate(fruits) print(next(e)) # (0, 'apple') print(next(e)) # (1, 'banana')
  • 应用

数据类型示例输出注意点
列表enumerate([a,b,c])(0,a), (1,b), (2,c)最常用
元组enumerate((a,b,c))(0,a), (1,b), (2,c)同列表
字符串enumerate("abc")(0,'a'), (1,'b'), (2,'c')字符索引
字典enumerate(dict)(0,key1), (1,key2)只迭代键
集合enumerate(set)(0,item1)...顺序不确定
文件对象enumerate(file)(0,line1), (1,line2)逐行索引
  • 总是用 enumerate 而不是 range(len()) 或手动计数器
  • 记住 start 参数可以改变起始索引(通常设为1)
  • enumerate 返回迭代器,只能使用一次
  • 配合列表推导式可以优雅地创建索引映射
  • 遍历字典时用 enumerate(dict.items()) 获取索引、键、值
# 推荐:使用 enumerate 替代 range(len()) for i, item in enumerate(collection): process(i, item) # 推荐:从1开始计数(人类友好) for line_num, line in enumerate(file, 1): print(f"第{line_num}行: {line}") # 推荐:创建索引映射 index_map = {item: i for i, item in enumerate(unique_items)} # 推荐:同时需要索引和修改元素 for i, value in enumerate(lst): lst[i] = transform(value) # 避免:手动维护计数器 i = 0 for item in collection: process(i, item) i += 1 # 避免:使用 range(len()) 然后下标访问 for i in range(len(collection)): process(i, collection[i]) # 避免:在迭代时修改列表长度 for i, item in enumerate(lst): if condition: lst.pop(i) # 危险!

3.zip

核心作用:将多个可迭代对象"拉链式"地打包成元组序列,并行聚合数据

# zip 的直观理解 names = ['Alice', 'Bob', 'Charlie'] scores = [85, 92, 78] # zip 像拉链一样将对应位置元素结合 zipped = zip(names, scores) print(list(zipped)) # [('Alice', 85), ('Bob', 92), ('Charlie', 78)]

语法参数

参数类型说明示例
*iterables可迭代对象一个或多个可迭代对象zip([1,2], [3,4])
返回值zip对象迭代器,产生元组<zip object at 0x...>
# 不同参数数量 # 1个参数(很少用) result = zip([1, 2, 3]) print(list(result)) # [(1,), (2,), (3,)] # 2个参数(最常用) result = zip([1, 2], ['a', 'b']) print(list(result)) # [(1, 'a'), (2, 'b')] # 3个及以上参数 result = zip([1, 2], ['a', 'b'], [True, False]) print(list(result)) # [(1, 'a', True), (2, 'b', False)] # 0个参数 result = zip() print(list(result)) # []

特点

  • 惰性求值(返回迭代器)
# zip 返回迭代器,不是列表 data = zip([1, 2, 3], ['a', 'b', 'c']) print(data) # <zip object at 0x...> # 只能迭代一次 print(list(data)) # [(1, 'a'), (2, 'b'), (3, 'c')] print(list(data)) # [] 已经耗尽! # 重新创建才能再次使用 data = zip([1, 2, 3], ['a', 'b', 'c']) # 重新创建
  • 以最短的序列为准

# 不等长时,以最短的为准(不会报错) a = [1, 2, 3, 4, 5] b = ['a', 'b', 'c'] c = ['X', 'Y'] result = zip(a, b, c) print(list(result)) # [(1, 'a', 'X'), (2, 'b', 'Y')] # 3,4,5 和 c 都被忽略 # 如果需要以最长的为准,使用 zip_longest from itertools import zip_longest result = zip_longest(a, b, c, fillvalue='NA') print(list(result)) # [(1, 'a', 'X'), (2, 'b', 'Y'), (3, 'c', 'NA'), (4, 'NA', 'NA'), (5, 'NA', 'NA')]

4.生成器

生成器是一种特殊的迭代器,它允许你惰性地(按需)生成值,而不是一次性在内存中创建所有值

# 普通列表:一次性创建所有元素 numbers_list = [i for i in range(1000000)] # 立即占用大量内存 # 生成器:按需产生元素 numbers_gen = (i for i in range(1000000)) # 几乎不占用内存

生成器的两种创建方式

方式语法特点适用场景
生成器表达式(表达式 for 变量 in 可迭代对象)简洁、一行代码简单转换
生成器函数def func(): yield 值复杂逻辑、可暂停复杂流程控制
  • 生成器表达式
# 基本语法 gen = (x**2 for x in range(10)) print(gen) # <generator object <genexpr> at 0x...> # 使用 for value in gen: print(value, end=' ') # 0 1 4 9 16 25 36 49 64 81 # 与列表推导式对比 list_comp = [x**2 for x in range(10)] # 立即创建列表 gen_exp = (x**2 for x in range(10)) # 创建生成器对象 print(list_comp) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] print(gen_exp) # <generator object <genexpr> at 0x...> # 带条件的生成器表达式 even_squares = (x**2 for x in range(20) if x % 2 == 0) print(list(even_squares)) # [0, 4, 16, 36, 64, 100, 144, 196, 256, 324]
  • 生成器函数(yield 关键字)
# 基础生成器函数 def count_up_to(n): """生成从0到n-1的数字""" i = 0 while i < n: yield i # 暂停并返回当前值 i += 1 # 使用生成器 counter = count_up_to(5) print(next(counter)) # 0 print(next(counter)) # 1 print(next(counter)) # 2 print(next(counter)) # 3 print(next(counter)) # 4 # print(next(counter)) # StopIteration # for 循环自动处理 StopIteration for num in count_up_to(5): print(num, end=' ') # 0 1 2 3 4

生成器的核心方法

方法作用说明
next(g)获取下一个值从当前yield继续执行
g.send(value)发送值给生成器yield 表达式会返回发送的值
g.throw(type)向生成器抛出异常在yield位置抛出异常
g.close()关闭生成器引发 GeneratorExit 异常

细节

  • map/zip/enumerate 返回的是"一次性迭代器"和生成器一样只能使用一次,遍历后即销毁
  • 直接打印只会显示对象的类型和内存地址,而不是内容
  • 必须通过 list()、tuple()、set() 或循环等方式"消费"它才能获取数据,且消费一次后就会耗尽
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/24 10:23:39

抖音批量下载终极实战:从零构建自动化内容采集系统

抖音批量下载终极实战&#xff1a;从零构建自动化内容采集系统 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support.…

作者头像 李华
网站建设 2026/4/24 10:23:22

哈尔滨工业大学(深圳)-王紫璇团队-低碳能源/氨/氢

哈尔滨工业大学(深圳)-王紫璇团队-低碳能源/氨/氢 团队介绍 【课题组简介】 王紫璇,哈尔滨工业大学(深圳)智能海洋工程研究院助理研究员,深圳市“鹏城孔雀”高层次人才,长期从事低碳能源系统、燃料催化制氢、氨/氢发电与供热等领域。所在团队拥有多名国家级人才、国家…

作者头像 李华
网站建设 2026/4/24 10:20:54

Obsidian PDF++:用链接式标注打造你的终极PDF知识管理方案

Obsidian PDF&#xff1a;用链接式标注打造你的终极PDF知识管理方案 【免费下载链接】obsidian-pdf-plus PDF: the most Obsidian-native PDF annotation & viewing tool ever. Comes with optional Vim keybindings. 项目地址: https://gitcode.com/gh_mirrors/ob/obsid…

作者头像 李华
网站建设 2026/4/24 10:19:12

深入ELF:除了strip,还有哪些方法可以保护你的Linux动态库代码?

深入ELF&#xff1a;动态库代码保护的进阶实践指南 在商业软件开发领域&#xff0c;动态库&#xff08;.so文件&#xff09;作为核心资产的分发载体&#xff0c;其安全性直接关系到企业的知识产权保护。许多开发者习惯性地使用strip命令来清理符号表&#xff0c;但这仅仅是代码…

作者头像 李华
网站建设 2026/4/24 10:17:41

深度剖析DLSS Swapper:解锁NVIDIA超采样技术潜能的专业管理方案

深度剖析DLSS Swapper&#xff1a;解锁NVIDIA超采样技术潜能的专业管理方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 在当今游戏图形技术快速发展的时代&#xff0c;NVIDIA DLSS&#xff08;深度学习超采样&…

作者头像 李华