- Писать функцию с
def, вызывать её и объяснять разницу междуreturnиprint. - Различать формальные и фактические параметры и понимать, почему локальная переменная не меняет переменные основной программы.
- Прослеживать порядок вызовов в программе, где одна функция вызывает другую, и находить результат.
- Применять функции, возвращающие цифру, проверку на простоту или перевёрнутое число, к спискам и в условии
while.
Вместо того чтобы писать одно и то же вычисление в пяти местах программы, его можно один раз оформить как функцию и вызвать пять раз. В заданиях DİM функции играют две роли: либо главного героя (одна функция вызывает другую, f(i) стоит в условии while), либо помощника, который находит цифру, проверяет простоту или переворачивает число и применяется к каждому элементу списка. В обоих случаях главный навык один: следить, какой вызов происходит и когда и какое значение возвращается.
Запись функции: def и return
Именованная группа команд, которая выполняется только при вызове. Объявляется строкой def имя(параметры):, тело записывается с отступом, а оператор return возвращает результат в место вызова.
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)).
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). Параметры передаются по порядку: первый фактический параметр попадает в первый формальный, независимо от имён.
Переменная, созданная внутри функции (формальные параметры тоже локальные). Она существует только во время вызова; одноимённая переменная основной программы — другая переменная, и функция её не меняет.
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 в основной программе. Коротко: если числовой параметр меняется внутри функции, снаружи ничего не меняется; если меняется элемент списка, изменение видно и снаружи.
def f(a, b):
a = a - b
return a * 10 + b
a = 3
b = 7
print(f(b, a), a, b)▸ Ожидаемый результат
43 3 7
Определите результат программы выше.
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Найди начало
Пропусти блоки
defи начни с первой строки основной программы. - 2Запиши параметры
При каждом вызове по порядку перенеси фактические значения в формальные параметры; одна строка таблицы: функция, параметры, локальные переменные.
- 3Изнутри наружу
Если внутри функции есть другой вызов, приостанови текущую, полностью вычисли внутренний вызов и продолжай с возвращённым значением. В записи
f(g(x))сначала вычисляетсяg(x). - 4Вернись
После
returnвернись к месту вызова и замени вызов возвращённым значением. - 5Посчитай
Отмечай, сколько раз вызывается каждая функция, — пропущенный вызов самая частая ошибка.
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 + 4 | 11 | p = 11 · 3 = 33 |
g(33) = 3 + 3 | 6 | g(n + 5) ещё ждёт |
g(52) = 2 + 5 | 7 | q = 6 + 7 = 13 |
f(47) | 46 | return 33 + 13 |
g вызывается три раза, f — один раз; n + 5 = 52 вычисляется до передачи в функцию.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
Определите результат программы выше.
A) 36 B) 40 C) 22 D) 34 E) 52
Показать решениеСкрыть решение
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):. Сами алгоритмы с цифрами разобраны в уроке «Действия над числами: цифры, делители и простые числа»; здесь мы «упаковываем» их в функции.
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.
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
Определите число, которое выведет программа.def t(n): return n // 10 % 10def e(n): return n % 10a = [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.
Определите результат программы, если с клавиатуры введено −20.def f(n): return n * n + 1def g(n): return 3 * n - 4k = abs(int(input()))i = 0while f(i) <= g(k): i = i + 2print(i)
A) 6 B) 7 C) 8 D) 10 E) 4
Показать решениеСкрыть решение
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, а в конце — их количество.
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, а затем наибольшее простое число.
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.