5

我想知道以下哪个示例在 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

或者也许是别的什么?

请指教。

4

3 回答 3

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
于 2013-01-16T07:12:58.133 回答
4
if <anything>:
    return True
else:
    return False

通常是非常没有意义的。<anything>无论如何都必须返回真实或虚假的东西,所以只需返回它。

你想要这样做的唯一原因是你想确保你只返回Trueor False,因为你<anything>可能会返回一些其他对象。例如,它可能会返回一个大对象,在检查它是否存在之后您不再关心它,因此您宁愿不返回对它的引用,这可能会阻止其内存被回收。或者,您<anything>可能正在返回一个对象 or None,虽然None是错误的,但您担心以后的代码将使用is not None测试,并且您希望不将错误路径计为None.

即便如此(正如 poke 在评论中指出的那样),您可以使用bool(<anything>)来获取一个保证为TrueFalse基于真实性的值<anything>,因此没有充分的理由使用立即返回or的if语句。TrueFalse

在您的情况下,any始终返回Trueor False。所以你实际上有一个值是Trueor False,检查它是哪一个,然后True如果是则返回,如果是则True返回。FalseFalse

于 2013-01-16T07:17:13.287 回答
1

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

于 2013-01-16T07:17:15.527 回答