LINUX.ORG.RU

[Python] Куайн

 


0

1

На википедии наткнулся на куайны написанные на python и честно говоря не совсем понимаю как это работает (опыт python'а пока маловат), может кто пояснить? Буду крайне благодарен.

куайн №1

print (lambda s:s+`s`+')')("print (lambda s:s+`s`+')')(")
куайн №2
_='_=%r;print _%%_';print _%_


print (lambda s:s+`s`+')')("print (lambda s:s+`s`+')')(")

Строка «print (lambda s:s+`s`+')')(» передается в анонимную функцию (которая определена лямбдой), получается выражение:

"print (lambda s:s+`s`+')')(" +"print (lambda s:s+`s`+')')("  + ')'

Во втором квайне все просто, переменной _ присваивается строка с форматирующим символом %r, а %% при форматировании превращаются в % получается:

print '_=%r;print _%%_' % '_=%r;print _%%_'
provaton ★★★★★
()
Ответ на: комментарий от provaton

Спасибо, разобрался, остался только не понятен один момент

а %% при форматировании превращаются в %

Это как-то объясняется или просто принимаешь как есть?

Gr1N
() автор топика
Ответ на: комментарий от Gr1N

> Это как-то объясняется или просто принимаешь как есть?

В форматирующих строках % - это спецсимвол, поэтому для вставки обычного процента нужно использовать своего рода экранирование. Целесообразность можно узреть из следующего примера:

In [11]: print '%%s - %s' % 5
%s - 5

In [12]: print '%s - %s' % 5
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/home/nss/niceniche/RequestDesk/<ipython-input-12-047846ddb10c> in <module>()
----> 1 print '%s - %s' % 5

TypeError: not enough arguments for format string
provaton ★★★★★
()

Мне вот это понравилось:

pevzi@pevzi-laptop:~/scripts$ cat fail.py 
  File "fail.py", line 1
    File "fail.py", line 1
    ^
IndentationError: unexpected indent
pevzi@pevzi-laptop:~/scripts$ python2 fail.py 
  File "fail.py", line 1
    File "fail.py", line 1
    ^
IndentationError: unexpected indent
pevzi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.