不要使用索引来循环序列
Don't :
for i in range(len(tab)) :
print tab[i]
Do :
for elem in tab :
print elem
For将为您自动化大多数迭代操作。
Use enumerate http://docs.python.org/library/functions.html#enumerate如果您确实需要索引和元素。
for i, elem in enumerate(tab):
print i, elem
使用“==”进行检查时要小心True or False
if (var == True) :
# this will execute if var is True or 1, 1.0, 1L
if (var != True) :
# this will execute if var is neither True nor 1
if (var == False) :
# this will execute if var is False or 0 (or 0.0, 0L, 0j)
if (var == None) :
# only execute if var is None
if var :
# execute if var is a non-empty string/list/dictionary/tuple, non-0, etc
if not var :
# execute if var is "", {}, [], (), 0, None, etc.
if var is True :
# only execute if var is boolean True, not 1
if var is False :
# only execute if var is boolean False, not 0
if var is None :
# same as var == None
不要检查是否可以,只要执行并处理错误
Python 爱好者通常会说“请求宽恕比请求许可更容易”。
Don't :
if os.path.isfile(file_path) :
file = open(file_path)
else :
# do something
Do :
try :
file = open(file_path)
except OSError as e:
# do something
或者使用 python 2.6+ / 3 甚至更好:
with open(file_path) as file :
它要好得多,因为它更通用。您几乎可以将“尝试/例外”应用于任何事情。您不需要关心如何防止它发生,只需要关心您所面临的错误风险。
不检查类型
Python 是动态类型的,因此检查类型会让你失去灵活性。相反,通过检查行为来使用鸭子类型。例如,您期望函数中有一个字符串,然后使用 str() 转换字符串中的任何对象。如果您需要一个列表,请使用 list() 转换列表中的任何可迭代对象。
Don't :
def foo(name) :
if isinstance(name, str) :
print name.lower()
def bar(listing) :
if isinstance(listing, list) :
listing.extend((1, 2, 3))
return ", ".join(listing)
Do :
def foo(name) :
print str(name).lower()
def bar(listing) :
l = list(listing)
l.extend((1, 2, 3))
return ", ".join(l)
使用最后一种方式, foo 将接受任何对象。 Bar 将接受字符串、元组、集合、列表等等。便宜的干:-)
不要混合使用空格和制表符
只是不要。你会哭的。
Use object作为第一父母
这很棘手,但随着程序的增长,它会困扰你。 Python 2.x 中有新旧类。旧的,嗯,旧的。它们缺乏一些功能,并且在继承方面可能会出现尴尬的行为。为了可用,你的任何班级都必须是“新风格”。为此,请使其继承自“object”:
Don't :
class Father :
pass
class Child(Father) :
pass
Do :
class Father(object) :
pass
class Child(Father) :
pass
在 Python 3.x 中,所有类都是新样式,因此您可以声明class Father:
很好。
不要在外部初始化类属性__init__
method
来自其他语言的人会发现它很有吸引力,因为你可以用 Java 或 PHP 来完成这项工作。您编写类名,然后列出您的属性并为其指定默认值。它似乎在Python中工作,但是,这并不像你想象的那样工作。
这样做将设置类属性(静态属性),然后当您尝试获取对象属性时,它将为您提供其值,除非它为空。在这种情况下,它将返回类属性。
这意味着两大危险:
- 如果类属性更改,则初始值也会更改。
- 如果将可变对象设置为默认值,您将获得跨实例共享的同一对象。
不要(除非你想要静态):
class Car(object):
color = "red"
wheels = [wheel(), Wheel(), Wheel(), Wheel()]
Do :
class Car(object):
def __init__(self):
self.color = "red"
self.wheels = [wheel(), Wheel(), Wheel(), Wheel()]