又烧脑又炫技还没什么用,在代码里面打印自身

简介: 又烧脑又炫技还没什么用,在代码里面打印自身

今天这个问题,在公众号粉丝群里面,大家是这样评价的:


640.png


问题是这样的,请在一个xxx.py文件中写一段代码,让他能够打印自身的全部代码。也就是说,下面两个命令,输出的结果应该完全一样:


python3 xxx.py
cat xxx.py


不能读文件,不能用inspect或者ast,不能import任何模块。


如果可以读文件,那么这个问题非常简单:


with open('xxx.py') as f:
    content = f.read()
    print(content, end='')


运行效果如下图所示:


640 (1).png

但现在的问题是,不能读文件,不能import模块。基本上只能用print函数来实现这个功能。


这属于又炫技,又装逼,但是在工作中没有任何作用的代码。能写出来只能证明自己脑子转的快,Python机制记得牢。


这个问题为什么困难呢?看到题目会觉得可能很简单,但是你动手开始写的时候,又会发现它很困难,无处下笔。它就像是你要创建一个txt文件,这个文件里面的内容是这个文件自身的md5码一样。当你想修改代码打印的值时,代码本身也改变了。


大家一开始看到这个题目,可能抓住脑子里面马上一闪而过的想法,立刻开始敲键盘:


x = '''
 x = '''  # 到这里你应该就卡住了
'''


然后你就卡住了,接下来应该怎么写?


要解决这个问题,我们要知道,在Python里面,循环体只有一行的for循环,除了用缩进外,还有另一种写法:


a = [1, 2, 3]
for x in a: print(x)

运行效果如下:

640 (2).png


这样一来,我们就可以把多行代码放到一行里面来写,但是打印出来还是多行:


a = ['a = kingname', 'for x in a: print(x)']
for x in a: print(x)


运行效果如下图所示:


640 (3).png


这样看起来就很像了,那进一步应该怎么调整呢?我们再加一行:


a = ['a = kingname', 'for x in a: print(x)']
print('a =', a)
for x in a: print(x)


运行效果如下图所示:


640 (4).png


可以看到,打印出来的代码跟真正的源代码,都是3行,并且第一行和第三行是一样的。现在只要想办法把第二行搞到一样就行了。


我们再来改一下代码:


a = ['print("a =", a)', 'for s in a: print(s)']
print("a =", a)
for s in a: print(s)


运行以后的效果如下图所示:


640 (5).png


现在源代码就跟打印出来的代码一模一样了



请关注微信公众号【未闻Code】获取更多精彩文章。


目录
相关文章
|
4月前
|
设计模式 程序员
故意把代码写得很烂,这样的 “防御性编程“ 可取吗?
故意把代码写得很烂,这样的 “防御性编程“ 可取吗?
|
C语言
近期一系列个人做题反复记不住以及思路不清晰问题的总结
近期一系列个人做题反复记不住以及思路不清晰问题的总结
51 0
|
Java 程序员 开发者
只用一行代码,你能玩出什么花样?
只用一行代码,你能玩出什么花样?
98 1
|
开发者
试着做点儿有趣的事情
一个游戏怎样才算是做完了?这是个因人而异的问题。有些游戏还没有做出来就做完了,因为开发者不想再做了。有的游戏看上去做完了,但是后续还在不停的更新,那我们就说这个游戏其实还没有做完。至于如何算是做完了,我觉得这应该交由该游戏的制作者来决定。
93 0
|
数据库
我又写了一堆烂代码
“我又写了一堆烂代码!” 这句话我经常对自己说,目的是为了督促自己不断地思考所写的代码是否足够可靠。
67 0
|
小程序 开发工具
彻底搞清微信小游戏开发中的循环的使用
本文主要内容为游戏开发中常用的循环的使用方法。 如果你没有任何的游戏开发经验,欢迎阅读我的“人人都能做游戏”系列教程,它会手把手的教你做出自己的第一个小游戏。
185 0
|
安全 Java 数据库连接
麻了,代码改成多线程,竟有9大问题 下
麻了,代码改成多线程,竟有9大问题 下
|
消息中间件 JavaScript 小程序
麻了,代码改成多线程,竟有9大问题 上
麻了,代码改成多线程,竟有9大问题 上
【perl】老司机的再一次翻车:没有想到加了一句打印,会影响结果输出
【perl】老司机的再一次翻车:没有想到加了一句打印,会影响结果输出
|
数据库
【硬着头皮】 比较两个数大小,麻烦写得整洁点
【硬着头皮】 比较两个数大小,麻烦写得整洁点
120 0
【硬着头皮】 比较两个数大小,麻烦写得整洁点

相关实验场景

更多