_='_=%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()
函数将对象转换为表示。
现在想象你想打印一个%
;像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。