На этом шаге мы рассмотрим особенности размещения функций.
Все инструкции в программе выполняются последовательно сверху вниз. Это означает, что, прежде чем использовать в программе идентификатор, его необходимо предварительно определить, присвоив ему значение. Поэтому определение функции должно быть расположено перед вызовом функции.
Правильно:
def summa(x, y): return x + y v = summa(10, 20) # Вызываем после определения. Все нормально
Неправильно:
v = summa(10, 20) # Идентификатор еще не определен. Это ошибка!!! def summa(x, y): return x + y
В последнем случае будет выведено сообщение об ошибке: NameError: name 'summa' is not defined. Чтобы избежать ошибки, определение функции размещают в самом начале программы после подключения модулей или в отдельном модуле.
С помощью оператора ветвления if можно изменить порядок выполнения программы - например, разместить внутри условия несколько определений функций с одинаковым названием, но разной реализацией:
# -*- coding: utf-8 -*- n = input("Введите 1 для вызова первой функции: ") if n == "1": def echo(): print("Вы ввели число 1") else: def echo(): print("Альтернативная функция") echo() # Вызываем функцию input()
При вводе числа 1 мы получим сообщение "Вы ввели число 1", в противном случае - "Альтернативная функция".
Помните, что инструкция def всего лишь присваивает ссылку на объект функции идентификатору, расположенному после ключевого слова def. Если определение одной функции встречается в программе несколько раз, то будет использоваться функция, которая была определена последней. Пример:
def echo(): print("Вы ввели число 1") def echo(): print("Альтернативная функция") echo() # Всегда выводит "Альтернативная функция"
На следующем шаге мы рассмотрим необязательные параметры и сопоставление по ключам.