写好Python之If语句
写好Python之If语句
避免将分支代码放在冒后后相同行使用缩进来区分作用域(和你在Python其他地方一样)更容易判断条件所要执行的部分。if, elif, 和else里语句应该总是在新行。不应该将代码跟在:后。
糟糕的
name = 'Aidan'
address = 'GuangDong, ShenZhen'
if name: print(name)
print(address
推荐的
name = 'Aidan'
address = 'GuangDong, ShenZhen'
if name:
print(name)
print(address
避免在If语言中重复出现变量
当你想检查变量是否为一系列值时,重复检查该值是不必的冗长。使用iterable(迭代)让代码更简单,并具有可读性
糟糕的
is_generic_name = False
name = 'Tom'
if name == 'Tom' or name == 'Dick' or name == 'Harry':
is_generic_name = True
推荐的
name = 'Tom'
is_generic_name = name in ('Tom', 'Dick', 'Harry')
避免直接True, False, 或None进行比较
对于任何对象,内建还是用户定义,都具有相关的布尔特性,当检查一个条件是否为真时,如果不是在语句中严格判断其对象布尔特性,判断规则有点让人奇怪。以下将被视为False:
None
False
数值0
空序列
空字典
对象方法_len或_nonzore返回值为0或者False
除了这些其他都会视为True(或隐示为True)。最后的条件是通过检查对象的len或nonzero,来判断布尔值。
if语句中隐示使用布尔值,你应该不使用:
if foo == True:
简单使用 if foo:.
有几个原因。最首要的是当foo变为int类型时,if语句仍然有效。更深层的原因在于equality和indentity。使用==判断两个对象爱嗯是否是相同值(_eq属性)。使用is来判断两个对象是否时相同对象。
在判断中,避免直接与False和None或者空序列(例如:[], {})进行比较。如果my_lists是个空列表,使用if mylist: 将返回False
有时,虽不推荐和None进行直接比较,但有时又时必须的。函数检查某个参数默认值是否None,例如:
def insert_value(value, position=None):
"""INserts a value into my container, optionally at the
specified position"""
if position is not None:
...
这里if position:?做了什么呢,当有人想插入到指定0位置,当函数没有设置position参数,由于0等于False,我们就使用is 或is not来进行None比较, 而不是 ==.
糟糕的
def number_of_evil_robots_attacking():
reutrn 10
def should_raise_shields():
# "We only raise Shields when one or more giant robots attack,
# so I can just return that value..."
return number_of_evil_robots_attacking()
if should_raise_shields() == True:
raise_shields()
print("Shields raised")
else:
print("Safe! No giant orbots attacking")
推荐的
def number_of_evil_robots_attacking():
reutrn 10
def should_raise_shields():
# "We only raise Shields when one or more giant robots attack,
# so I can just return that value..."
return number_of_evil_robots_attacking()
if should_raise_shields():
raise_shields()
print("Shields raised")
else:
print("Safe! No giant orbots attacking")
评论关闭