Разница между ними заключается в том, как обрабатывается строка x.rjust(2*n, '$').ljust(3*n, '$')
.
Эта строка является выражением-выражением.То есть он имеет возвращаемое значение, как и любое другое выражение.Когда вы выполняете выражение выражения большую часть времени, возвращаемое значение отбрасывается.В любом случае, это может стоить сделать из-за его побочных эффектов, но обычно вы не используете оператор выражения для его возвращаемого значения.
При запуске на верхнем уровне сеанса интерактивного интерпретатора выражение выражения получаетобрабатываются по-разному.Вместо игнорируемого возвращаемого значения оно обрабатывается частью «P» REPL (цикл чтения-Eval-Print).Такой цикл является общим для интерактивных переводчиков многих языков (конкретное имя происходит от LISP, насколько я понимаю).В Python цикл работает, выполняя каждый оператор по очереди.Он проверяет возвращаемое значение любых операторов выражений, и если это не None
, выводится repr
результата (другие типы операторов никогда не имеют возвращаемых значений, поэтому они никогда ничего не печатают).
Вот почему x.rjust(2*n, '$').ljust(3*n, '$')
дает вывод, когда вы запускаете его на верхнем уровне интерактивного сеанса.Если вы запустите его как часть скрипта, он будет вести себя как версия, которая была в функции, и значение будет отброшено без уведомления.
Лучшим способом обработки этой ситуации может быть явное print
любой выход вы хотите.Это может работать в любом контексте, а не только в интерактивном сеансе.Если вы сделаете print(x.rjust(2*n, '$').ljust(3*n, '$'))
, это будет просто работать.Обратите внимание, что print
вызывает str
в своих аргументах, а не repr
, поэтому выходные данные не будут точно такими же (вы не получите кавычки или escape-последовательности вместо специальных символов в выходных данных, дляэкземпляр).