【问题标题】:Python 3's shortest quine. I don't get itPython 3 最短的 quine。我不明白
【发布时间】:2019-08-21 03:33:33
【问题描述】:
_='_=%r;print (_%%_) ';print (_%_)

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

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

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

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

谢谢。

【问题讨论】:

  • 不认真:最短的 quine 应该是一个空文本文件。
  • 怎么不是 quine?它是一个打印自己的源代码的程序。
  • @DanD.:运行它。将输出与源代码进行比较。不匹配。
  • 正确的quine是_='_=%r;print (_%%_) ';print (_%_)
  • @user2357112 朋友,亲爱的朋友,无论如何我都不是专家。我知道字符串文字是如何工作的,但我从未见过这种压缩的东西(因为大多数人都想要可读性(参见 PEP 8))。我只是对它的工作原理感到困惑,我仍在学习。

标签: python explain quine


【解决方案1】:

正如 cmets 中所指出的,正确的 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。

【讨论】:

    猜你喜欢
    • 2019-01-15
    • 1970-01-01
    • 2017-10-23
    • 2016-01-09
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    相关资源
    最近更新 更多