关于python代码的91个建议

第一章:概括

  1。理解pythonic概念

  具有python特色的代码,一般python代码需要做到美胜丑,显胜隐,杂胜乱,平胜陡, 疏胜密。

  2。pythonic代码

  命名尽量按照大驼峰或小驼峰。

  避免使用容易引起混淆的名称。

  不要害怕过长的变量名。

   3。python与C语言的不同

  python省略了花括号,使用严格的代码缩进方式分隔代码块

  将‘’与“”的区别减小。

  简化三元操作符。

  取出switch--case采用if elif else代替。

  4。在代码中添加适当注释

  对于关键代码和逻辑,需要添加注释使得后来的开发者能快速读懂代码。

  处理不同的逻辑时,采用回车分隔

  5。通过适当添加空行使代码布局更加优雅合理

  (同上)

  6。编写函数的4个原则

  函数设计尽量短小。将同类功能封装到一个函数里。

  函数申明尽量合理,简单易于使用。

  实现版本向下兼容。

  一个函数只做一件事,保证函数语句粒度的一致性(同第一条)

  7。将常量集中到一个文件

  在对于一些具有关键意义的常量,可以集中到一个文件中,使用大写字母标记。

第二章:编程惯用法。

  8。利用assert断言语句来发现问题

  提前判断结果并抛出其他结果的错误。不推荐直接使用,可以通过类封装。

  9。数值交换时不推荐使用中间变量

  诸如一下操作

temp = a
a = b
b = temp
=========
a,b = b,a

  可以直接使用python特性语句处理

   10。充分利用lazy evaluation(惰性计算)

  当只有真正需要执行的时候,才计算表达式的值。如if判断条件时 当第一个or条件成立则不运行第二个or条件。and条件亦然。

   节省空间,使得无限循环的数据结构成为可能,在使用yieid时可以构建迭代器,当只有迭代器被调用时才会运行程序占用内存。

  11。理解枚举替代现实的缺陷

   在python中没有指定的枚举类型,但是可以借助类属性和函数来定义一个枚举类。

  12。不推荐使用type来进行类型检查

  python是一个弱类型语言,对于数据类型的要求并不是强制的,所以,而且有些类型可以进行隐式类型转换。

  建议只在出错的情况下通过抛出异常。

  可以使用isinstance来获取正确的python数据类型

  13。尽量转换为浮点类型后再做除法。

  python语言对于数字不是特别敏感,而且在设计之初,参考了c语言中的long类型作为python的整数类型,double作为浮点类型,

  而且计算的返回类型和操作数类型是相同的,由于c语言是事先申明类型,所以这一特性对于c来说没有太大的关系,而python会将返回结果直接转换成整数,导致结果有所偏差。

  14。警惕eval()的安全漏洞

  如同sql的注入攻击,eval在获取python语句运行时也是傻瓜型运行,即获取语句直接运行,如果使用者在语句中写入比较危险的python语句,

  则对系统的损害是很大的。

   15。使用enumerate()获取序列迭代的索引和值

  对于这种既需要使用元素值,又需要使用索引值的需求,有很多种实现方法。

  方法一:在每次循环中对索引变量进行自增。

l1 = ["a", "b", "c"]
index = 0
for i in li:
    print("index:", index, "element:", i)

  方法二:使用range()和len()方法结合

li 1 = ["a", "b", "c"]
for i in range(len(li1)):
    print(i, li[i])

  方法三:使用while循环,用len()获取循环次数

li 1 = ["a", "b", "c"]
index = 0
while index< len(li):
    print(index, li[index])
    index +=1

  方法四:使用zip()

li 1 = ["a", "b", "c"]
for i, e in zip(rage(len(li1)), li1):
    print(i, e)

  方法五:使用emumerate() ,这种方法是最优方法。

li 1 = ["a", "b", "c"]
for i, e in enumerate(li1):
    print(i, e)

  16。分清== 与is的使用场景

  简单来说,is是比较对象的存储地址,==则是比较值。

  17。考虑兼容性,尽可能使用Unicode。

  18。构建合理的包层次来管理module

  python中所有py文件都是一个包,python语言不像强类型语言一样,有专门功能的模板,所以对于模块的定义需要开发者自行约束。

  在每个包文件中都有一个__init__,当他被第一次调用的是后,就会运行,充分利用init来实现包的初始化。

第三章:基础语法

  19。有节制地使用from---import 语句

  一般情况下使用import  A的形式

  有节制地使用from---import 语句

  尽量不要使用from A import *的模式。因为这样会污染命名空间,并且无法清晰地表示导入了那些对象

  防止循环导包 的情况发生,即A模块导入了B模块,B模块又导入了A模块。当遇到此种问题是时,可以在调用该模块的函数里调用模块,防止循环调用

  20。优先使用absolute import来导入模块

  21。i+=1不等于 ++i

  i+=1代表i的自增,而++i仅仅表示i的正数的正数,也就是i本身。

  22。使用with自动关闭资源

  在py2的版本中我们会使用文件句柄的方式来打开一个文件,但是这种方式很容易忘记关闭连接句柄,造成文件写入错误。

  

 

posted on 2021-04-14 16:04  一只萌萌哒的提莫  阅读(101)  评论(0编辑  收藏  举报