哈喽,小伙伴们我是小甲鱼~ ?
今天要和大家聊聊一个非常重要的话题——Python代码优化。
不知道你有没有遇到过这种情况:写了一段代码,跑是能跑,但总感觉哪里不对劲——要么太长太啰嗦,要么慢得像乌龟爬,再要么就是自己都看不懂自己写了啥 ?
别慌今天小甲鱼就把自己压箱底的10个代码优化技巧全部拿出来,保证让你的代码从"又臭又长"变成"优雅又高效"
剧透一下:这些技巧都不难,小甲鱼保证初中生都能学会而且学会了之后,你写代码的效率至少提升一倍,不信往下看~
在正式开始之前,小甲鱼先和大家唠唠:为什么要优化代码。。
为什么要优化代码?
想象一下,你要去菜市场买菜:
烂代码就像用勺子挖井水——累死个人,效率还低 好代码就像用水管接水——轻轻一拧,水哗哗地来 代码优化主要有三个好处:
读起来更爽——好的代码像读小说,烂的代码像读天书 跑起来更快——优化过的代码,执行效率可能提升几十倍甚至几百倍 维护更轻松——以后想改点啥,不用抓耳挠腮猜自己当初在想啥 好,废话不多说,让我们开始学习这10个技巧吧?
1. 技巧一:列表推导式——一行代码搞定循环 原来的写法:如果你想创建一个1到10的平方列表,你可能会这样写
优化后的写法:
还能加条件!
小甲鱼说:列表推导式就是Python的魔法棒,轻轻一挥,循环+ append的组合就没了记住这个公式:[表达式 for 变量 in 可迭代对象 if 条件]。
2. 技巧二:enumerate和zip——循环的神仙伴侣 原来的写法:如果你想同时遍历列表的索引和值
优化后的写法:
zip:同时遍历两个列表
小甲鱼说:enumerate和zip就是Python给懒人准备的礼物再也不用手动管理索引了,省心又省力?
3. 技巧三:生成器——省内存的神器 原来的写法:如果你要处理一个超大的列表
优化后的写法:
一行生成器:
小甲鱼说:生成器就像自来水龙头,随用随取,不用提前把整个水库装满处理大数据时,这是保命的技能?
4. 技巧四:字典的安全访问——告别KeyError 原来的写法:
优化后的写法:
小甲鱼说:get()和setdefault()就是字典的安全气囊,关键时刻能救你的程序一命再也不用写一堆if key in dict的判断了?
5. 技巧五:f-string——最强大的字符串格式化 原来的写法:
优化后的写法:
f-string的高级用法:
小甲鱼说:f-string是Python 3.6引入的神器,简单程度直接秒杀其他所有格式化方式记住,变量名往大括号里一堆就能用,谁用谁知道?
6. 技巧六:集合操作——去重和快速查找 原来的写法:
优化后的写法:
集合的快速查找:
集合运算:
小甲鱼说:集合就是Python的超级英雄,去重、查找、集合运算,样样精通记住,如果你的代码需要频繁判断"在不在"列表里,赶紧换成set,速度提升不是一点半点?
7. 技巧七:装饰器——代码的复用神器 什么是装饰器?
装饰器可以在不修改原函数的情况下,给函数增加新功能就像给函数穿上一件外套。
实战应用:
装饰器的常见用途:
小甲鱼说:装饰器就是Python的瑞士军刀,一用一个准日志、权限检查、性能监控,统统一行代码搞定学会了这个,你就是同事眼中的大神?
8. 技巧八:with语句——资源管理的贴心管家 原来的写法:
优化后的写法:
with语句的原理:
小甲鱼说:with语句就是Python的贤内助,把资源管理得妥妥的文件、数据库、网络连接,用with就对了再也不用担心忘记close()了?
9. 技巧九:isinstance——更智能的类型检查 原来的写法:
优化后的写法:
isinstance的高级用法:
鸭子类型:
小甲鱼说:isinstance就是Python的智能雷达,不仅能检测类型,还能检测子类而且要学会"鸭子类型"思维——不要问它是什么,要问它能做什么?
10. 技巧十:异常处理——让代码更健壮 原来的写法:
优化后的写法:
多个异常处理:
try-except-else-finally:
异常处理实战:
小甲鱼说:异常处理就是Python的安全网,程序出错了不会直接崩溃,而是优雅地处理记住,用try-except而不是if-else来处理异常,这是Python的哲学?️
11. 实战应用 光说不练假把式小甲鱼这就带大家做一个实战项目,把今天学的技巧都用上。
项目:学生信息管理系统
复制 "" "
学生信息管理系统 v2. 0
用上我们今天学的所有技巧!
"" "
classStudent :
"" "学生类" ""
def__init__ ( self, name, age, score) :
self. name = name
self. age = age
self. score = score
def__repr__ ( self) :
returnf"Student(name='{self.name}', age={self.age}, score={self.score})"
classStudentManager :
"" "学生管理系统 - 优化版" ""
def__init__ ( self) :
# 使用字典存储学生,id为键
self. students = { }
self. next_id = 1
# 技巧七:装饰器 - 添加日志功能
deflog_operation ( func) :
"" "记录操作日志的装饰器" ""
defwrapper ( self, * args, ** kwargs) :
print ( f"n[操作] 开始执行: {func.__name__}" )
result = func ( self, * args, ** kwargs)
print ( f"[操作] 完成: {func.__name__}" )
return result
return wrapper
# 技巧一:列表推导式 - 快速添加学生
@log_operation
defadd_student ( self, name, age, score) :
"" "添加学生" ""
# 技巧四:字典安全访问 - 不需要
# 技巧五:f- string - 格式化输出
student_id = self. next_id
self. students[ student_id] = Student ( name, age, score)
self. next_id += 1
print ( f"✅ 添加成功: {name}, 学号: {student_id}" )
return student_id
@log_operation
defadd_multiple_students ( self, student_list) :
"" "批量添加学生 - 使用列表推导式" ""
# 列表推导式 + 生成器
student_ids = [
self. add_student ( name, age, score)
for name, age, score in student_list
]
print ( f"✅ 批量添加了 {len(student_ids)} 个学生" )
return student_ids
# 技巧二:enumerate - 遍历学生列表
deflist_students ( self) :
"" "列出所有学生" ""
ifnotself. students:
print ( "? 还没有学生记录" )
return
print ( "n? 学生列表:" )
print ( "-" * 50 )
# enumerate + f- string
for i, ( sid, student) inenumerate ( self. students. items ( ) , 1 ) :
print ( f"{i}. 学号:{sid} | 姓名:{student.name} | "
f"年龄:{student.age} | 分数:{student.score}" )
print ( "-" * 50 )
# 技巧三:生成器 - 遍历高分学生
defget_top_scorers ( self, threshold= 60 ) :
"" "获取高分学生 - 使用生成器" ""
# 生成器表达式
return (
( sid, student)
for sid, student inself. students. items ( )
if student. score >= threshold
)
defshow_top_scorers ( self, threshold= 60 ) :
"" "显示高分学生" ""
print ( f"n? 分数 >= {threshold} 的学生:" )
top_students = list ( self. get_top_scorers ( threshold) )
ifnot top_students:
print ( "没有找到高分学生" )
return
# 技巧二:zip - 同时展示排名
for rank, ( sid, student) inenumerate ( top_students, 1 ) :
print ( f" {rank}. {student.name} - {student.score}分" )
# 技巧六:集合操作 - 查找学生
defsearch_by_name ( self, name) :
"" "搜索学生 - 使用集合" ""
# 找到所有名字包含关键字的学生
results = {
sid : student
for sid, student inself. students. items ( )
if name in student. name
}
return results
# 技巧八:with 语句 - 安全的文件操作
defsave_to_file ( self, filename= "students.txt" ) :
"" "保存到文件" ""
try :
withopen ( filename, 'w' , encoding= 'utf-8' ) as f :
for sid, student inself. students. items ( ) :
# 技巧五:f- string 格式化
f. write ( f"{sid},{student.name},{student.age},{student.score}n" )
print ( f"? 已保存到 {filename}" )
except Exception as e :
print ( f"❌ 保存失败: {e}" )
defload_from_file ( self, filename= "students.txt" ) :
"" "从文件加载" ""
try :
withopen ( filename, 'r' , encoding= 'utf-8' ) as f :
# 读取并解析
for line in f :
line = line. strip ( )
ifnot line:
continue
parts = line. split ( ',' )
iflen ( parts) == 4 :
sid, name, age, score = parts
self. students[ int ( sid) ] = Student ( name, int ( age) , float ( score) )
self. next_id = max ( self. next_id, int ( sid) + 1 )
print ( f"? 已从 {filename} 加载" )
except FileNotFoundError:
print ( f"? 文件 {filename} 不存在" )
except Exception as e :
print ( f"❌ 加载失败: {e}" )
# 技巧十:异常处理 - 安全的删除操作
@log_operation
defdelete_student ( self, student_id) :
"" "删除学生" ""
try :
# 技巧九:isinstance 类型检查
ifnotisinstance ( student_id, int) :
student_id = int ( student_id)
# 技巧四:字典安全访问
student = self. students. get ( student_id)
if student isNone:
print ( f"❌ 学号 {student_id} 不存在" )
returnFalse
delself. students[ student_id]
print ( f"?️ 已删除学生: {student.name}" )
returnTrue
except ValueError:
print ( "❌ 学号必须是数字" )
returnFalse
except Exception as e :
print ( f"❌ 删除失败: {e}" )
returnFalse
# === === === === === === == 主程序 === === === === === === ==
defmain ( ) :
"" "主程序 - 演示所有功能" ""
print ( "=" * 50 )
print ( "? 学生信息管理系统 v2.0" )
print ( "=" * 50 )
# 创建管理器
manager = StudentManager ( )
# 1. 批量添加学生 - 用列表推导式
print ( "n【添加学生】" )
students_data = [
( "小明" , 18 , 85 ) ,
( "小红" , 19 , 92 ) ,
( "小刚" , 20 , 78 ) ,
( "小丽" , 18 , 95 ) ,
( "小强" , 19 , 88 ) ,
]
manager. add_multiple_students ( students_data)
# 2. 列出所有学生 - 用enumerate
print ( "n【查看学生】" )
manager. list_students ( )
# 3. 显示高分学生 - 用生成器
print ( "n【高分学生】" )
manager. show_top_scorers ( 85 )
# 4. 搜索学生 - 用字典推导式
print ( "n【搜索学生】" )
results = manager. search_by_name ( "小" )
print ( f"找到 {len(results)} 个包含'小'的学生:" )
for sid, s in results. items ( ) :
print ( f" - {s.name}" )
# 5. 删除学生 - 用异常处理
print ( "n【删除学生】" )
manager. delete_student ( 1 )
manager. list_students ( )
# 6. 保存和加载 - 用with 语句
print ( "n【文件操作】" )
manager. save_to_file ( )
manager. load_from_file ( )
print ( "n" + "=" * 50 )
print ( "? 程序结束!" )
print ( "=" * 50 )
if __name__ == "__main__" :
main ( ) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219.
运行结果:
代码亮点总结:看看我们用到了多少技巧
技巧
应用场景
列表推导式
批量添加学生、搜索学生
enumerate
列出学生列表
生成器
获取高分学生
字典get()
安全访问学生信息
f-string
所有字符串格式化
集合/字典推导式
搜索功能
装饰器
日志记录
with语句
文件读写
isinstance
类型检查
异常处理
删除、保存、加载操作
12. 常见错误 小甲鱼在这里罗列几个新手最容易犯的错误,看看你中招了没。
❌ 错误1:不要在循环里修改列表
❌ 错误2:不要用可变对象作为默认参数
❌ 错误3:不要滥用列表推导式
❌ 错误4:不要忘记关闭文件
❌ 错误5:不要用异常代替流程控制
13. 总结 好啦,今天小甲鱼带大家一起学习了10个Python代码优化技巧,让我们来回顾一下:
技巧
核心作用
难度
列表推导式
一行代码搞定循环
⭐
enumerate和zip
优雅遍历索引和值
⭐
生成器
省内存的神器
⭐⭐
字典安全访问
告别KeyError
⭐
f-string
最强字符串格式化
⭐
集合操作
去重和快速查找
⭐⭐
装饰器
代码复用神器
⭐⭐⭐
with语句
资源管理专家
⭐
isinstance
智能类型检查
⭐⭐
异常处理
让代码更健壮
⭐⭐
记住这三点:
代码首先是给人看的,其次才是给机器跑的——写代码要考虑到以后维护的人(包括你自己) 过早优化是万恶之源——先让代码跑起来,再考虑优化,不要为了优化而优化 实践出真知——光学不用假把式,一定要动手敲代码!