如何理解 Python 中 all() 函数中的取模?

How to understand the modulo in all() function in Python?

我知道Python中的模%就是取余的意思,例如:

print 6 % 4            # 2, because 6 = 1 * 4 + 2
print 4 % 2            # 0, because 4 = 2 * 2 + 0

我也知道了all()函数就像全称量化,returnTrue如果所有的命题都是True,它的参数应该是一个可移植的。

my_list = [True, True, True, True]
print all(my_list)                    # True

但是我仍然无法理解以下代码:

test_num = [3,6,9]

print all (11 % i for i in test_num)        # True

for unknown in (11 % i for i in test_num):
    print unknown, type(unknown)            # 2 <type 'int'>
                                            # 5 <type 'int'>
                                            # 2 <type 'int'>

那么,为什么我可以从item都是整数的iterable中得到True值呢?

谢谢!

如果您在布尔上下文中使用整数(例如在条件中,或通过 bool 明确表示),returns 整数是否为非零:

>>> bool(0)
False
>>> bool(43)
True

那么让我们看一下代码:

(11 % i for i in test_num) 是一个展开到 11 % 311 % 611 % 9 的生成器,它会变成 25,和 2。由于它们都是非零的,all returns True.

实际上,这个 returns True 当且仅当 11 不能被 3、6 或 9 整除。

除 0 以外的任何值都被视为 true。由于 test_num 中没有 0,all(test_num) 将 return 为真。

试试这个:

>>> test_num = [2,3,0]
>>> print all(test_num)
False  

将相同的逻辑应用到 f​​or 循环中,您将得到答案。

你看过帮助(全部)了吗?

Help on built-in function all in module __builtin__:

all(...)
    all(iterable) -> bool

    Return True if bool(x) is True for all values x in the iterable.
    If the iterable is empty, return True.

all() 处理布尔值,return 处理布尔值。所以你的整数被转换为布尔值,这意味着任何非零值 return True。因此,如果任何模数 return 0,您将得到 False,否则您将得到 True。

>>> print all([False,True])
False
>>> print all([True,False])
False
>>> print all([True,True])
True