Endvisible
Endvisible

Reputation: 89

Python 3's shortest quine. I don't get it

_='_=%r;print (_%%_) ';print (_%_)

(Edit: I have recieved your input and fixed the code, thanks for the correction.)

This is the shortest quine you can write in Python (I'm told). A quine being code that returns itself.

Can someone explain this line of code to me as if I know nothing about Python? I use Python 3.x by the way.

What I'm looking for is a character-by-character explanation of what's going on.

Thanks.

Upvotes: 4

Views: 1253

Answers (1)

Amen
Amen

Reputation: 1633

As pointed out in the comments, the correct quine is _='_=%r;print (_%%_) ';print (_%_). Using this, let's begin:

The ; executes two commands in a line, so the following:

_='_=%r;print (_%%_) ';print (_%_)

is equivalent to:

_='_=%r;print (_%%_) '
print (_%_)

In the first line, _ is a valid variable name which is assigned the string '_=%r;print (_%%_) '

Using python's string formatting, we can inject variable into strings in a printf fashion:

>>> name = 'GNU'
>>> print('%s is Not Unix'%name)

GNU is Not Unix

>>> print('%r is Not Unix'%name)

'GNU' is Not Unix

%s uses a string, %r uses any object and converts the object to a representation through the repr() function.

Now imagine you want to print a % as well; a string such as GNU is Not Unix %. If you try the following,

>>> print('%s is Not Unix %'%name)

You will end up with a ValueError, so you would have to escape the % with another %:

>>> print('%s is Not Unix %%'%name)

GNU is Not Unix %

Back to the original code, when you use _%_, you are actually substituting the %r in the _='_=%r;print (_%%_) with itself (again, treat _ as a var) and the %% would result in a % because the first one is treated as escape character and finally you are printing the whole result, so you would end up with:

_='_=%r;print (_%%_) ';print (_%_)

which is the exact replica of what produced it in the first place i.e. a quine.

Upvotes: 7

Related Questions