问题描述
使用python 2.7。
(在顶部编辑,以防你错过了底部的东西:我一直在用exec()执行代码,这使它成为源代码的一部分。有关我的用法的更多信息在这篇文章的底部)
最近,我对quines感兴趣。 到目前为止,我最接近quine的尝试是:
_="print '_={0}'.format(_)"
不幸的是,这打印出来了
_=print '_={0}'.format(_)
而不是这个
_="print '_={0}'.format(_)"
这是一个主要问题,因为执行
_=print '_={0}'.format(_)
将导致错误,并且与原始源代码不同。
我一直在努力在那里得到那些引号。 我试过的一种方法是使用转义来执行此操作:
_="print '_=\"{0}\"'.format(_)"
并打印出这个:
_="print '_="{0}"'.format(_)"
并且该代码将再次打印
_=print '_={0}'.format(_)
那是不一样的错误。 有没有人知道我可以进行修改?
而且,当我写这篇文章时,我意识到了其他一些东西。 我一直用exec()执行代码,而这个quine只能用exec()运行,这使得exec()成为代码的一部分,所以也需要添加。 所以,现在添加exec()的另一个尝试:
_=print '_={0}'.format(_); exec(_)
但这会产生一个可怕的循环,仍然缺少引号
>>>> _="print '_={0}'.format(_); exec(_)"; exec(_)
_=print '_={0}'.format(_); exec(_)
_=print '_={0}'.format(_); exec(_)
_=print '_={0}'.format(_); exec(_)
_=print '_={0}'.format(_); exec(_)
_=print '_={0}'.format(_); exec(_)
_=print '_={0}'.format(_); exec(_)
[etc]
所以,现在我需要在没有丑陋循环的情况下获得exec()并在正确的位置获得引号。
所以现在,这让我再次重复自己:有没有人知道我可以进行修改?
1楼
一个quine只需要输出它自己的源代码而不接收任何输入。 并不要求它还必须包含执行自身所需的代码。
在python中,您可以通过在交互式会话中输入并检查输出行是否与输入行完全匹配来测试quine:
>>> _ = '_ = {!r}; print(_.format(_))'; print(_.format(_))
_ = '_ = {!r}; print(_.format(_))'; print(_.format(_))
此示例通过使用参数的repr进行format
来解决引用问题。