2013-11-15 22 views
15

Tôi đang cố gắng tháo lắp và de-xáo trộn mã này python mandlebrot-tạo:"for x in y hoặc z:" làm gì trong Python?

_          = (
             255, 
             lambda 
           V  ,B,c 
          :c and Y(V*V+B,B, c 
           -1)if(abs(V)<6)else 
       (    2+c-4*abs(V)**-0.4)/i 
       ) ;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: 
      i ,Y=_;j(P('BBB',*(lambda T:(T*80+T**9 
        *i-950*T **99,T*70-880*T**18+701* 
       T **9  ,T*i**(1-T**45*2)))(sum(
       [    Y(0,(A%3/3.+X%v+(X/v+ 
           A/3/3.-x/2)/1j)*2.5 
          /x -2.7,i)**2 for \ 
           A  in C 
             [:9]]) 
             /9) 
             ) ) 

nguồn: http://preshing.com/20110926/high-resolution-mandelbrot-in-obfuscated-python/
Tôi tìm thấy một vòng lặp for với một twist thú vị, và tôi không chắc chắn nếu nó chỉ là một phần của obfuscation, hoặc nếu nó thực sự có một chức năng. Dòng giữa:
for X in j('BM'+P(M,v*x*3+26,26,12,v,x,1,24))or C:
Làm gì hoặc làm gì ở cuối?

Tôi đã viết lại đoạn code như sau cho rõ ràng:

import struct 

image_name = "M.bmp" 
mandlebrot = lambda V,B,c :c and Y(V*V+B,B,c-1) if(abs(V)<6) else (2+c-4*abs(V)**-0.4)/i 
y,x = 600,800 
pixelrange = range(y*x) 
package = struct.pack 

image = open(image_name,'wb').write 

for X in image('BM'+package('<QIIHHHH',y*x*3+26,26,12,y,x,1,24)) or pixelrange: 
    i = 255 
    Y = mandlebrot 
    image(package('BBB',*(lambda T:(T*80+T**9*i-950*T**99,T*70-880*T**18+701*T**9,T*i**(1-T**45*2)))(sum([Y(0,(A%3/3.+X%y+(X/y+A/3/3.-x/2)/1j)*2.5/x-2.7,i)**2 for A in pixelrange [:9]])/9))) 
+2

Toàn bộ câu chuyện về cách bạn tìm thấy điều này thú vị 'cho x trong y hoặc z' là không cần thiết cho câu hỏi, nhưng tôi vui vì bạn đã bao gồm nó. Nó khá tuyệt. – SethMMorton

+0

Tôi đã mong đợi câu trả lời phức tạp hơn rất nhiều, bởi vì tôi không biết "cho x trong y hoặc z" thực sự là một sử dụng hợp lệ/hợp lệ của vòng lặp for. Như thường lệ, python ngạc nhiên với sự đơn giản của nó. –

Trả lời

16

Làm:

for x in y or z: 

là giống như:

for x in (y or z): 

Nếu y đánh giá để True, for-loop sẽ lặp qua nó. Nếu không, nó sẽ lặp qua z.

Dưới đây là một minh chứng:

>>> y = [1, 2, 3] 
>>> z = [4, 5, 6] 
>>> for x in y or z: 
...  print x 
... 
1 
2 
3 
>>> y = [] # Empty lists evaluate to False in Python 
>>> for x in y or z: 
...  print x 
... 
4 
5 
6 
>>> 
+0

Thật tuyệt vời khi thử nghiệm nhanh chóng một cách nhanh chóng trong cli. – Matt

3

or trả về toán hạng đầu tiên nếu nó là boolean true, nếu không thì thứ hai. Boolean sai về cơ bản có nghĩa là 0, False, None, hoặc một "đối tượng rỗng" (chuỗi rỗng, danh sách, vv); boolean đúng là mọi thứ khác. Vì vậy, j('BM'+P(M,v*x*3+26,26,12,v,x,1,24)) or C sẽ đánh giá kết quả của cuộc gọi j(...) nếu kết quả đó không có giá trị, nếu không thì C. Vì vậy, nó sẽ lặp qua kết quả của j(...) nếu kết quả đó là không có giá trị, nếu không nó sẽ lặp lại trên C.

Các vấn đề liên quan