如果我的函数必须返回布尔值,它应该返回 False 吗?

问题描述 投票:0回答:4

写作有什么好处:

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
,这只是一个例子。

python boolean nonetype
4个回答
6
投票

我认为在某种程度上这是个人喜好的问题。

我个人总是更喜欢前者而不是后者,因为“显式优于隐式”

此外,如果函数预计返回

bool
,我认为返回
bool
更干净,而不是返回需要评估其真实性才能获得
bool
的其他对象。


4
投票

这实际上取决于您打算如何使用该功能。

如果它只在布尔上下文中使用,那么将其定义和记录为“返回真实的东西或错误的东西”可能是有意义的,在这种情况下,将

None
作为错误的东西返回是合理的。

但是,如果您希望人们记录结果以进行人工调试,或者将其用作字典中的键,或者您只是不知道它将如何使用,那么说它返回会更清楚一个布尔值,然后显式返回

False

事实上,在提供的东西上比你承诺的更严格通常是一个好主意;即使您只记录您返回的是真实或错误的内容,总是返回 True

False
实际上不会造成
伤害
,除非您有一些其他可能有意义的值。* 正如其他答案这意味着,这不仅符合一般编程原则,而且也符合特定的 Python Zen“显式优于隐式”。

* 如果您认为这可能会损害性能,那么事实并非如此,即使这是一个问题。隐式

return None
与显式
LOAD_CONST
遵循完全相同的
RETURN_VALUE
return None
— 或者,当然,显式
return False


3
投票

如果您没有明确返回任何内容,则返回值将为

None
。如果函数应返回布尔值,您确实应该显式返回
False

在您的情况下,当隐式转换为

None
时,
False
将评估为
bool
,但我不会依赖于这种行为。基本上只是为了明确并提高可读性。


0
投票

但这并不完全与可读性有关。使用应该返回布尔值但实际上没有返回的函数,在显式比较值时可能会导致错误的行为:

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]

© www.soinside.com 2019 - 2024. All rights reserved.