Перейти к содержанию
Educora
Средний9 класс25 мин36 / 59

Функция: def, параметры и return

Объявление и вызов функции, формальные и фактические параметры, локальные переменные, вызов одной функции из другой и вспомогательные функции для списков — с трассировкой заданий DİM.

Проверь себя
В этом уроке ты узнаешь
  • Писать функцию с def, вызывать её и объяснять разницу между return и print.
  • Различать формальные и фактические параметры и понимать, почему локальная переменная не меняет переменные основной программы.
  • Прослеживать порядок вызовов в программе, где одна функция вызывает другую, и находить результат.
  • Применять функции, возвращающие цифру, проверку на простоту или перевёрнутое число, к спискам и в условии while.

Вместо того чтобы писать одно и то же вычисление в пяти местах программы, его можно один раз оформить как функцию и вызвать пять раз. В заданиях DİM функции играют две роли: либо главного героя (одна функция вызывает другую, f(i) стоит в условии while), либо помощника, который находит цифру, проверяет простоту или переворачивает число и применяется к каждому элементу списка. В обоих случаях главный навык один: следить, какой вызов происходит и когда и какое значение возвращается.

Запись функции: def и return

Определение
Функция

Именованная группа команд, которая выполняется только при вызове. Объявляется строкой def имя(параметры):, тело записывается с отступом, а оператор return возвращает результат в место вызова.

Python
def square(n):
    return n * n

print(square(4))
print(square(3) + square(4))
x = square(square(2))
print(x)
▸ Ожидаемый результат
16
25
16
  • Строка def заканчивается двоеточием, тело сдвигается на одинаковый отступ.
  • Python читает блоки def и запоминает их, но не выполняет; программа начинается с первой строки без отступа после функций.
  • return сразу завершает функцию: строки после него не выполняются.
  • Функция без return возвращает None.
  • Вызов может стоять внутри выражения: square(3) + square(4), square(square(2)).
Python
def f1(n):
    print(n * 2)

def f2(n):
    return n * 2
    print('never')

a = f1(5)
b = f2(5)
print(a, b)
▸ Ожидаемый результат
10
None 10

Формальные и фактические параметры, локальные переменные

Определение
Формальный параметр

Имя в скобках строки def: m в записи def f(m):. При вызове ему присваивается значение фактического параметра.

Определение
Фактический параметр (аргумент)

Значение или выражение в скобках при вызове: a + 1 в вызове f(a + 1). Параметры передаются по порядку: первый фактический параметр попадает в первый формальный, независимо от имён.

Определение
Локальная переменная

Переменная, созданная внутри функции (формальные параметры тоже локальные). Она существует только во время вызова; одноимённая переменная основной программы — другая переменная, и функция её не меняет.

Python
def f(m):
    m = m * 2
    k = m + 1
    return k

m = 5
k = 100
print(f(m), m, k)

def zero_first(a):
    a[0] = 0

b = [7, 8, 9]
zero_first(b)
print(b)
▸ Ожидаемый результат
11 5 100
[0, 8, 9]

Внутри функции m и k локальные: m становится 10, k — 11, но m = 5 и k = 100 основной программы остаются нетронутыми. Со списком иначе: в функцию передаётся сам список, а не копия, поэтому a[0] = 0 меняет и b в основной программе. Коротко: если числовой параметр меняется внутри функции, снаружи ничего не меняется; если меняется элемент списка, изменение видно и снаружи.

Python
def f(a, b):
    a = a - b
    return a * 10 + b

a = 3
b = 7
print(f(b, a), a, b)
▸ Ожидаемый результат
43 3 7
Задание в стиле DİM (закрытое)

Определите результат программы выше.
A) 43 3 7
B) -33 3 7
C) 43 4 3
D) 43 7 3
E) -33 -4 7

Показать решение
Вызов f(b, a) = f(7, 3): по порядку формальный a = 7, формальный b = 3 — совпадение имён ничего не меняет.
Внутри функции: a = 7 − 3 = 4, return 4 · 10 + 3 → 43.
a и b основной программы не зависят от локальных переменных: остаются 3 и 7.
Ответ: A. B — ошибка тех, кто передаёт параметры по именам, C — тех, кто думает, что локальные переменные «просачиваются» наружу.

