为什么python`any`返回bool而不是值?

dod*_*oda 43 python function internal

andor返回他们评估的最后一个元素,但为什么不是Python的内置函数any

我的意思是这样实现自己很容易,但我仍然想知道为什么.

def any(l):
    for x in l:
        if x:
            return x
    return x
Run Code Online (Sandbox Code Playgroud)

编辑:

要添加到下面的答案,这里是你们强大的皇帝在同一个邮件列表中的实际引用:

是否总是返回True和False或第一个faling/passing元素?我在博客之前也玩过它,并且意识到最终的情况(如果序列是空的或者所有元素都没有通过测试)永远不能令人满意:如果参数是可迭代的bool,那么选择None会感觉很奇怪,并且如果参数是非bool对象的可迭代,那么选择False会感觉很奇怪.

Guido van Rossum(主页:http://www.python.org/~guido/)

Ste*_*ski 45

就此问题在2005年走到了Python开发的邮件列表上,当吉多·范罗苏姆建议增加anyall到Python 2.5.

Bill Janssen 要求将它们实施为

def any(S):
    for x in S:
        if x:
            return x
    return S[-1]

def all(S):
    for x in S:
        if not x:
            return x
    return S[-1]
Run Code Online (Sandbox Code Playgroud)

雷蒙德赫廷杰,谁落实anyall,回应专门针对为什么anyall不要像andor:

随着时间的推移,我得到了关于这些和其他itertools食谱的反馈.没有人反对这些食谱或Guido版本中的真/假返回值.

Guido的版本符合任何/所有谓词的正常期望.此外,它避免了人们目前使用Python的"和"和"或"的独特实现所遇到的错误/混淆.

归还最后一个元素并不邪恶; 这只是奇怪的,意外的,非显而易见的.抵制这个变得棘手的冲动.

邮件列表在很大程度上是同意的,只留下今天看到的实现.

  • 这是引用讨论中的另一个小块:Perl也返回最后一个true/false值,这是一个微妙的陷阱.我在一家perl商店工作,该商店有一个很长的风格指南,禁止使用这种副作用,但无论如何人们做了.由于同样的原因"if(x = calc_foo()):"不支持,如果有一个奇怪的副作用,有人会使用它而其他人不会注意.(http://mail.python.org/pipermail/python-dev/2005-March/052019.html) (6认同)
  • 另外,返回最后一个元素对空序列不起作用. (3认同)

Wee*_*ble 20

and并且or可以以他们总是返回其操作数之一的方式明智地定义.但是,any并且all不能明智地定义总是从它们的输入序列返回一个值:具体来说,当列表为空时它们不能这样做.无论anyall现在有一个明确的结果,在这种情况下:any返回False和all返回True.您将被迫有时返回一个布尔值,有时会从序列返回一个项目,这会产生令人不快和令人惊讶的界面.简单而一致的好多了.

  • 如果`any(thing.ismetal for your stuff in yourpockets)`,你将引爆金属探测器.如果`all(item.maxdimension <= slot.size for bag in bag)`,你可以通过插槽发布一个软包.在很多情况下,来自`any([])`或`all([])`的答案是完全自然的,并不令人惊讶. (7认同)
  • 我认为*any()`或`all()`的任何*回答都有点令人惊讶. (2认同)

Xav*_*hot 10

启动Python 3.8,并引进赋值表达式(PEP 572) :=操作者),我们可以可替换地明确地捕获证人一个的any表达或一个的all表达:


引用PEP 描述中的几个例子:

if any(len(long_line := line) >= 100 for line in lines):
  print("Extremely long line:", long_line)
Run Code Online (Sandbox Code Playgroud)
if any(len(long_line := line) >= 100 for line in lines):
  print("Extremely long line:", long_line)
Run Code Online (Sandbox Code Playgroud)


Ned*_*der 5

我问了关于python-ideas的同样的问题,并且被告知原因是any()并且all()需要在序列为空时返回一个值,并且这些值必须是FalseTrue.这对我来说似乎是一个微弱的争论.

该功能现在已无法改变,但我认为他们会更有用,而更好的类似物andor他们推广的运营商,如果他们回来,他们遇到的第一个真正的十岁上下或假十岁上下的价值.