【问题标题】:What does "for x in y or z:" do in Python?“for x in y or z:”在 Python 中有什么作用?
【发布时间】:2013-11-29 08:25:16
【问题描述】:

我正在尝试分解并去混淆这个生成 mandlebrot 的 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)
                                       )   )

来源:http://preshing.com/20110926/high-resolution-mandelbrot-in-obfuscated-python/
我发现了一个有趣的 for 循环,我不确定它是否只是混淆的一部分,或者它是否真的有一个功能。中间一行:
for X in j('BM'+P(M,v*x*3+26,26,12,v,x,1,24))or C:
or最后做了什么?

为了清楚起见,我将代码重写如下:

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

【问题讨论】:

  • 关于你如何发现这个有趣的for x in y or z 的整个故事对于这个问题来说不是必需的,但我很高兴你把它包括在内。这很酷。
  • 我原以为答案会复杂得多,因为我不知道“for x in y or z”实际上是对 for 循环的正确/有效使用。像往常一样,python 的简单性让我大吃一惊。

标签: python for-loop obfuscation fractals deobfuscation


【解决方案1】:

在做:

for x in y or z:

等同于:

for x in (y or z):

如果 y 的计算结果为 True,for 循环将遍历它。否则,它将遍历z

下面是一个演示:

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

【讨论】:

  • 在 cli 中快速测试的强大程度令人惊叹。
【解决方案2】:

or 如果为布尔值 true,则返回第一个操作数,否则返回第二个。 Boolean false 基本上表示 0、False、None 或“空对象”(空字符串、列表等); boolean true 是其他一切。因此j('BM'+P(M,v*x*3+26,26,12,v,x,1,24)) or C 将评估为j(...) 调用的结果,如果该结果为非空,否则为C。因此,如果 j(...) 的结果非空,它将遍历该结果,否则将遍历 C

【讨论】:

    猜你喜欢
    • 2014-03-01
    • 2021-08-07
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多