写作有什么好处:
def contains(lst, n):
for x in lst:
if x == n:
return True
return False
而不是:
def contains(lst, n):
for x in lst:
if x == n:
return True
?
请注意,在第二个示例中缺少最后一行代码,并且该函数返回
None
而不是 False
。旁注:我知道我应该写
n in lst
,这只是一个例子。
我认为在某种程度上这是个人喜好的问题。
我个人总是更喜欢前者而不是后者,因为“显式优于隐式”。
此外,如果函数预计返回
bool
,我认为返回 bool
更干净,而不是返回需要评估其真实性才能获得 bool
的其他对象。
这实际上取决于您打算如何使用该功能。
如果它只在布尔上下文中使用,那么将其定义和记录为“返回真实的东西或错误的东西”可能是有意义的,在这种情况下,将
None
作为错误的东西返回是合理的。
但是,如果您希望人们记录结果以进行人工调试,或者将其用作字典中的键,或者您只是不知道它将如何使用,那么说它返回会更清楚一个布尔值,然后显式返回
False
。
事实上,在提供的东西上比你承诺的更严格通常是一个好主意;即使您只记录您返回的是真实或错误的内容,总是返回 True
或
False
实际上不会造成伤害,除非您有一些其他可能有意义的值。* 正如其他答案这意味着,这不仅符合一般编程原则,而且也符合特定的 Python Zen“显式优于隐式”。
* 如果您认为这可能会损害性能,那么事实并非如此,即使这是一个问题。隐式
return None
与显式 LOAD_CONST
遵循完全相同的 RETURN_VALUE
和 return None
— 或者,当然,显式 return False
。
如果您没有明确返回任何内容,则返回值将为
None
。如果函数应返回布尔值,您确实应该显式返回 False
。
在您的情况下,当隐式转换为
None
时,False
将评估为 bool
,但我不会依赖于这种行为。基本上只是为了明确并提高可读性。
但这并不完全与可读性有关。使用应该返回布尔值但实际上没有返回的函数,在显式比较值时可能会导致错误的行为:
def contains(lst, n):
for x in lst:
if x == n:
return True
l=[1,2]
i=3
if(contains(l,i)==False):
print ("{} is not found in list {}".format(i,str(l)))
else:
print ("{} is found in list {}".format(i,str(l)))
此代码片段的输出将是:
3 is found in list [1, 2]