python打印⾃⼰代码_如何编写⼀个打印⾃⾝源代码的程序⼀个程序,在没有任何外部输⼊的情况下,打印⾃⾝的源代码,这类程序在英⽂⾥有⼀个专门的称呼,叫做Quine,之所以叫这个名字,是为了纪念美国哲学家及逻辑学家Willard Van Orman Quine。
问题分析
⾸先要搞清楚问题的约束条件,即程序不能有任何的外部输⼊,否则可以通过把⽂件路径传⼊程序来获取源⽂件再打印出来,这种情况被看作是作弊。
我们以Python2作为⽰例语⾔。我们知道
关键字能够将内容输出到控制台:它实际上是⼀个函数,接受⼀个⼊参,并把它打印到控制台。但是我们的程序是没有输⼊的,因此,最
最简单直观的思路,我们的程序(假设为
)⾄少应该包含两个语句(假设为
),即:
:=
他们分别有如下职责:
: 定义 (或者说在程序没有输⼊的情况下要为print函数创造输⼊)
(或者说在程序没有输⼊的情况下要为print函数创造输⼊)
: ⾸先要打印的源代码,其次要把⾃⾝的源代码打印出来
⽤中⽂来说,可以是:
把以下的话抄⼀遍后再抄在引号⾥“把以下的话抄⼀遍后再抄在引号⾥”
基本上编写⼀个Quine的精髓就在上⾯这段话⾥。
在Python中有⼀个
,它的意思就是调⽤对象的
⽅法后替换本⾝在字符串中的位置,对于字符串对象,会保留其本⾝的引号(这点在我们实现Quine的时候会减少很多⿇烦)。我们可以借助
它实现⼀个最简单的Quine:
s = 's =%r\nprint s%%s'
print s % s
程序第⼀⾏我们定义了⼀个变量
,在第⼆⾏我们⾸先将
python新手代码图案如何保存的字⾯量传进
⽤于⽣成本程序的完整代码随即打印它。如果不借助
程序会复杂⼀些,但基本的思路是差不多的:
# -*- coding:utf-8 -*-
q = chr(39) # 定义单引号
n = chr(10) # 定义换⾏符
s = '# -*- coding:utf-8 -*-%sq = chr(39) # 定义单引号%sn = chr(10) # 定义换⾏符%ss =%s%s%s%sprint s%%(n, n, n, q, s, q, n)'
print s % (n, n, n, q, s, q, n)
如何使程序输出MD5等于⾃⾝源代码的MD5
这个其实和上⾯的问题是等价的,能够输出⾃⾝源代码,当然也能输出⾃⾝的MD5了:
import hashlib
m = hashlib.md5()
s = 'import hashlib\nm = hashlib.md5()\ns =%r\nm.update(s%%s)\nprint m.hexdigest()' m.update(s % s)
print m.hexdigest()
测试⼀下:
zhaoyuyu@FISHZHAO-MB0 demo % md5sum quine.py
0499c0b4e56111ba6587db5624f21345 quine.py
zhaoyuyu@FISHZHAO-MB0 demo % python quine.py
0499c0b4e56111ba6587db5624f21345
完美!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论