_='_=%r;print (_%%_) ';print (_%_)
(编辑:我已收到您的输入并修复了代码,感谢您的更正。)
这是你可以用 Python 编写的最短的 quine(有人告诉我)。一个 quine 是返回自身的代码。
有人可以像我对 Python 一无所知一样向我解释这行代码吗?顺便说一句,我使用 Python 3.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()
函数将对象转换为表示形式。
现在假设您也想打印 a %
;一个字符串,例如GNU is Not Unix %
. 如果您尝试以下操作,
>>> print('%s is Not Unix %'%name)
你最终会得到 a ValueError
,所以你必须%
用另一个来逃避%
:
>>> print('%s is Not Unix %%'%name)
GNU is Not Unix %
回到原始代码,当您使用%r 时_%_
,您实际上是_='_=%r;print (_%%_)
用自身替换 %r 并且%%
会导致 a%
因为第一个被视为转义字符,最后您正在打印整个结果,所以您最终会和:
_='_=%r;print (_%%_) ';print (_%_)
这是最初生产它的确切复制品,即quine。