Справочник по Python · модуль 6 · функции и модули
Глава 6.3
Практическое
применение def
От короткой функции без параметров до небольшой программы, в которой несколько функций делят работу между собой.
- Категория
- Практика функций
- Уровень
- Начальный
- Связанные темы
- def, return, условия, input()
- Зачем это знать
- Собирать программу из небольших понятных действий
§1Как работать с примерами
В каждом примере сначала определена задача функции, затем показан её вызов. Не ограничивайтесь чтением: изменяйте аргументы и заранее предполагайте результат.
- Назовите одно действие, которое должна выполнять функция.
- Определите, какие данные ей нужны в параметрах.
- Решите, должна ли она вывести сообщение или вернуть значение.
- Вызовите функцию с несколькими аргументами и проверьте результат.
§2Функция без параметров
Задача: создать функцию, которая выводит приглашение к работе.
def welcome(): print("Добро пожаловать в Python!") welcome()
Добро пожаловать в Python!
Параметров нет, поэтому скобки в объявлении и вызове остаются пустыми.
§3Функция с параметром
Задача: принимать имя и составлять приветствие. Один код работает для разных людей.
def greet(name): print("Привет,", name) greet("Алексей") greet("Мария")
Привет, Алексей Привет, Мария
§4Возвращаем результат
Задача: вычислять квадрат числа. Здесь полезнее return, потому что результат может понадобиться в другом вычислении.
def square(number): return number * number print(square(5)) print(square(8))
25 64
§5Условие внутри функции
Функция может принимать решение и возвращать логический результат.
def is_even(number): return number % 2 == 0 print(is_even(10)) print(is_even(7))
True False
Для выбора одного из двух результатов можно использовать обычное ветвление.
def max_number(a, b): if a > b: return a else: return b print(max_number(10, 5)) print(max_number(3, 9))
10 9
§6Функция вызывает функцию
Задача: сложить квадраты двух чисел. Уже готовую функцию square() можно использовать внутри новой функции.
def square(number): return number * number def sum_of_squares(a, b): return square(a) + square(b) print(sum_of_squares(3, 4))
25
sum_of_squares() отвечает за общую задачу, а square() — за одно небольшое вычисление.
§7Вложенная функция
Функцию можно объявить внутри другой функции. Внутренняя функция служит помощником и вызывается из тела внешней.
def outer(): def inner(): print("Это внутренняя функция") inner() outer()
Это внутренняя функция
Вызов outer() создаёт внутреннюю функцию, а затем строка inner() запускает её.
def rectangle_area(width, height): def multiply(a, b): return a * b return multiply(width, height) print(rectangle_area(5, 3))
15
multiply() создаётся во время вызова rectangle_area() и предназначена для использования внутри неё. На начальном этапе применяйте вложенные функции только тогда, когда внутренний помощник не нужен остальной программе.
§8Несколько функций в программе
Небольшую задачу можно разделить на отдельные вычисления, а затем собрать их в управляющей функции.
def square(number): return number * number def cube(number): return number * number * number def show_calculations(number): print("Квадрат:", square(number)) print("Куб:", cube(number)) show_calculations(3)
Квадрат: 9 Куб: 27
§9Анализ числа
Несколько маленьких функций делают каждый шаг заметным. Сначала объединим проверку чётности, абсолютное значение и квадрат.
def analyze_number(number): def is_even(value): return value % 2 == 0 def square(value): return value * value print("Чётное:", is_even(number)) print("Абсолютное значение:", abs(number)) print("Квадрат:", square(number)) analyze_number(-4)
Чётное: True Абсолютное значение: 4 Квадрат: 16
Во втором варианте разберём положительное целое число на последнюю цифру и оставшуюся часть.
def last_digit(number): return number % 10 def remove_last_digit(number): return number // 10 def analyze_number(number): print("Последняя цифра:", last_digit(number)) print("Без последней цифры:", remove_last_digit(number)) analyze_number(12345)
Последняя цифра: 5 Без последней цифры: 1234
Для отрицательных чисел правила % и // требуют отдельного внимания. Этот пример рассчитан на положительное целое число.
§10Функция-меню
В небольшой программе одна функция может получать данные, а отдельные функции — выполнять вычисления.
def add(a, b): return a + b def multiply(a, b): return a * b def calculator(): first = int(input("Введите первое число: ")) second = int(input("Введите второе число: ")) print("Сумма:", add(first, second)) print("Произведение:", multiply(first, second)) calculator()
calculator() управляет сценарием, а add() и multiply() отвечают только за свои вычисления.
§11Частые ошибки
| Что написано | Что произойдёт | Как правильно |
|---|---|---|
| одна функция одновременно вводит данные, считает и печатает много разных результатов | её трудно проверять и переиспользовать | разделить большую задачу на небольшие функции |
return забыли | при попытке сохранить результат получится None | вернуть вычисленное значение |
| функция вызывает саму себя без условия остановки | RecursionError | вызвать нужную функцию или добавить условие завершения |
| внутреннюю функцию вызывают снаружи | NameError: такое имя там недоступно | вызывать помощника внутри внешней функции |
| имя функции не объясняет действие | назначение вызова трудно понять | использовать имена вроде calculate_area или is_even |
§12Проверьте себя
Почему is_even() возвращает True или False?
Выражение number % 2 == 0 является сравнением и само даёт логический результат.
Зачем sum_of_squares() вызывает square() дважды?
Чтобы не повторять формулу квадрата: каждый вызов вычисляет квадрат одного аргумента.
Когда уместна вложенная функция?
Когда небольшой помощник нужен только одной внешней функции и не должен использоваться в остальных частях программы.
§13Шпаргалка
def is_even(n): return n % 2 == 0return square(a) + square(b)def outer(): def inner():ввод → вычисление → выводИтог главы
Функция может получать параметры, возвращать значение, содержать условие и вызывать другие функции. Чем точнее одна функция отвечает за одну задачу, тем легче читать, проверять и переиспользовать программу.