津爱改装车|你在滥用Python吗?初学者常会遇到的5个情景( 二 )


操作完成后 , 若忘记关闭文件会导致后续问题 。 比如 , 如果在写入文件后忘记关闭该文件 , 那么写入操作将不会保存至文件中 , 并且在文件仍然保持打开状态时 , 你将保留在计算机中分配的资源 。 如果在处理文件时 , 没有手动处理异常和错误 , 那么文件将保持打开的状态 。
f=open(file='file.txt',mode='r')lines=f.readlines()...f.close()建议在打开文件时使用with关键字 。 with是一个上下文管理器 , 它能封装代码并能确保自动处理异常 。 比如 , 当你读写文件时 , with-body中可能出现的任何故障 , 都能自动处理异常 , 并且始终保持该文件关闭 。
withopen('file.txt')asf:read_data=https://pcff.toutiao.jxnews.com.cn/p/20200727/f.read()...如果跳过with时 , 你需要自己处理一切 , 关闭文件和异常处理都得亲自处理 。 with会让你的生活更轻松 , 让情况得以控制 。
4.跳过生成器时
在许多情景中 , 你需要生成一个值列表 , 稍后将在脚本中使用这些值 。 比如 , 你需要为前100个数字生成所有3个数字的组合 。
combinations=[]value=https://pcff.toutiao.jxnews.com.cn/p/20200727/100foriinrange(value):forjinrange(value):forkinrange(value):combinations.append((i,j,k))当执行的命令完成时 , 列表组合将包含1M元组 , 每个元组有3个整型值 。 这些值将保存在内存中 , 直到被删除 。 使用sys模块中的getobjectsize函数检查对象大小 , 结果为8.29MB 。
不再使用列表存储值并将它们全部保存至内存 , 可以创建一个生成器 , 每当你使用它时 , 将生成1个组合 。 这能减少内存消耗并提高运行速度 。
defgenerate_combinations_of_three(value):foriinrange(value):forjinrange(value):forkinrange(value):yield(i,j,k)gen=generate_combinations_of_three(100)next(gen)#yields(0,0,0)next(gen)#yileds(0,0,1)...所以 , 尽可能多地使用生成器 。 时刻牢记内存容量是有限的 , 并尽可能优化内存使用 。 请使用生成器 , 特别是在开发可伸缩的解决方案时 。
5.使用推导式时
有一些程序员 , 他任何用Python编写代码都遵循Python之禅(TheZenofPython)的准则 。 如果是使用Python的新手 , 可能会倾向于夸大Python之禅的某些观点 , 而在其他方面避重就轻 。
这一点在逐渐了解推导式时最容易注意到——你倾向于翻译推导式中的“每一个”循环 。 假设你有一个三维的数字矩阵 , 你很可能会想将其平面化 。
matrix=[[[1,2,3],[4,5,6],[7,8,9]],[[10,20,30],[40,50,60],[70,80,90]]]使用列表推导式 , 平面化过程如下:
flatten_list=[xforsub_matrixinmatrixforrowinsub_matrixforxinrow]使用循环 , 平面化过程如下:
flatten_list=[]forsub_matrixinmatrix:forrowinsub_matrix:forxinrow:flatten_list.append(x)列表式很酷 , 但可读的代码更酷 。 不要试图总是让自己使用列表式 , 即使这样做可能需要编写更少的代码 , 也不会损失代码的可读性 。
不论是否有编程经验 , 每当尝试使用一种新的编程语言时 , 请一定要抽出时间阅读最佳实践 。 每种编程语言都有其独特之处 , 所以要确保在适当的场景合理地运用它们 。
Python致力于帮助程序员更高效便捷地完成工作 , 我们不能忽视可能对代码生命期产生负面影响的小决策 。 请尽可能寻找更好的和最佳的解决方案 , 这是程序员的工作使命 。


推荐阅读