Python 3 最短的 quine。我不明白

Python 3's shortest quine. I don't get it

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

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

这是您可以在 Python 中写的最短的 quine(有人告诉我)。 quine 是 returns 本身的代码。

谁能给我解释一下这行代码,好像我对Python一无所知一样?我顺便用Python3.x

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

谢谢。

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

;在一行中执行命令,所以如下:

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

相当于:

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

在第一行中,_ 是一个有效的变量名,它被分配了字符串 '_=%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

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

现在假设您还想打印一个 %;一个字符串,例如 GNU is Not Unix %。如果您尝试以下操作,

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

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

来转义 %
>>> print('%s is Not Unix %%'%name)

GNU is Not Unix %

回到原来的代码,当你使用 _%_ 时,你实际上是用它自己替换了 _='_=%r;print (_%%_) 中的 %r 而 %% 会导致 % 因为第一个被视为转义字符,最后你打印了整个结果,所以你最终会得到:

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

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