Я ожидаю, что b будет доступен после вызова функции, так как я вернул его
Фундаментальное недоразумение: вы не возвращаете переменную, вы возвращаете значение. Переменные - это метки (имена) для значений. Внутри функции у вас есть имя b
для значения "foo"
. Это имя используется для ссылки на значение, чтобы вы могли его вернуть.
Снаружи, чтобы использовать это значение, вы должны что-то с ним сделать. Вызов функции - func_1()
- является заменой, в каком бы выражении оно ни содержалось, для возвращаемого значения. Таким образом, строка кода, подобная func_1()
, сама по себе ничего не делает видимой: у вас есть выражение, которое оценивается как "foo"
, но тогда ничего не делается с "foo"
.
Вы можете, например, print(func_1())
отобразить строку. Вы можете присвоить возвращаемое значение другой переменной: c = func_1()
. Теперь c
- это имя для возвращенного значения "foo"
. Вы можете использовать вызов функции как часть большего выражения: c = func_1() + "bar"
- теперь c
- это имя для строки "foobar"
, созданной путем объединения строки, возвращаемой из функции, с непосредственно указанной.
С другой стороны: чтобы получить информацию в функции, вы должны передать ее в качестве параметра. Это значения, которые заключаются в круглые скобки: когда вы пишете функцию, вы помещаете имена аргументов (переменные другого типа) в круглые скобки, а когда вы вызываете функцию, вы помещаете параметры, с которыми вы вызываете функцию (выражения которые предоставляют значения). Теперь внутри функции при каждом вызове аргументы будут ссылаться на значения параметров.
Давайте рассмотрим простой пример. Мы сделаем функцию, которая добавляет "bar" к входной строке, и вызовем ее несколько раз.
def add_bar(to):
return to + "bar"
Обратите внимание, как мы можем вернуть любое выражение. Когда функция вызывается, выражение вычисляется, соединяя переданную строку аргумента to
с константой "bar"
, и полученное значение возвращается. Здесь нет переменной, представляющей все возвращаемое значение, потому что мы снова возвращаем значение, а не переменную.
Теперь мы можем назвать это. Опять же, параметром может быть любое выражение - так что константа:
add_bar("foo")
или переменная, которой мы ранее присвоили значение:
my_string = "sand"
add_bar(my_string)
или что-то более сложное, может быть, даже с использованием другого вызова функции:
add_bar(add_bar("bar ") + " ")
Но опять же, ни один из них на самом деле ничего не сделает, кроме как произвести строку и затем выбросить ее. Итак, давайте исправим это:
print("I want a " + add_bar("chocolate") + ".")