改善Python程序的91个建议

改善Python程序的91个建议

1
2
3
4
5
def enumerate(seq, start=0):
    n = start
    for el in seq:
        yield n, el
        n += 1
1
2
while j < 10:
    ++j  # j的值不会变化,因此为死循环(i+=1)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
for i in range (2,10):
    for j in range(2,i):
        if i % j == 0:
            break
     else: # 循环正常结束和循环条件不成立时被执行(break中断时不执行)
         print(f'{i} is a prime num.')       


try:
    db.execute(sql)
excep DBError:    
    db.rollback()
else: # 无异常时执行
    db.commit()    

有新的异常,或者执行了return或者break,临时保存的异常将丢失。

1
2
3
4
5
6
7
8
try:
    raise IndexEror()
except NameError, e:
    print('Name error')
    break
finally:
    print('Finally')
    return        
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
[[填充符] 对齐方式][符号][#][0][宽度][,][.精确度][转换类型]
    |        |      |                      |       |______ c/s/r/d/u/o/x/e/f/g
    |        |      |                      |_____数字
    |        |      |_______ +/-/空格
    |        |______ </>/=/^
    |___ '{''}'之外的任意字符
'Num {0:,} hex is: {0:#x}, oct is {0:#o}, Num {+1:<20}}'.format(123, -123)
'Max is {max:0.3f}, min is {min:0.3f}'.format(max=100, min=12.5)

point = (1,3)
'X:{0[0]},Y:{0[1]}'.format(point)

class A(object):
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return 'Name={self.name}'.format(self=self)    
1
2
3
def func1(list=[]):
    list.append(1)
    return list

上面的函数每次调用后list都会添加1,影响下面使用。

1
2
3
a=datetime.today()
str(a)  # '2020-01-01'
repr(a) # 'datetime.date(2020, 1, 1)'
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class Fruit(object):
    def instance_method(self, x): # self为实例,隐式传入
        pass
    @staticmethod    
    def static_method(x):
        return Fruit(x)
    @classmethod    
    def class_method(cls, x):     # cls为类,隐式传入
        return cls(x)        
        
# 需要用classmethod的例子        
class Orange(Fruit):
    pass  # 继承的class_method中,如果换成static_method
          # 则返回的不是Orange实例,而是Fruit实例
1
2
3
from collections import Counter
a = ['a', 1, 'a', 0, 'b', 1]
Counter(a)   # Counter({'a': 2, 1: 2, 'b': 1, 0: 1})
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class People(object):
    def make_tea(self):
        self.get_teapot() # get_teapot() 未定义,留在子类中定义
# 但也可以使用mixin,先定义一些含get_teapot的类:
class UseSimpleTeapot(object):
    def get_teapot():
        pass
# 现在可以mixin,因为每个类都有个__bases__,是所有基类的元组
def simple_tea_people():
    people = People()
    people.__bases__ += (UseSimpleTeapot, )        

  __init__(self, *args, **kwagrs) # 主要用于实例的初始化

的情况下才会被调用。

1
2
3
4
  
__str__() / __repr__() / __int__() / __long__() / __float__() / __nonzero__() 

__cmp__() / __eq__() / __ne__() / __lt__()  / __gt__() 

所有运算符都可以有反运算符:方法前面加r,

1
2
3
4
__sub__() => __rsub__()
__len__() / __getitem__() / __setitem__() / __delitem__() / __reversed__() / __contains__() 
__call__() / __hash__() / __enter__() / __exit__() 
__getattr__() / __setattr__() / __delattr__()