Python中的Quine

2025年3月5日 | 阅读 3 分钟

引言

Quine 是一种不接受任何输入但能生成自身代码副本的应用程序。我们已经在 C 语言中讨论过 quine。在 Python 中,只需一行代码即可写出最短的 quine!Quine 是一个自我复制的程序,它会打印自己的源代码。在 Python 中,通过打印程序的源文件来实现。

在 Python3.x 的情况下

说明

上面的代码是使用字符串格式化的典型示例。首先,定义一个名为 _ 的变量,并将其赋值为 '_=%r; print _%%_'。其次,打印 _%_。在这种情况下,我们使用 _ 作为字符串格式化输入来显示 _。_ 中的 %r 接收 _ 的值。甚至 %s 也可以代替 %r 使用。为了转义 %,我们在 '_=%r;print _%%_' 中使用了双 %。但是,你可能会争辩说下面的代码是最小的,对吧?

应该注意的是,虽然它是能够打印其源代码的最小 Python 程序,但它不是 quine,因为 quine 不应该能够通过 open() 方法发布其源代码。

使用 %s 而不是 %r 的一个小插曲

使用 %s(它负责字符串格式化)代替 %r 是在 Python 中编写 quine 的另一种方法。

说明

  • 变量的字符串形式用于代替 %s。
  • repr(_) 确保字符串以正确的引号打印。

Quine 的变量名更易读

这是一个更易读的 quine 的示例,它不使用 _ 变量。

输出

 
quine_code='quine_code=%r;print(quine_code%%quine_code)';print(quine_code%quine_code)

说明

通过使用 %r 来包含其自身的字符串表示形式,此 quine 中的变量 quine_code 作为字符串包含完整的源代码。通过将 quine_code 的字符串内容替换为 print(quine_code%%quine_code) 命令中的 %r 来生成存储的代码。当程序运行时,这使其能够自我复制。

示例 2

输出

 
s = 's = %r\nprint(s %% s)'
print(s % s)

说明

在此 quine 中,代码本身以字符串形式存储在变量 s 中:'s = %r\nprint(s %% s)'。n 开始一个新行,%r 准备文本以包含其自身的表示。当 print(s % s) 指令通过将 %r 替换为字符串 s 来显示整个源代码后,程序就变得自我复制了。

示例 3

输出

 
code = 'code = %r\nprint(code %% code)'
print(code % code)

说明

为了用引号表示字符串,此 quine 将完整的源代码存储在变量 code 中,该变量包含格式说明符 %r。print(code %% code) 命令将自身插入格式字符串以输出 code 的值。因此,该应用程序会生成其自身代码的相同副本。

结论

编写 quine 是一项有趣的挑战,可以评估一个人对基本编程概念、递归和字符串操作的掌握程度。Python 中的过程展示了该语言的表达能力和优雅的字符串处理能力。Quine 是有趣的谜题,同时也是计算自我参照能力的引人入胜的说明,将更深刻的哲学问题与系统和自我复制联系起来。