语法规范
1、避免在循环中使用len()
可以先在循环之外求出length再使用,(len函数的内部也会进行遍历)
2、使用is 或 is not,而不使用 == 和 !=。== 、!=只建议用在确定两边都是整形的情况下使用
a、再比如:使用 if foo: 而不是 if foo != []:
foo = []
if foo:
print("true")
else:
print("false") # false
b、永远不要用==将一个布尔量与false相比较. 使用 if not x: 代替. 如果你需要区分false和None, 你应该用像 if not x and x is not None:
a = 0
print(a == False) # 返回True,但a是int类型,不是bool
print(a is False) # False
c、对于序列(字符串, 列表, 元组), 要注意空序列是false. 因此 if not seq: 或者 if seq:(参考a)
d、处理整数时, 使用隐式false可能会得不偿失(即不小心将None当做0来处理). 你可以将一个已知是整型(且不是len()的返回结果)的值与0比较.
e、注意‘0’(字符串)会被当做true.(划重点)。数字0是false
if '0':
print('true') # true
else:
print('flase')
f、不应该通过判断长度检测是否为空,应采用 if not xxx:
3、使用for循环、推导式代替filter(),map(),reduce()
这个原因在我之前的文章有介绍,可以查找关键字‘’推导式‘’ 直达。
4、装饰器
确定使用装饰器后要注意:必须避免自身对外界的依赖(即不要依赖于文件, socket, 数据库连接等), 因为装饰器运行时这些资源可能不可用(由 pydoc 或其它工具导入). 应该保证一个用有效参数调用的装饰器在所有情况下都是成功的.
装饰器是一种特殊形式的”顶级代码”(可以理解为总是先于被装饰函数执行)
5、线程
优先使用Queue模块的 Queue 数据类型作为线程间的数据通信方式
风格规范
1、不要使用反斜杠连接行。Python会将 圆括号, 中括号和花括号中的行隐式的连接起来 , 你可以利用这个特点. 如果需要, 你可以在表达式外围增加一对额外的圆括号.
示例:
if (width == 0 and height == 0 and
color == 'red' and emphasis == 'strong'):
2、不要使用空格来垂直对齐多行间的标记, 因为这会成为维护的负担(适用于:, #, =等):
示例:
Yes:
foo = 1000 # comment
long_name = 2 # comment that should not be aligned
dictionary = {
"foo": 1,
"long_name": 2,
}
No:
foo = 1000 # comment
long_name = 2 # comment that should not be aligned
dictionary = {
"foo" : 1,
"long_name": 2,
}
3、如果一个类不继承自其它类, 就显式的从object继承. 嵌套类也一样,不要直接类名后+冒号
示例:
Yes: class SampleClass(object):
pass
class OuterClass(object):
class InnerClass(object):
pass
No: class SampleClass:
pass
class OuterClass:
class InnerClass:
pass
继承自 object
是为了使属性(properties)正常工作, 并且这样可以保护你的代码, 使其不受 PEP-3000的一个特殊的潜在不兼容性影响. 这样做也定义了一些特殊的方法, 这些方法实现了对象的默认语义, 包括 __new__, __init__, __delattr__, __getattribute__, __setattr__, __hash__, __repr__, and __str__
(绝大多数情况下是可以只写类名的。如果只是demo,可以简写)
4、避免在循环中用+和+=操作符来累加字符串.
字符串是不可变的, 这样做会创建不必要的临时对象, 并且导致二次方而不是线性的运行时间. 作为替代方案, 你可以将每个子串加入列表, 然后在循环结束后用 .join
连接列表. (也可以将每个子串写入一个 cStringIO.StringIO
缓存中.)
示例:
Yes: items = ['<table>']
for last_name, first_name in employee_list:
items.append('<tr><td>%s, %s</td></tr>' % (last_name, first_name))
items.append('</table>')
employee_table = ''.join(items)
No: employee_table = '<table>'
for last_name, first_name in employee_list:
employee_table += '<tr><td>%s, %s</td></tr>' % (last_name, first_name)
employee_table += '</table>'
5、多行字符串使用三重双引号”“”而非三重单引号’‘’
用隐式行连接更清晰, 因为多行字符串与程序其他部分的缩进方式不一致.
示例:
Yes:
print ("This is much nicer.\n"
"Do it this way.\n")
No:
print """This is pretty ugly.
Don't do this.
"""
6、关闭文件与socket
除文件外, sockets或其他类似文件的对象在没有必要的情况下打开, 会有许多副作用, 例如:
- 它们可能会消耗有限的系统资源, 如文件描述符. 如果这些资源在使用后没有及时归还系统, 那么用于处理这些对象的代码会将资源消耗殆尽.
- 持有文件将会阻止对于文件的其他诸如移动、删除之类的操作.
- 仅仅是从逻辑上关闭文件和sockets, 那么它们仍然可能会被其共享的程序在无意中进行读或者写操作. 只有当它们真正被关闭后, 对于它们尝试进行读或者写操作将会抛出异常, 并使得问题快速显现出来.
而且, 幻想当文件对象析构时, 文件和sockets会自动关闭, 试图将文件对象的生命周期和文件的状态绑定在一起的想法, 都是不现实的. 因为有如下原因:
- 没有任何方法可以确保运行环境会真正的执行文件的析构. 不同的Python实现采用不同的内存管理技术, 比如延时垃圾处理机制. 延时垃圾处理机制可能会导致对象生命周期被任意无限制的延长.
- 对于文件意外的引用,会导致对于文件的持有时间超出预期(比如对于异常的跟踪, 包含有全局变量等).
在文件与socket结束时,要显示关闭它们。推荐使用with进行管理
示例:
with open("hello.txt") as hello_file:
for line in hello_file:
print line
对于不支持使用”with”语句的类似文件的对象,使用 contextlib.closing():
示例:
import contextlib
with contextlib.closing(urllib.urlopen("http://www.python.org/")) as front_page:
for line in front_page:
print line
7、导入
每个导入应独占一行
Yes: import os
import sys
No: import os, sys
导入总应该放在文件顶部, 位于模块注释和文档字符串之后, 模块全局变量和常量之前. 导入应该按照从最通用到最不通用的顺序分组:
- 标准库导入
- 第三方库导入
- 应用程序指定导入
每种分组中, 应该根据每个模块的完整包路径按字典序排序, 忽略大小写.
import foo
from foo import bar
from foo.bar import baz
from foo.bar import Quux
from Foob import ar
8、命名
一张表
Type | Public | Internal |
---|---|---|
Modules | lower_with_under | _lower_with_under |
Packages | lower_with_under | |
Classes | CapWords | _CapWords |
Exceptions | CapWords | |
Functions | lower_with_under() | _lower_with_under() |
Global/Class Constants | CAPS_WITH_UNDER | _CAPS_WITH_UNDER |
Global/Class Variables | lower_with_under | _lower_with_under |
Instance Variables | lower_with_under | _lower_with_under (protected) or __lower_with_under (private) |
Method Names | lower_with_under() | _lower_with_under() (protected) or __lower_with_under() (private) |
Function/Method Parameters | lower_with_under | |
Local Variables | lower_with_under |
如果本篇文章对你有帮助,可否在文章右侧点个赞再走呢~~
本文为原创,转载请注明出处
python 如何避免大量的if else