请求逐字符解释Python 3最短Quine代码:_='_=%r;print (_%%_) ';print (_%_)
逐字符拆解Python最短Quine代码
没问题,我来给你把这段Python 3的Quine代码拆得明明白白,每个字符的作用都给你讲清楚!
首先先把这段神奇的代码贴出来:
_='_=%r;print (_%%_) ';print (_%_)
先拆分代码结构
这段代码其实是一行里的两个语句,用分号;隔开,咱分开来看:
第一部分:_='_=%r;print (_%%_) '
_:这是Python里合法的变量名,用下划线纯粹是为了省字符(毕竟要做最短Quine嘛),用来存储后面的字符串模板。=:赋值运算符,把右边的字符串内容存到_这个变量里。'_=%r;print (_%%_) ':这是核心的字符串模板,里面的每个部分都有讲究:_=%r:%r是Python的格式化符号,作用是把传入的参数转换成repr格式的字符串——简单说就是给字符串加上引号,让它能直接作为合法的Python代码片段。;:Python里用来在一行里分隔多个语句,这样就能把赋值和打印写在一行,减少字符数。print (_%%_):这里的%%是转义写法!因为在格式化字符串里,单个%是格式化标记,要输出一个真正的%字符,必须写两个%%。所以这部分实际要输出的内容是print (_%_)(注意后面还有个空格,别漏了,这是保证代码完全一致的关键)。
第二部分:print (_%_)
print():Python的打印函数,负责把内容输出到控制台。_%_:这是字符串格式化操作,规则是[模板字符串] % [参数]。这里的模板就是变量_里存的字符串,参数也是_本身——相当于把模板自己代入模板里的%r位置。
完整执行流程,一步一步看
- 第一步执行赋值语句:
_变量被赋值为字符串'_=%r;print (_%%_) '。 - 第二步执行打印语句:
- 先处理
_%_:把_的内容(也就是那个模板字符串)代入模板的%r位置,%r会给这个模板字符串加上引号,变成'_=%r;print (_%%_) '。 - 同时模板里的
%%会自动转换成单个%,所以替换后得到的完整字符串就是:_='_=%r;print (_%%_) ';print (_%_)——和原代码完全一模一样! - 最后
print把这个字符串输出,就实现了Quine“输出自身”的效果。
- 先处理
几个关键细节补充
- 为什么用
%r而不是%s?因为%s只会把内容转换成普通字符串,不会加引号,这样生成的赋值语句会变成_=_=%r;print (_%%_),这显然不是合法的Python代码,会直接报错。而%r自动加的引号,让赋值语句完全合法。 - 最后那个空格不能丢!原代码里赋值字符串的末尾有个空格,替换后生成的代码末尾也会有这个空格,保证输出和原代码完全一致,差一个字符都不能叫合格的Quine。
内容的提问来源于stack exchange,提问作者Endvisible
相关产品推荐
相关产品推荐

