返回一个计算的布尔pythonic或我应该使用传统的if / else?

时间:2013-01-16 07:06:07

标签: python

我想知道以下哪些示例在Python社区中更受欢迎:

1

return any(host[0].endswith(bot_hosts) for bot_hosts in bot_hosts)

2

if any(host[0].endswith(bot_hosts) for bot_hosts in bot_hosts):
    return True
else:
    return False

或者别的什么?

请告知。

3 个答案:

答案 0 :(得分:4)

在您的示例中:str.endswith将元组作为参数。总的来说,作为设计模式使用第一个版本(检查推理@Ben的答案)。 那是any(host[0].endswith(bot_host) for bot_host in bot_hosts)与:

相同
host[0].endswith(bot_hosts) #if bot_hosts is a tuple
                            #if bot_hosts in not a tuple add tuple(bot_hosts)

示例:

In [1]: suffs = ('a','b','d')

In [2]: 'asd'.endswith(suffs)
Out[2]: True

In [3]: 'asap'.endswith(suffs)
Out[3]: False

答案 1 :(得分:4)

if <anything>:
    return True
else:
    return False

通常极其毫无意义。 <{1}}无论如何都必须返回一些真实或虚假的东西,所以只需返回它。

您希望这样做的唯一原因是,如果您想确保仅返回<anything>True,那么您的False可能会返回其他对象。例如,它可能会返回一个大对象,在检查它是否存在之后您不再关心它,因此您不希望返回对它的引用,这可能会阻止其内存被回收。或者您的<anything>可能会返回一个对象或<anything>,而None是假的,您担心以后的代码会使用None测试,而您希望错误路径不计算为is not None

即便如此(正如poke在评论中指出的那样),您可以使用None根据{的真实性获得保证为bool(<anything>)True的值{1}},因此永远不会有充分的理由使用False语句立即返回<anything>if

在您的情况下,True始终会返回Falseany。因此,您确实拥有TrueFalse的值,检查它是哪一个,然后返回True,如果它是False并返回True如果是True

答案 2 :(得分:1)

第二个版本已完全取消,就像将布尔值与True进行比较以检查它是否为真。我个人会做的是使用循环,即将迭代部分与在每个元素上执行的部分分开,以期使其更容易阅读。