2016-01-30 35 views
2

我知道模%在Python手段獲取餘,例如:如何理解Python中all()函數的模數?

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'> 

那麼,爲什麼我可以從他們的項目都是整數的迭代獲得真正的價值?

謝謝!

+0

從DOC: >返回真,如果迭代的所有元素都爲真(或如果可迭代爲空)。 –

+0

@ahsanul那麼在這種情況下,迭代被視爲空? –

+0

不,該迭代不被視爲空。模運算符返回一個數字,如果它們都不是0,則'all'返回True。它基本上測試11是否可以被'test_num'中的任何數字整除,如果它既不能被整除,它也會返回True。雖然不是非常明確的代碼。 – L3viathan

回答

3

如果你把一個整數布爾環境(例如,在一個條件,或者明確地通過bool),它返回整數是否是非零:

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

因此,讓我們看一下代碼:

(11 % i for i in test_num)是發電機,其解開到11 % 311 % 611 % 9,這轉而25,和2。由於它們全部非零,因此all返回True

在效果上,這將返回True當且僅當圖11是由既不3,6整除,也不9.

1

其他任何大於0取爲真。由於test_num中沒有0,因此all(test_num)將返回true。

試試這個:

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

應用相同的邏輯來for循環,你會得到你的答案。

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()正在使用布爾值並返回布爾值。所以你的整數轉換爲布爾值,意味着任何非零值返回True。所以如果任何modulo返回0,你將會得到False,否則你會得到True。

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