python語法混亂 混亂的Python 生命遊戲

2021-10-11 09:50:10 字數 4762 閱讀 1066

偶爾在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)

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

sum=0

foriinrange(101):

sum+=i

printsum

很簡單,但是使用reduce會更簡單:

python

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

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

沒有迴圈,沒有中間變數,一句搞定!

它的執行過程如下圖所示

reduce接受兩個或三個引數,第乙個為要執行的函式,第二個為乙個序列,第三個這裡先無視。

在我們這個例子的執行過程中,reduce從序列中取出兩個值(0和1),相加計算出乙個結果(1),然後再從序列中取出乙個值(2),和剛剛得到結果(1)相加再得到乙個結果(3),然後重複這個過程直到結束。

上面的混亂**中,reduce對字串不停的修正,把空白(空格和回車)刪除,把!替換為空格,」替換為回車空格。然後得到乙個格式完好的**。換句話說,通過這個運算方法,我們把原先的**中的空格和回車先用」或!替換以後,可以在**中隨意增加空格和換行了,的樣子就是這麼出來的。

生命遊戲

我把這個東西再公升級了一下,字元全都混淆(ascii值加1),基本就成亂碼了,然後再用這個方法調整空白。

**完成後是這個樣子的:

******************************************x=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),

******************************************x))))

******************************************x=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)>49el***,reduce(lambdax,i:x.

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

******************************************x))))

為了「清晰」起見,解碼的**就寫在了最後沒有混雜在裡面了,稍微有些明白的就能打出原始**來。

執行需要安裝pygame庫,執行效果如下(示意圖,非連續):

希望能有「玩心」的朋友繼續研究,讓python再混沌一些吧~~

混亂的「文學」

好奇怪的現象。現在興起很多網路寫手,他們的作品追隨者很多,可是批評的人也不少,有人說他們的作品有著青春的疼痛,卻帶著 的力量 也有人說他們的作品不過是心靈雞湯罷了。孰是孰非?我們再看看現代 當代作家,如魯迅 莫言 陳忠實等,他們的作品通過故事引人深思,這種深思與上類作家有不同之處,如果說上類作家的作...

今天的混亂

首先看到springmvc配置有乙個 org.springframework.web.context.contextloaderlistener public class contextloaderlistener extends contextloader implements servletco...

C TreeView控制項的混亂命名

treeview的成員 label edit before lebel edit after label edit treenode的成員 name text treenode的建構函式 new treenode string text treeview新增節點的方法 tv.nodes.add st...