Разница между функциями и не-функциями? - PullRequest
0 голосов
/ 21 октября 2018

Мне трудно понять, почему я получаю два разных вывода, когда запускаю эти два разных экземпляра кода.Насколько я могу сказать, нет никакой разницы.В настоящее время я изучаю обоснование текста, поэтому я решил написать что-нибудь, чтобы сбалансировать текст в центре.С тех пор я узнал о str.center(), но мне все еще интересно узнать разницу между этими двумя ячейками ниже.

Вход для каждого - input(Juice).

def orangeJuice():
    x = input()
    n = len(x)
    x.rjust(2*n, '$').ljust(3*n, '$')

orangeJuice()

-> Сок

x = input()
n = len(x)
x.rjust(2*n, '$').ljust(3*n, '$')

-> $$$$$ Сок $$$$$

Скриншот моего ноутбука Jupyter

Кроме того, я рад принять советы по улучшению моих вопросов, спасибо.

Крис

1 Ответ

0 голосов
/ 21 октября 2018

Разница между ними заключается в том, как обрабатывается строка 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-последовательности вместо специальных символов в выходных данных, дляэкземпляр).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...