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

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

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


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】获取更多精彩文章。


目录
相关文章
|
机器学习/深度学习 并行计算 测试技术
MLX vs MPS vs CUDA:苹果新机器学习框架的基准测试
如果你是一个Mac用户和一个深度学习爱好者,你可能希望在某些时候Mac可以处理一些重型模型。苹果刚刚发布了MLX,一个在苹果芯片上高效运行机器学习模型的框架。
651 1
|
BI
运营必备 - CPA、CPS、CPC、CPM推广是什么意思?(一)
运营必备 - CPA、CPS、CPC、CPM推广是什么意思?(一)
21437 0
运营必备 - CPA、CPS、CPC、CPM推广是什么意思?(一)
|
JSON 前端开发 JavaScript
微前端项目难点解决(二)
微前端项目难点解决
1017 0
|
缓存
IDEA找不到或无法加载主类
IDEA找不到或无法加载主类
3782 0
IDEA找不到或无法加载主类
|
JSON API 数据格式
4. JSON字符串是如何被解析的?JsonParser了解一下(下)
4. JSON字符串是如何被解析的?JsonParser了解一下(下)
|
消息中间件 Java 中间件
秒懂消息队列MQ,万字总结带你全面了解消息队列MQ
消息队列是大型分布式系统不可缺少的中间件,也是高并发系统的基石中间件,所以掌握好消息队列MQ就变得极其重要。接下来我就将从零开始介绍什么是消息队列?消息队列的应用场景?如何进行选型?如何在Spring Boot项目中整合集成消息队列。
24012 10
秒懂消息队列MQ,万字总结带你全面了解消息队列MQ
|
6月前
|
算法
重磅!2025年中科院预警期刊名单正式发布!
中国科学院文献情报中心定期发布《国际期刊预警名单》,旨在防范学术不端和不当出版行为。2025年最新名单聚焦两大问题:一是引用操纵、论文工厂等破坏科研生态的行为;二是中国作者占比过高或APC费用不合理,影响学术成果国际化传播。自2022年起,预警名单调整至年初发布,便于科研人员规划投稿。名单结合定量数据与专家评估,动态反映期刊风险。被列预警期刊可能影响职称评审及科研经费认可,建议优先选择中科院分区表推荐期刊,警惕快速代发陷阱,并关注期刊官网声明。未来,强化学术自律和技术工具应用将助力科研规范化,推动中国学术走向全球。
526 0
|
小程序
Taro@3.x+Vue@3.x+TS开发微信小程序,根据系统主题展示不同样式(darkMode)
本文介绍如何在Taro项目中配置深色模式。通过在`src/app.config.ts`设置`darkmode`选项和在`theme.json`中定义主题变量,可以实现跟随系统主题的界面风格切换。
369 0
Taro@3.x+Vue@3.x+TS开发微信小程序,根据系统主题展示不同样式(darkMode)
|
JavaScript IDE 开发工具
在vue项目中禁用eslint
这篇文章提供了多种方法来禁用Vue项目中的ESLint校验,包括修改配置文件和IDE设置,以适应不同版本的Vue项目和开发者的需求。
在vue项目中禁用eslint
|
Go 数据库 数据安全/隐私保护
Navicat 16.2安装和试用教程详解
Navicat 16.2安装和试用教程详解
427 0