Python开发手册

语法规范

 

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、命名

一张表

TypePublicInternal
Moduleslower_with_under_lower_with_under
Packageslower_with_under 
ClassesCapWords_CapWords
ExceptionsCapWords 
Functionslower_with_under()_lower_with_under()
Global/Class ConstantsCAPS_WITH_UNDER_CAPS_WITH_UNDER
Global/Class Variableslower_with_under_lower_with_under
Instance Variableslower_with_under_lower_with_under (protected) or __lower_with_under (private)
Method Nameslower_with_under()_lower_with_under() (protected) or __lower_with_under() (private)
Function/Method Parameterslower_with_under 
Local Variableslower_with_under 

 

如果本篇文章对你有帮助,可否在文章右侧点个赞再走呢~~

 

本文为原创,转载请注明出处

 

python 如何避免大量的if else​​​​​​​

python魔法方法(部分)

python避坑篇

python complex函数

python complex函数

python内置函数(下)

python内置属性,函数

python异常处理

python lambda函数

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值