python语法混乱_混乱的Python:生命游戏

偶尔在python.cn上看到一篇《谁说使用 Python 你就写不出混乱的代码?》,地址在这里。觉得非常有意思,记得使用Perl的时候,因为其灵活的语法,可以有很优美的代码书写方式,也可以写出非常混乱的代码。而Python,从一开始就致力于消除这种混乱,缩进的结构使得Python代码相对其他语言整齐了许多,刚开始用Python的时候虽然也想过能不能写出乱糟糟的代码,但是一开始就败在缩进上,也就慢慢忘记了。

分析

这次看到,自然是兴致盎然,稍微研究一下,发现它是把一些看似乱糟糟的字符串重新编码了,然后交给exec执行了。关键就在这一句:

exec(reduce(lambda x,i:x.replace(chr(i),"n "[34-i:]), range(35), long_long_str)

1

exec(reduce(lambdax,i:x.replace(chr(i),"n "[34-i:]), range(35),long_long_str)

用了Python的几个函数式编程的函数。lambda非常常用,reduce相对来说少用一些,但是需要使用的时候非常好用!

可能有人不是非常熟悉这个reduce函数,因为其他的语言里未必有这个东西,其实reduce的含义是折叠(我知道这么说还是很抽象),举一个小例子,让你计算0~100所有数字的和(OK,我知道你知道答案,但请编程实现),一般的话,就会这么写(这里不考虑等差数列的公式):

Python

sum = 0

for i in range(101):

sum += i

print sum

1

2

3

4

sum=0

foriinrange(101):

sum+=i

printsum

很简单,但是使用reduce会更简单:

Python

print reduce(lambda x,y:x+y, range(101))

1

printreduce(lambdax,y:x+y,range(101))

没有循环,没有中间变量,一句搞定!

它的运行过程如下图所示

reduce接受两个或三个参数,第一个为要执行的函数,第二个为一个序列,第三个这里先无视。

在我们这个例子的执行过程中,reduce从序列中取出两个值(0和1),相加计算出一个结果(1),然后再从序列中取出一个值(2),和刚刚得到结果(1)相加再得到一个结果(3),然后重复这个过程直到结束。

上面的混乱代码中,reduce对字符串不停的修正,把空白(空格和回车)删除,把!替换为空格,”替换为回车空格。然后得到一个格式完好的代码。换句话说,通过这个运算方法,我们把原先的代码中的空格和回车先用”或!替换以后,可以在代码中随意增加空格和换行了,图片的样子就是这么出来的。

生命游戏

知道了原理,我们就能很容易的造一个我们自己喜欢的混乱python代码了。不过我们可以看到,虽然有任意的回车和空白,我们还是能很容易的在字符串里看到python里的关键字,这样显得不够酷……

我把这个东西再升级了一下,字符全都混淆(ASCII值加1),基本就成乱码了,然后再用这个方法调整空白。

用pygame做了一个生命游戏的演示,代码写成一个骷髅头的样子(抱歉,非常的不像。。。。)。关于生命游戏,相信有些编程经验的应该会知道,可以在维基上看看说明,百度百科里好像更全一些,而这里,则有更学术性的研究。

代码完成后是这个样子的:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=r'''

jnqpsu!sboepn"m>\

sboepn.d ipjdf((

0,2) )!gp

s!j !jo

!sb ohf

(59) ^!gp

s!j! jo!s

bohf ( 5 9)^"

l>\ 0!g ps! j!jo!

sbohf (59)^! gps!j! jo!sb

ohf(59 )^"jn qpsu! qzhbnf

"qzhbn f.jo ju()" t>qzhb

nf.ejt qmbz.t

fu`npe f((5 90,59

0),0,43)" p>Usv f"efg!{(y,

z);"!n>0" !gps! j!jo!(y-2,

y,y+2);" !!gps !k!jo!(z

-2, z , z +2);"!!

!jg! j > > y ! b o e !z>>k

;"!!!!d poujo v f"!!!jg!(j= 0!ps !j?58!ps!

k=0!ps!k? 58);"!!!!dp oujovf" !!!jg!(mj ^k^);

"!! ! !n+>2"!sfuv s o ! n " jnqpsu!dpqz"xijmf!

p;" !t.gjmm((36 6,366,36 6))"!

gps !f!jo!qzhb nf.fwfo u.hfu

(); "!!jg!f.uz qf>>23 ;"!!!p

>Gbmtf" !gps!y!jo!y s bohf(59 );"!!g

ps!z!jo!ysbo hf(59);"!!!n>{(y ,!z)"!!!jg!n>

>3;"!!!!l y^z^>my^ z^"!!!fmjg!

n>>4;"!!! !ly^z ^>2"!!!f

mtf;"!!!!ly^z ^>0"!!!

jg!ly^z^;"!!! !t.gjmm((0,0,3

66),(z*20,y*20,20, 20))"!!!!qzhbnf.esbx.sfd

u(t ,(0,0,0),( z*20,y*2 0,20,20),2)"!m

>d pqz.effqdpqz (l )" !q

zhb nf .ej t qmbz.vqebuf()"!q z h b nf

.ujn f .xbju(200)"'''; exec( ''.join(

map( lambda x:chr(ord(x)-1) if ord(

x) > 49 else x, reduce( lambda x, i : x.

replace( chr(i), "n "[34-i:35-i] ), range(35),

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX))))

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=r'''

jnqpsu!sboepn"m>\

sboepn.d      ipjdf((

0,2)                 )!gp

s!j                      !jo

!sb                        ohf

(59)                      ^!gp

s!j!                      jo!s

bohf  (               5   9)^"

l>\  0!g           ps!  j!jo!

sbohf  (59)^!   gps!j!   jo!sb

ohf(59  )^"jn   qpsu!   qzhbnf

"qzhbn   f.jo   ju()"   t>qzhb

nf.ejt                  qmbz.t

fu`npe       f((5        90,59

0),0,43)"    p>Usv  f"efg!{(y,

z);"!n>0"    !gps!  j!jo!(y-2,

y,y+2);"    !!gps   !k!jo!(z

-2, z   ,        z +2);"!!

!jg! j > > y ! b o e !z>>k

;"!!!!d   poujo v f"!!!jg!(j= 0!ps !j?58!ps!

k=0!ps!k? 58);"!!!!dp oujovf" !!!jg!(mj ^k^);

"!! !  !n+>2"!sfuv s o ! n " jnqpsu!dpqz"xijmf!

p;"   !t.gjmm((36              6,366,36   6))"!

gps    !f!jo!qzhb              nf.fwfo    u.hfu

();    "!!jg!f.uz              qf>>23    ;"!!!p

>Gbmtf" !gps!y!jo!y   s      bohf(59     );"!!g

ps!z!jo!ysbo   hf(59);"!!!n>{(y   ,!z)"!!!jg!n>

>3;"!!!!l      y^z^>my^     z^"!!!fmjg!

n>>4;"!!!      !ly^z     ^>2"!!!f

mtf;"!!!!ly^z     ^>0"!!!

jg!ly^z^;"!!!     !t.gjmm((0,0,3

66),(z*20,y*20,20,     20))"!!!!qzhbnf.esbx.sfd

u(t ,(0,0,0),(       z*20,y*2    0,20,20),2)"!m

>d                pqz.effqdpqz    (l  )"     !q

zhb  nf   .ej t qmbz.vqebuf()"!q z h  b      nf

.ujn  f    .xbju(200)"''';exec(''.join(

map(lambdax:chr(ord(x)-1)iford(

x)>49elsex,reduce(lambdax,i:x.

replace(chr(i),"n "[34-i:35-i]),range(35),

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX))))

为了“清晰”起见,解码的代码就写在了最后没有混杂在里面了,稍微有些明白的就能打出原始代码来。

执行需要安装pygame库,执行效果如下(示意图,非连续):

希望能有“玩心”的朋友继续研究,让Python再混沌一些吧~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值