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


name = 'John'surname = 'Doe'full_name = '{name {surname'.format(name=name surname=surname)

3.读写文件时
若要使用Python读写文件 , 首先需要用内置的open函数打开文件 。 打开文件 , 读取或写入内容以及关闭文件 。 进行操作时 , 可能会出现一些问题 , 比如忘记关闭文件和异常处理失败 。
操作完成后 , 若忘记关闭文件会导致后续问题 。 比如 , 如果在写入文件后忘记关闭该文件 , 那么写入操作将不会保存至文件中 , 并且在文件仍然保持打开状态时 , 你将保留在计算机中分配的资源 。 如果在处理文件时 , 没有手动处理异常和错误 , 那么文件将保持打开的状态 。
f = open(file='file.txt' mode='r')lines = f.readlines()
...
f.close()

建议在打开文件时使用with关键字 。 with是一个上下文管理器 , 它能封装代码并能确保自动处理异常 。 比如 , 当你读写文件时 , with-body中可能出现的任何故障 , 都能自动处理异常 , 并且始终保持该文件关闭 。
with open('file.txt') as f:
   read_data = https://mparticle.uc.cn/api/f.read()
   ...

如果跳过with时 , 你需要自己处理一切 , 关闭文件和异常处理都得亲自处理 。 with会让你的生活更轻松 , 让情况得以控制 。
图源:unsplash
4.跳过生成器时
在许多情景中 , 你需要生成一个值列表 , 稍后将在脚本中使用这些值 。 比如 , 你需要为前100个数字生成所有3个数字的组合 。
combinations = [
value = https://mparticle.uc.cn/api/100for i in range(value):
   for j in range(value):
       for k in range(value):
           combinations.append((i jk))

当执行的命令完成时 , 列表组合将包含1M元组 , 每个元组有3个整型值 。 这些值将保存在内存中 , 直到被删除 。 使用sys模块中的getobjectsize函数检查对象大小 , 结果为8.29MB 。
不再使用列表存储值并将它们全部保存至内存 , 可以创建一个生成器 , 每当你使用它时 , 将生成1个组合 。 这能减少内存消耗并提高运行速度 。
defgenerate_combinations_of_three(value):    for i in range(value):        for j in range(value):            for k in range(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之禅(The Zen of Python)的准则 。 如果是使用Python的新手 , 可能会倾向于夸大Python之禅的某些观点 , 而在其他方面避重就轻 。
这一点在逐渐了解推导式时最容易注意到——你倾向于翻译推导式中的“每一个”循环 。 假设你有一个三维的数字矩阵 , 你很可能会想将其平面化 。
matrix = [[[ 1 2 3

          [ 4 5 6

          [ 7 8 9


         [[ 10 20 30

          [ 40 50 60

          [ 70 80 90




使用列表推导式 , 平面化过程如下: