dod*_*oda 43 python function internal
and
并or
返回他们评估的最后一个元素,但为什么不是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开发的邮件列表上,当吉多·范罗苏姆建议增加any
和all
到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)
雷蒙德赫廷杰,谁落实any
和all
,回应专门针对为什么any
而all
不要像and
和or
:
随着时间的推移,我得到了关于这些和其他itertools食谱的反馈.没有人反对这些食谱或Guido版本中的真/假返回值.
Guido的版本符合任何/所有谓词的正常期望.此外,它避免了人们目前使用Python的"和"和"或"的独特实现所遇到的错误/混淆.
归还最后一个元素并不邪恶; 这只是奇怪的,意外的,非显而易见的.抵制这个变得棘手的冲动.
邮件列表在很大程度上是同意的,只留下今天看到的实现.
Wee*_*ble 20
and
并且or
可以以他们总是返回其操作数之一的方式明智地定义.但是,any
并且all
不能明智地定义总是从它们的输入序列返回一个值:具体来说,当列表为空时它们不能这样做.无论any
和all
现在有一个明确的结果,在这种情况下:any
返回False和all
返回True.您将被迫有时返回一个布尔值,有时会从序列返回一个项目,这会产生令人不快和令人惊讶的界面.简单而一致的好多了.
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)
我问了关于python-ideas的同样的问题,并且被告知原因是any()
并且all()
需要在序列为空时返回一个值,并且这些值必须是False
和True
.这对我来说似乎是一个微弱的争论.
该功能现在已无法改变,但我认为他们会更有用,而更好的类似物and
和or
他们推广的运营商,如果他们回来,他们遇到的第一个真正的十岁上下或假十岁上下的价值.