混乱的Python:生命游戏

By | 2011/09/21

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

分析

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

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

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

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

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

它的运行过程如下图所示

reduce

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

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

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

生命游戏

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

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

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

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

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

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

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


有9人评论 混乱的Python:生命游戏

  1. lambda

    很好的一个博客,对于刚学python的我来说,眼界大开。

    回复
    1. xumaomao

      换行符没有加\
      二维数组的下标上少了[

      回复
      1. xishui 作者

        xumaomao童鞋又来捧场啦,多谢多谢,当时应该是从脚本里面复制出来的,可以直接运行的,不过博客经过多次转移导入导出的,有可能代码里面会出现一点问题,若能发现错误,还请不吝指正。

        回复
        1. xumaomao

          不要这么客气啊。我觉得问题可能在于把ASCII码+1的时候,是对>48的字符做了+1,当明码中有
          “[” (ord(‘[‘)=91) 的时候,它会在暗码中被转化成 “\” (ord(‘\’)=92)。
          之后这个 “\” 就可能在之后的操作中被当成转义符被略掉了。
          所以可以加一个判定:
          lambda x:chr(ord(x)-1) if ord(x) > 49 and ord(x) != 91 else x,…
          不再对”[“ 做转换就行了。

          另外我在你的基础上写了一个脚本,读入一段明码和一张图片,用你的方法把明码转成暗码,根据暗码的长度调整图片的分辨率,然后转成灰度图片,再转成”黑白“(0 or 1), 然后在0的地方填充空格,1的地方填充暗码,每一行末尾加换行符,最后空余的地方填充上随即字符(做为注释加入所以不影响运行)。返回的字符串的字符串可以用你的方法再解码、运行。这样可以选择任意图形来生成混乱代码,只要图像本身层次够分明(虽然可以调整阈值适当弥补)。

          我找了一张骷髅头试验效果不错,但是贴出来就乱了套,可能因为排版的时候字符大小不一样了。不知道用两边对齐的话会不会好一点。

          回复
  2. 粤东油

    (更新得奬名单)时隔2年金鹰奖颁奖晚会今晚在湖南卫视现场直播,最具人气男演 综投财经汇 员奖入围者有胡歌、王凯、吴秀波、王雷及李雪健,角逐最具人气女演员者则有赵丽颖、刘涛、佟丽娅、马苏、左小青,基本上是胡歌大战王凯、赵丽颖厮杀刘涛之争,以和霍建华合演夯剧《花千骨》的赵丽颖,今年再以《老九门》人气涨停板,今天又是她29岁生日,最后以《花千骨》夺下观众喜爱的女演员奖,加冕金鹰视后,做为最棒的生日礼物,格外开心。而金鹰视帝则是众望所归的胡歌,他以《琅琊榜》获奖。而金鹰奬主办单位当场在典礼上搬出寿桃为赵丽颖庆生,让她十分惊喜。而胡歌及林依晨先出场担任颁奖人,两人当年合作《射鵰英雄传》扮郭靖及黄蓉,如今再度同框,让戏

    回复
  3. 粤微盘

      大家的周末过得还愉快吗?今天周一啦,我们就来听听新鲜事吧。小编今天给大家带来的是刚出炉的全国排行榜,什么排行榜呢?那就是2016中国财政透明度排行榜,不过 粤国际微盘 据说只有两个省份&ldquo,粤国际微盘;及格”,你们的家乡排第几呢?  11月26日,上海财经大学公共政策研究中心在上海发布《2016年中国财政透明度报告》,在对31个省(自治区、直辖市)财政信息展开调查后,研究计算得出中国财政透明度平均分数为42.25分(总分100分)。31个省份中超过60分只有两个省份,分别是宁夏和湖南。江苏省财政透明度分数垫底,为23.71分。   根据这份排行榜显示,今年仅有两个省份宁夏、湖南及格,换而言之超过

    回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注