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

时间:2016-01-30 19:56:37

标签: python iterator boolean generator modulo

我知道Python中的模%意味着得到余数,例如:

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

我也了解到all()函数就像通用量化一样,如果所有命题都是True,则返回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'>

那么,为什么我可以从其项目都是整数的iterable中获得True值?

谢谢!

3 个答案:

答案 0 :(得分:3)

如果在布尔上下文中取整数(例如在条件中,或通过bool明确表示),则返回整数是否为非零:

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

让我们看一下代码:

(11 % i for i in test_num)是一个展开到11 % 311 % 611 % 9的生成器,转向25和{ {1}}。由于它们全部为非零,2会返回all

实际上,当且仅当11不能被3,6和9整除时,这将返回True

答案 1 :(得分:1)

除0以外的任何内容都视为真。由于test_num中没有0,all(test_num)将返回true。

试试这个:

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

将相同的逻辑应用于for循环,您将得到答案。

答案 2 :(得分:1)

你看过帮助(全部)吗?

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()正在处理Boolean并返回一个布尔值。所以你的整数被转换为布尔值,这意味着任何非零值都返回True。因此,如果任何模数返回0,您将获得False,否则您将获得True。

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