Одна функция вызывает другую: порядок вызовов

  1. 1
    Найди начало

    Пропусти блоки def и начни с первой строки основной программы.

  2. 2
    Запиши параметры

    При каждом вызове по порядку перенеси фактические значения в формальные параметры; одна строка таблицы: функция, параметры, локальные переменные.

  3. 3
    Изнутри наружу

    Если внутри функции есть другой вызов, приостанови текущую, полностью вычисли внутренний вызов и продолжай с возвращённым значением. В записи f(g(x)) сначала вычисляется g(x).

  4. 4
    Вернись

    После return вернись к месту вызова и замени вызов возвращённым значением.

  5. 5
    Посчитай

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

Python
def g(x):
    return x % 10 + x // 10

def f(n):
    p = g(n) * 3
    q = g(p) + g(n + 5)
    return p + q

print(f(47))
▸ Ожидаемый результат
46
ВызовВозвращаетВнутри f
g(47) = 7 + 411p = 11 · 3 = 33
g(33) = 3 + 36g(n + 5) ещё ждёт
g(52) = 2 + 57q = 6 + 7 = 13
f(47)46return 33 + 13
g вызывается три раза, f — один раз; n + 5 = 52 вычисляется до передачи в функцию.
Python
def g(k):
    k = k + 3
    return k * 2

def f(m):
    m = g(m) - m
    n = g(m) + m
    return n

a = 4
print(f(a) + a)
▸ Ожидаемый результат
40
Задание в стиле DİM (закрытое)

Определите результат программы выше.
A) 36 B) 40 C) 22 D) 34 E) 52

Показать решение
Основная программа: a = 4, вызывается f(4).
g(4): k = 7, возвращает 14 → m = 14 − 4 = 10 (локальная m изменилась).
g(10): k = 13, возвращает 26 → n = 26 + 10 = 36.
f(4) = 36, выводится 36 + 4 = 40 (B).
Ошибочные пути: A — забыть + a в конце; C — не учесть новое значение m: 14 + 4 + 4 = 22; D — взять во второй строке старое m = 4: 26 + 4 + 4 = 34; E — забыть - m в первой строке.

Вспомогательные функции: в списках и в условии цикла

Самые частые вспомогательные функции в программах DİM — маленькие алгоритмы: вернуть цифру (n // 10 % 10 — цифра десятков), проверить простоту подсчётом делителей, перевернуть число, найти сумму цифр. Они работают в трёх местах: для каждого элемента списка, как в a[i] = k(a[i]), в фильтре, как в if f(x) != 0: b.append(x), и в условии цикла, как в while f(i) < g(k):. Сами алгоритмы с цифрами разобраны в уроке «Действия над числами: цифры, делители и простые числа»; здесь мы «упаковываем» их в функции.

Python
def d(n):
    k = 0
    for i in range(1, n + 1):
        if n % i == 0:
            k = k + 1
    return k

a = [9, 11, 15, 2, 21, 29, 1]
for i in range(0, len(a)):
    if d(a[i]) != 2:
        a[i] = d(a[i])
print(a)
▸ Ожидаемый результат
[3, 11, 4, 2, 4, 29, 1]

d(n) возвращает количество делителей. У простых чисел ровно два делителя (1 и само число), поэтому 11, 2, 29 остаются, а 9, 15, 21 заменяются количеством своих делителей — 3, 4, 4. У 1 только один делитель: 1 — не простое число, и так как d(1) = 1, элемент остаётся равным 1.

Python
def rev(n):
    r = 0
    while n > 0:
        r = r * 10 + n % 10
        n = n // 10
    return r

def tens(n):
    return n // 10 % 10

for x in [123, 450, 707, 81]:
    print(x, rev(x), tens(x), x == rev(x))
▸ Ожидаемый результат
123 321 2 False
450 54 5 False
707 707 0 True
81 18 8 False
Задание в стиле DİM (с кодируемым ответом)

Определите число, которое выведет программа.
def t(n): return n // 10 % 10
def e(n): return n % 10
a = [352, 417, 626, 95, 1203]
b = []
for x in a: b.append(t(x) * e(x))
print(sum(b) + len(b))

Показать решение
t(n) возвращает цифру десятков, e(n) — цифру единиц. Произведение для каждого элемента:
352 → 5 · 2 = 10
417 → 1 · 7 = 7
626 → 2 · 6 = 12
95 → 9 · 5 = 45 (у двузначного числа цифра десятков — первая цифра)
1203 → 0 · 3 = 0 (цифра десятков равна 0)
b = [10, 7, 12, 45, 0], сумма 74, len(b) = 5.
Ответ: 74 + 5 = 79.
Задание в стиле DİM (закрытое)

Определите результат программы, если с клавиатуры введено −20.
def f(n): return n * n + 1
def g(n): return 3 * n - 4
k = abs(int(input()))
i = 0
while f(i) <= g(k): i = i + 2
print(i)
A) 6 B) 7 C) 8 D) 10 E) 4

