为什么删除“any”时此表达式总是正确的?

2024-06-01 04:28:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我对“any”语法有一些问题。我有两张单子

mainseq = ["hali", "hulu", "habi"]
seq = ["a", "b", "c", "d"]

我想找出seq中的元素是否存在于mainseq

for each in seq:
    if any(each in halum for halum in mainseq):
        print each

这给了我预期的“a”和“b”。但是当我删除“any”语法时,我得到了seq中的所有值,即使mainseq中没有“c”和“d”

for each in seq:
    if (each in halum for halum in mainseq):
        print each

使用和不使用的“any”函数在幕后发生了什么


Tags: in元素forif语法anyseq单子
3条回答

要了解发生了什么,您可以通过打印等效的列表理解和boolean表示和any来调试它:

for each in seq:
    print(each)
    print([each in halum for halum in mainseq])
    print(any(each in halum for halum in mainseq))
    print(bool(each in halum for halum in mainseq)) 

# a
# [True, False, True] <- contains more than one True element
# True                <- so any returns True
# True                <- boolean expression of a generator is always True

# b
# [False, False, True] <- contains one True element
# True                 <- so any returns True
# True                 <- boolean expression of a generator is always True

# c
# [False, False, False] <- no element is True
# False                 <- so any returns False
# True                  <- boolean expression of a generator is always True

# d
# [False, False, False] <- no element is True
# False                 <- so any returns False
# True                  <- boolean expression of a generator is always True

但是请记住,生成器将始终计算为True,因为生成器没有显式的布尔表示,并且没有长度(请参见Truth-value-testing in the official documentation

另一方面any消耗生成器,仅当任何元素为True时才返回True。这是each == aeach == b的情况。因此if条件并不总是被触发

any返回布尔值TrueFalse

您的语句(each in halum for halum in mainseq)返回一个计算结果为truthy值的生成器,因此代码总是位于if块中。 下面是一段更详细的代码,解释了这一点:

http://ideone.com/AQ7dRs

mainseq = ["hali", "hulu", "habi"]
seq = ["a", "b", "c", "d"]

print('Demo of any:\n')
for each in seq:
    boolFlag = any(each in halum for halum in mainseq)
    print('Any returned:{0}'.format(boolFlag)) 
    if boolFlag:
        print each

print('Demo of generator as truthy value:\n')

for each in seq:
    boolFlag = (each in halum for halum in mainseq)
    print('boolFlag is:{0}'.format(boolFlag))
    if boolFlag:
        print each
        print('{0} is Truthy'.format(boolFlag))

产出:

Any returned:True
a
Any returned:True
b
Any returned:False
Any returned:False
Demo of generator as truthy value:

boolFlag is:<generator object <genexpr> at 0xb7272bbc>
a
<generator object <genexpr> at 0xb7272bbc> is Truthy
boolFlag is:<generator object <genexpr> at 0xb7272be4>
b
<generator object <genexpr> at 0xb7272be4> is Truthy
boolFlag is:<generator object <genexpr> at 0xb7272bbc>
c
<generator object <genexpr> at 0xb7272bbc> is Truthy
boolFlag is:<generator object <genexpr> at 0xb7272be4>
d
<generator object <genexpr> at 0xb7272be4> is Truthy

(each in halum for halum in mainseq)是一个generator expression。生成器表达式是truthy value。在if语句中仅使用它将始终是True,因此套件将始终被执行^{}在iterable中搜索任何真实的值。因此,只有当生成器表达式的任何结果为True时,使用它才会执行套件

相关问题 更多 >