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。
_='_=%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。