Python: Вызов функции — выражение
Посмотрите на код одного из предыдущих уроков:
distance = calculate_distance('Lannisport', 'Bayasabhad')
Что можно сказать о нём? Какие выводы сделать? Попробуйте закончить эти утверждения самостоятельно:
distance
— это __________- функция
calculate_distance()
вызывается с ___________'Lannisport'
и'Bayasabhad'
- функция
calculate_distance()
возвращает значение, тип которого — это _____. - после выполнения кода в переменной
distance
окажется ________, возвращенное вызовом функцииcalculate_distance()
Чтобы понять этот урок, нужно вспомнить понятие «выражение» из модуля про переменные. Напомним, что выражение — это код, который при выполнении программы превращается в значение.
Какие из этих фрагментов кода являются выражениями?
42
10 * 45
"Kings" + "road"
calculate_distance('Lannisport', 'Bayasabhad')
Числа и математические операции — наверное, самые простые варианты. Выражение 42
превратится в значение 42
, выражение 10 * 45
— в значение 450
.
Конкатенация строк — тоже выражение, которое превратится в соответствующее значение (новую строку).
Но вот четвёртый вариант! Это тоже выражение! Мощность и гибкость языка программирования во многом возможна благодаря тому, что вызов функции — это выражение.
Вернемся к первому примеру:
distance = calculate_distance('Lannisport', 'Bayasabhad')
В переменную distance
записывается результат вычисления выражения. В отличие от операций (например, 10 + 12
), где явно видно, какое вычисление производится, в функциях само вычисление скрыто от нас, и мы видим только результат. Поэтому говорят, что функция «возвращает» значение. Можно применить эту терминологию и к обычным операциям. Например, сказать, что конкатенация двух строк возвращает новую строку.
Что является выражением, а что нет? Сейчас может казаться, что это одна из скучных деталей из учебника по программированию. Но это действительно важный вопрос. Всё, что работает как выражение, может быть использовано в других выражениях, а также во всех местах, где на вход ожидаются выражения. Распознавать выражения в коде — важный навык, необходимый программисту каждый день.
Допустим, у нас есть функция number_of_knights()
, которая принимает название замка в королевстве и возвращает количество рыцарей в этом замке. Зная, что вызов функции — выражение, можно допустить, что такой код будет работать:
result = 4 + number_of_knights("Winterfell")
Потому что это сложение двух выражений: выражения 4
и выражения number_of_knights("Winterfell")
. В итоге получится 4 + какое-то число.
Значит, и такой код будет работать:
result = number_of_knights("Winterfell") + number_of_knights("Oldtown")
Здесь два разных вызова функций, но каждый вызов — выражение, поэтому в итоге получится сложение двух значений — двух чисел (количества рыцарей замка Winterfell и количества рыцарей замка Oldtown).
Задание
Арья собирается в путешествие из Винтерфела в Орлиное гнездо, чтобы навестить Лизу Аррен, но по пути ей нужно заехать к Фреям для совершения акта возмездия. Ей нужно рассчитать общую длину маршрута.
К сожалению, функция calculate_distance()
может вычислять расстояние только между двумя точками. Поэтому придется сначала узнать расстояние от Винтерфелла до замка Фреев, а потом расстояние до Орлиного гнезда.
Названия замков на английском языке:
- Винтерфелл —
Winterfell
. - Близнецы (Замок Фреев) —
The Twins
. - Орлиное гнездо —
The Eyrie
.
Выведите на экран полную длину маршрута Арьи. Напомним, что функция calculate_distance()
принимает два аргумента и возвращает число.