孔乙己:回字有四样写法 —— 回、囘、囬、口中目 (康熙字典)
如果有人问如何写一段 Python,其输出是它代码自身,额外的要求输出不能为空 (空代码输出也为空)
不能使用文件操作
不显式的 import 任何库
这里也给出四种写法(使用 Python3 作为示例)
第一种
quotation = chr(0x22)
newline = chr(0x0a)
s = "quotation = chr(0x22){0}newline = chr(0x0a){0}{0}s = {1}{2}{1}{0}s = s.format(newline, quotation, s){0}{0}print(s)"
s = s.format(newline, quotation, s)
print(s)
这种方式使用了 3 个字符串格式化占位符,其中 1 个用来表示字符串本身,另外 2 个使用 ascii 码来表示 换行 (0x0a),双引号(0x0a)。但是如果换行不是 '\n',这代码就要改改了,比如在 windows 平台换行是 '\r\n'
那么第一个问题 —— 为什么我们要使用 ascii 码,而不直接使用字面量 \n 和 "
第二种
quotation = chr(0x27) + chr(0x27) + chr(0x27)
s = '''quotation = chr(0x27) + chr(0x27) + chr(0x27)
s = {0}{1}{0}
s = s.format(quotation, s)
print(s)'''
s = s.format(quotation, s)
print(s)
这种方法使用 『三引号』 字符串的特性来避免使用 换行的 ascii 码,所以无论是什么平台,只要保持代码中所有换行一致即可
那么第二个问题 ——『三引号』的特性是什么?
第三种
quotation = "''""'"
s = '''quotation = "''""'"
s = {0}{1}{0}
s = s.format(quotation, s)
print(s)'''
s = s.format(quotation, s)
print(s)
这种方法把引号的 ascii 码也移除了
那么第三个问题 ——
"''""'"
是什么意思了,为什么要这样写
第四种
s = '''s = """{0}"""
s = s.replace('"', "'", 6).format(s)
print(s)'''
s = s.replace('"', "'", 6).format(s)
print(s)
这种方法只使用了一个字符串格式化的占位符,额外使用了一个 replace 命令
那么第四个问题 —— replace 第三个参数是什么意思,如果去掉了会发生什么事?
结语
实际上,输出自身的写法不止这四种,只要把握其中两点即可有个字符串看起来和 print 出来是一样的
这个字符串在满足第一点的前提下,可以通过一定方式转换为字符串以外的代码
有兴趣可以想想还有什么其他写法,^*^