Модуль 6 · Функции и модули

Справочник по Python · модуль 6 · функции и модули

Глава 6.3

6.3

Практическое
применение def

От короткой функции без параметров до небольшой программы, в которой несколько функций делят работу между собой.

Категория
Практика функций
Уровень
Начальный
Связанные темы
def, return, условия, input()
Зачем это знать
Собирать программу из небольших понятных действий

§1Как работать с примерами

В каждом примере сначала определена задача функции, затем показан её вызов. Не ограничивайтесь чтением: изменяйте аргументы и заранее предполагайте результат.

  1. Назовите одно действие, которое должна выполнять функция.
  2. Определите, какие данные ей нужны в параметрах.
  3. Решите, должна ли она вывести сообщение или вернуть значение.
  4. Вызовите функцию с несколькими аргументами и проверьте результат.

§2Функция без параметров

Задача: создать функцию, которая выводит приглашение к работе.

main.pyготовое сообщение
def welcome():
    print("Добро пожаловать в Python!")


welcome()
Выводрезультат вызова
Добро пожаловать в Python!

Параметров нет, поэтому скобки в объявлении и вызове остаются пустыми.

§3Функция с параметром

Задача: принимать имя и составлять приветствие. Один код работает для разных людей.

main.pyзначение меняется при вызове
def greet(name):
    print("Привет,", name)


greet("Алексей")
greet("Мария")
Выводдва аргумента
Привет, Алексей
Привет, Мария

§4Возвращаем результат

Задача: вычислять квадрат числа. Здесь полезнее return, потому что результат может понадобиться в другом вычислении.

main.pyквадрат двух чисел
def square(number):
    return number * number


print(square(5))
print(square(8))
Выводдва результата
25
64

§5Условие внутри функции

Функция может принимать решение и возвращать логический результат.

main.pyпроверка чётности
def is_even(number):
    return number % 2 == 0


print(is_even(10))
print(is_even(7))
Выводлогические значения
True
False

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

main.pyбольшее из двух чисел
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() можно использовать внутри новой функции.

main.pyпереиспользование вычисления
def square(number):
    return number * number


def sum_of_squares(a, b):
    return square(a) + square(b)


print(sum_of_squares(3, 4))
Вывод9 + 16
25

sum_of_squares() отвечает за общую задачу, а square() — за одно небольшое вычисление.

§7Вложенная функция

Функцию можно объявить внутри другой функции. Внутренняя функция служит помощником и вызывается из тела внешней.

main.pyпростейшая вложенная функция
def outer():
    def inner():
        print("Это внутренняя функция")

    inner()


outer()
Выводinner() вызвана внутри outer()
Это внутренняя функция

Вызов outer() создаёт внутреннюю функцию, а затем строка inner() запускает её.

main.pyпомощник для площади
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Несколько функций в программе

Небольшую задачу можно разделить на отдельные вычисления, а затем собрать их в управляющей функции.

main.pyквадрат и куб
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)
Выводnumber = 3
Квадрат: 9
Куб: 27

§9Анализ числа

Несколько маленьких функций делают каждый шаг заметным. Сначала объединим проверку чётности, абсолютное значение и квадрат.

main.pyтри характеристики числа
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)
Выводnumber = -4
Чётное: True
Абсолютное значение: 4
Квадрат: 16

Во втором варианте разберём положительное целое число на последнюю цифру и оставшуюся часть.

main.pyпоследняя цифра и остаток числа
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)
Выводnumber = 12345
Последняя цифра: 5
Без последней цифры: 1234

Для отрицательных чисел правила % и // требуют отдельного внимания. Этот пример рассчитан на положительное целое число.

§10Функция-меню

В небольшой программе одна функция может получать данные, а отдельные функции — выполнять вычисления.

main.pyсумма и произведение
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 == 0
Вызов помощникаreturn square(a) + square(b)
Вложенный помощникdef outer(): def inner():
Разделение ролейввод → вычисление → вывод

Итог главы

Функция может получать параметры, возвращать значение, содержать условие и вызывать другие функции. Чем точнее одна функция отвечает за одну задачу, тем легче читать, проверять и переиспользовать программу.

Глава 6.3 · Практическое применение def · Справочник по Python Автор: Макаров Максим Николаевич