Проверить программы онлайн · файлы остаются в браузере

Подпрограммы: процедуры и функции — практикум

10 класс, углублённый уровень. Занятие десятое: в прошлой паре мы звали чужие функции из библиотеки — сегодня пишем свои. Кусок программы получает имя, вход (параметры) и выход (return).

План на пару. Сначала тренажёр: шесть коротких задач — что вернёт функция, чем процедура отличается от функции и откуда берётся None, где чья переменная, сколько раз зовётся функция в цикле, какая строка упадёт, где сработает ранний return. Потом три программы, в каждой — своя функция с оговорённым именем. Проверяет их оболочка Проверка.bat из общей папки: она запускает программу на девяти наборах данных, а потом зовёт твою функцию напрямую и смотрит, что она вернула. Интернет не нужен.

Часть 1. Тренажёр: читаем функции

Шесть типов задач, по одной на каждый. Считать в уме или на бумаге: сначала найди, где функцию зовут и с какими аргументами, потом подставь их в параметры. Ответ — всё напечатанное через пробел; True, False и None пиши так, как их печатает Python. Ошибся — ниже появится разбор рисунком и кнопка «Новые числа»: реши такую же ещё раз.

0 верно из 6

Часть 2. Как устроена функция

def, параметры, return

фрагмент программы — набери его сам

def только запоминает функцию — ничего не считает. Считать она начинает при вызове: аргументы по порядку встают в параметры, строки тела выполняются, return отдаёт значение туда, где стоял вызов.

Процедура и функция

ПроцедураФункция
что делаетчто-то делает: печатает, рисует что-то считает и отдаёт через return
что возвращаетNone — «ничего»число, True/False…
как зовутотдельной строкой: show(5) внутри выражения: y = f(5) + 1, if is_prime(n):
фрагмент программы — набери его сам

В Python обе пишутся через def; разница только в return. В заданиях практикума функции обязаны возвращать: напечатанное нельзя сложить, сравнить или поставить в if.

Свои имена у каждой функции

фрагмент программы — набери его сам

return обрывает функцию сразу

фрагмент программы — набери его сам

«Нашёл — ответил» пишется return внутри цикла, а «не нашёл» — после цикла. Поставить return True в else внутри цикла — частая ошибка: функция ответит на первом же витке.

Функция-признак и функция из функций

фрагмент программы — набери его сам

Функция, которая отвечает True или False, — признак: if is_prime(x): читается как фраза. Строка в тройных кавычках первой строкой тела — документация: help(nod) покажет её так же, как у math.isqrt.

Где что стоит в программе

  1. Сначала все def — функцию нельзя позвать выше её определения (NameError).
  2. Потом основная программа: ввод, циклы с вызовами, вывод.
  3. Число аргументов в вызове равно числу параметров, иначе TypeError.

Часть 3. Три программы

Задание 1 Сумма цифр

Напиши функцию код, которая возвращает сумму цифр натурального числа код. Программа читает два натуральных числа код и код (1 ≤ a ≤ b ≤ 100000), каждое со своей строки, и печатает, какая наибольшая сумма цифр встречается среди чисел от код до код и у скольких чисел она такая.

Функция: код — один параметр, возвращает число.

Вход

19
28

Вывод

Наибольшая сумма цифр: 10
Чисел с такой суммой: 2

Проверяется: функция digsum на семи числах напрямую; ничья по наибольшей сумме (19 и 28), однозначные числа, 100000.

Если застрял

Внутри код — знакомый цикл: отрываем последнюю цифру код, прибавляем, отрезаем код, пока код. В конце — код, а не код.

Ловушки, ради которых это задание. В основной программе два накопителя: наибольшая сумма и счётчик. Нашлась сумма больше — запоминаем её и счётчик снова 1; такая же — счётчик плюс один. Кто считает только «больше», на 19…28 напечатает 1 вместо 2.

Задание 2 Простые числа

Напиши функцию-признак код: возвращает код, если код простое, и код, если нет. Программа читает количество чисел код (от 1 до 20), затем код натуральных чисел до 1000000000, каждое со своей строки. Печатает, сколько среди них простых и какое простое наибольшее (0, если простых нет).

Функция: код — один параметр, возвращает код или код.

Вход

4
1
2
3
961

Вывод

Простых: 2
Наибольшее простое: 3

Проверяется: is_prime на двенадцати числах напрямую — 1, 2, квадраты простых, простое под миллиард; перебор до корня.

Если застрял

Перебирай делители код от 2, пока код. Нашёлся — код сразу; цикл закончился — код. Ранний код здесь — главный приём.

Ловушки, ради которых это задание. 1 не простое — без отдельной проверки функция ответит код. Граница код пропускает 961 = 31 · 31. Перебор до самого код на 999999937 не успеет за пять секунд.

Задание 3 НОК цепочки

Напиши две функции: код — наибольший общий делитель своим алгоритмом Евклида (готовую код из код сегодня брать нельзя), и код — наименьшее общее кратное через код. Программа читает количество чисел код (от 1 до 10), затем код натуральных чисел до 1000, каждое со своей строки, и печатает НОК всех чисел.

Функции: код и код — по два параметра, возвращают число.

Вход

4
4
6
8
10

Вывод

НОК: 120

Проверяется: nod и nok напрямую, в том числе на единицах и равных числах; старт накопителя; что gcd не взята из math.

Если застрял

Евклид остатками: пока код — остаток код, потом код, код; ответ — код. НОК двух чисел — код.

Ловушки, ради которых это задание. Накопитель НОК стартует единицей: код. С нуля всё умножится на ноль — в прошлой паре у НОД было наоборот. Условие код обрывает Евклида раньше времени у взаимно простых чисел.

Часть 4. Сдача

  1. Файлы zadanie1.py … zadanie3.py лежат в твоей папке, отладочные print из них убраны.
  2. В общей папке двойной щелчок по Проверка.bat.
  3. «Найти мои файлы» → «Проверить всё».
  4. Покажи учителю два экрана: тренажёр наверху этой страницы и итог оболочки.
Если вместо окна открылся текст программы — файл открылся в IDLE как код. Нажми F5, окно появится.

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

Подсказка: подпрограммы

Функция

def имя(параметры): — тело — return значение. def только запоминает функцию, считает она при вызове. Аргументы встают в параметры по порядку: f(7, 2) в def f(a, b) даёт a = 7, b = 2.

Процедура и функция

Процедура делает (печатает), функция считает и отдаёт через return. Без return функция отдаёт None: print(show(4)) напечатает то, что печатает show, а потом None. К None нельзя прибавить число.

Локальные имена

Параметры и переменные, созданные внутри, живут только внутри функции. В параметр приходит копия числа: внешняя переменная не меняется. Нужно новое значение — m = inc(m).

return

Сразу выходит из функции, даже из середины цикла. «Нашёл — return» внутри цикла, «не нашёл — return» после цикла. Строки после return не выполняются.

Признак и функция из функций

Признак возвращает True или False и стоит прямо в if: if is_prime(x):. Одна функция может звать другую: nok(a, b) = a // nod(a, b) * b.

Порядок в программе

Сначала все def, потом основная программа. Вызов выше def — NameError; не то число аргументов — TypeError. """Строка документации""" первой строкой функции — её показывает help().

Материалы подготовлены с использованием технологий искусственного интеллекта.