2014-01-16 151 views
1

最近我遇到了一些混淆的Python代碼,我毫無困難地將代碼片斷分離出來,並理解代碼片段。不過,我碰到一個聲明是我不解地問:Python for循環與?

v, x = 1500, 1000 
C = range(v*x) 
import struct 
P = struct.pack 
M, j = '<QIIHHHH', open('M.bmp','wb').write 
for X in j('BM'+P(M,v*x*3+26,26,12,v,x,1,24)) or C: 

在代碼的最後一行,我不明白這是如何for循環可以用or坐在那裏工作。代碼運行良好,但我不知道它在做什麼。我試着在Python文檔中查找,但我沒有看到任何東西。這段代碼做了什麼?

+0

可能的重複https://stackoverflow.com/questions/4033298/python-logic-in-assignment –

回答

5

write總是返回無,因此此表達式僅用於調用j(...)的副作用。循環永遠是對C

反混淆部分版本

import struct 
v = 1500 
x = 1000 
C = range(v*x) 
M = '<QIIHHHH' 
with open('M.bmp','wb') as fin 
    fin.write('BM'+struct.pack(M, v*x*3+26, 26, 12, v, x, 1, 24)) 
    for X in C: 
     ... 

的片段似乎是寫一個bmp文件的頭。我猜for循環會寫餘下的

+0

你是對的,它是 – jackcogdill

2

如果j的()==假,它遍歷C中的回報,而不是

採取步驟來看看它:

首先,它的計算結果是:

j('BM'+P(M,v*x*3+26,26,12,v,x,1,24)) 

應該這被認爲等於False(空列表,無,0等),則它評估這個:

C 

並將其作爲可迭代碼傳遞給for循環

應該指出,or不是for語法的一部分。在傳遞到您熟悉的for語法之前對其進行評估