Python 3 最短的 quine。我不明白

End*_*ble 0 python quine explain

_='_=%r;print (_%%_) ';print (_%_)
Run Code Online (Sandbox Code Playgroud)

(编辑:我已收到您的输入并修复了代码,感谢您的更正。)

这是您可以用 Python 编写的最短的 quine(有人告诉我)。一个返回自身的代码。

有人可以像我对 Python 一无所知一样向我解释这行代码吗?顺便说一下,我使用 Python 3.x。

我正在寻找的是对正在发生的事情的逐字解释。

谢谢。

Ame*_*men 5

正如评论中指出的那样,正确的 quine 是_='_=%r;print (_%%_) ';print (_%_),使用它,让我们开始:

;一行中的命令执行,因此如下:

_='_=%r;print (_%%_) ';print (_%_)
Run Code Online (Sandbox Code Playgroud)

相当于:

_='_=%r;print (_%%_) '
print (_%_)
Run Code Online (Sandbox Code Playgroud)

在第一行中,_是一个有效的变量名,它被分配了字符串'_=%r;print (_%%_) '

使用 python 的字符串格式,我们可以以 printf 的方式将变量注入字符串:

>>> name = 'GNU'
>>> print('%s is Not Unix'%name)

GNU is Not Unix

>>> print('%r is Not Unix'%name)

'GNU' is Not Unix
Run Code Online (Sandbox Code Playgroud)

%s使用字符串,%r使用任何对象并通过repr()函数将对象转换为表示。

现在想象你也想打印一个%;一个字符串,例如GNU is Not Unix %. 如果您尝试以下操作,

>>> print('%s is Not Unix %'%name)
Run Code Online (Sandbox Code Playgroud)

你最终会得到一个ValueError,所以你必须%用另一个来逃避%

>>> print('%s is Not Unix %%'%name)

GNU is Not Unix %
Run Code Online (Sandbox Code Playgroud)

回到原始代码,当您使用 时_%_,您实际上是将 %r 替换为_='_=%r;print (_%%_)with 本身,并且%%将导致 a%因为第一个被视为转义字符,最后您打印了整个结果,所以您最终会和:

_='_=%r;print (_%%_) ';print (_%_)
Run Code Online (Sandbox Code Playgroud)

这是最初生产它的精确复制品,即蒺藜。