Показать решение
k = |−20| = 20, g(20) = 3 · 20 − 4 = 56 — это значение не меняется в цикле.
i = 0: f(0) = 1 ≤ 56 → i = 2
i = 2: f(2) = 5 ≤ 56 → i = 4
i = 4: f(4) = 17 ≤ 56 → i = 6
i = 6: f(6) = 37 ≤ 56 → i = 8
i = 8: f(8) = 65 > 56 → цикл завершается
Ответ: C) 8. A — последнее значение, при котором условие выполнялось, но после него i ещё увеличивается.
ФункцияЧто возвращаетПример
abs(x)модуль числаabs(-7) → 7
len(s)количество символов в строке или элементов в спискеlen('python') → 6
min(...), max(...)наименьшее / наибольшее из нескольких чисел или элементов спискаmin(4, 9, 2) → 2, max([3, 8, 5]) → 8
str(n)превращает число в строкуlen(str(305)) → 3
int(x)превращает строку в число; отбрасывает дробную частьint('42') → 42, int(7.9) → 7
list(s)делает из строки список символовlist('abc') → ['a', 'b', 'c']
sum(a)сумма элементов спискаsum([2, 5, 1]) → 8
Задание

Напиши функцию digit_sum(n), которая возвращает сумму цифр натурального числа n. Затем выведи, каждое на отдельной строке, числа из списка a, сумма цифр которых делится на 3, а в конце — их количество.

Задание · Python
def digit_sum(n):
    s = 0
    # add the digits of n to s
    return s

a = [12, 45, 71, 303, 58, 999]
▸ Ожидаемый результат
12
45
303
999
4
Задание

Пусть функция is_prime(n) считает делители n и возвращает True, если их ровно 2. Выведи количество простых чисел в списке a, а затем наибольшее простое число.

Задание · Python
def is_prime(n):
    k = 0
    # count the divisors of n
    return k == 2

a = [15, 7, 22, 13, 1, 9, 31, 4]
▸ Ожидаемый результат
3
31

На этом «набор инструментов» модуля собран: переменные, условия, циклы, строки, списки и функции. В следующем уроке, «Написание программ: письменные задания», мы соединим их и будем писать письменные задания экзамена как полные программы. Обратные задачи вида while f(i) …, где по результату нужно найти входное значение, — в уроке «Анализ программы: от результата к входным данным», а дополнительные возможности, например параметры по умолчанию, — в уроке «Функции» курса Python.

Главное

  • Функция объявляется через def и работает только при вызове; результат возвращает return, без него — None.
  • Фактические параметры передаются в формальные по порядку, а не по именам.
  • Локальные переменные исчезают после вызова; изменение числового параметра не влияет на внешний мир, а изменение элемента списка влияет.
  • Вложенные вызовы вычисляются изнутри наружу; над каждым вызовом пиши возвращённое значение.
  • В цикле while f(i) < g(k) вычисли правую часть один раз, затем прослеживай значения f(i) в таблице.

Проверь себя

Вопросов: 12. Каждый правильный ответ приносит XP.

1 / 12
Какое ключевое слово возвращает результат функции в место вызова?