今天这个问题,在公众号粉丝群里面,大家是这样评价的:
问题是这样的,请在一个xxx.py文件中写一段代码,让他能够打印自身的全部代码
。也就是说,下面两个命令,输出的结果应该完全一样:
python3 xxx.py cat xxx.py
不能读文件,不能用inspect或者ast,不能import任何模块。
如果可以读文件,那么这个问题非常简单:
with open('xxx.py') as f: content = f.read() print(content, end='')
运行效果如下图所示:
但现在的问题是,不能读文件,不能import模块。基本上只能用print函数来实现这个功能。
这属于又炫技,又装逼,但是在工作中没有任何作用的代码。能写出来只能证明自己脑子转的快,Python机制记得牢。
这个问题为什么困难呢?看到题目会觉得可能很简单,但是你动手开始写的时候,又会发现它很困难,无处下笔。它就像是你要创建一个txt文件,这个文件里面的内容是这个文件自身的md5码一样。当你想修改代码打印的值时,代码本身也改变了。
大家一开始看到这个题目,可能抓住脑子里面马上一闪而过的想法,立刻开始敲键盘:
x = ''' x = ''' # 到这里你应该就卡住了 '''
然后你就卡住了,接下来应该怎么写?
要解决这个问题,我们要知道,在Python里面,循环体只有一行的for循环,除了用缩进外,还有另一种写法:
a = [1, 2, 3] for x in a: print(x)
运行效果如下:
这样一来,我们就可以把多行代码放到一行里面来写,但是打印出来还是多行:
a = ['a = kingname', 'for x in a: print(x)'] for x in a: print(x)
运行效果如下图所示:
这样看起来就很像了,那进一步应该怎么调整呢?我们再加一行:
a = ['a = kingname', 'for x in a: print(x)'] print('a =', a) for x in a: print(x)
运行效果如下图所示:
可以看到,打印出来的代码跟真正的源代码,都是3行,并且第一行和第三行是一样的。现在只要想办法把第二行搞到一样就行了。
我们再来改一下代码:
a = ['print("a =", a)', 'for s in a: print(s)'] print("a =", a) for s in a: print(s)
运行以后的效果如下图所示:
现在源代码就跟打印出来的代码一模一样了
请关注微信公众号【未闻Code】获取更多精彩文章。