Функции
повторение: какие функции мы знаем, и как ими пользоваться?
- Что такое «параметры функции»?
- Что такое «возвращаемое значение функции»?
- Задача повторного использования (code reuse).
- Функция — это именованный алгоритм
Нужно указать входные данные: это формальные параметры
Можно использовать промежуточные результаты: это локальные переменные (имена)
Функция что-то вычисляет: это возвращаемое значение
- Общий вид (упрощённый):
Операторов return может быть несколько (например, внутри условия и в конце)
Выражение из return вычисляется и подставляется в качестве результата вызова
имя_1, имя_2 и т. п. — это формальные параметры (их может быть сколько угодно, в том числе ноль)
выражение_1, выражение_2 — это фактические параметры, они сначала высчисляются, а полученные объекты передаются в функцию
Примеры
Пример. Функция сложения двух чисел add2(a, b).
Вбить этот пример в визуализатор
Проверить, а будет ли работать эта функция, если передать ей строки? списки? число и строку?
Написать функцию сложения трёх чисел add3(a, b, c), в которой вместо операции сложения используется только add2().
Функция aver(a, b) вычисления среднего арифметического из двух чисел.
(по возможности ) Повторение: среднее арифметическое списка (кортежа)
Превратить это в функцию aver(список) (в которую передаётся список)
Неизвестное число параметров
- При задании функции фактические параметры можно не «раскладывать» по локальным именам, а принять их все в виде одного кортежа:
Сколько параметров непусты?
Переделать функцию aver(список) в вариант с неопределённым количеством параметров
- Подсказка: добавить один символ))
Вбить этот пример в визуализатор
Алсо, можно и наоборот: распаковать последовательность при вызове
В частности, print(*список) — это именно оно!
Локальные и глобальные имена
Формальные параметры — локальные имена, их нет, когда функция не выполняется
locals()/dir() и globals() (на примере функции с параметрами)
Другие локальные имена образуются, когда в функции появляется операция связывания
- Строгая локальность при связывании
Программа: решение квадратного уравнения $$ax^2+bx+c=0$$ при a≠0
Не забыть про from math import sqrt
$$D = b^2 - 4 a c$$
$$D < 0$$
Нет корней
$$D == 0$$
Один корень: $$x = -b/(2a)$$
$$D > 0$$
Два корня: $$x_{1,2} = (-b +- sqrt D)/(2a)$$
Написать функцию sqroot(a, b, c), которая делает то же самое
Если нет корней, возвращает пустой список []
Если корень один, возвращает список из одного элемента [x]
- Если корней два, возвращает список из
Рекурсия
Функция может вызывать другие функции (add3() вызывала add2(), sqroot() вызывала sqrt()).
/ Что будет, если функция вызовет саму себя?
Что сделать, чтобы она не сожрала все ресурсы?
Написать функцию так, чтобы она достигала основания рекурсии — больше себя не вызывала.
Когда это не нужно?
- Когда можно тупо написать цикл: факториал, числа Фибоначчи и т. п.
- Если успеем: вбить факториал в визуализатор
Разбор странного Д/З
- Когда это бывает нужно?
Задача: дано число s и числовая последовательность seq. Проверить, правда ли, что сумма каких-то элементов последовательности равна s (если s = 0, ответ True, ибо это сумма никаких элементов)
А как это вообще решать?
- Предлагается:
Если s равно нулю, ответ True (по условию)
Если s не равно нулю, а seq пуста, ответ False
Если s не 0 и seq непусто, то есть состоит из числа a и хвоста последовательности tail:
$$ s != 0; seq = ["a"] + ubrace"[b, c, …]"_("tail") $$
Или используем a и проверяем s-a и tail
Или выбрасываем a и проверяем s и tail. Годятся оба варианта.
- Переписываем на Python:
МАГИЯ !
Д/З
Не поддаваться на провокации и не использовать рекурсию там, где она не нужна!
Прощёлкать Восьмое занятие учебника
- Решить следующие (уже решённые ☺) задачи, оформив каждое решение в виде:
- Определения некоторой функции
- Ввода входных данных
Однократного вызова функции с соответствующими параметрами.
Сама функция ничего не вводит и не выводит.
- Всё, что нужно вывести, функция возвращает как значение
- Если по условию нужно вывести более одного объекта, все эти объекты функция заносит в список и возвращает список
- Вывода всего, что вернула функция
- Задачи:
Функция должна возвращать список (например, ["1", "12", "123"] или [1, 12, 123] — как вам удобнее), а основная программа — выводить его построчно
Функция должна возвращать список из 0, 1, или 2 элементов, а основная программа — делать print(*список)
- Функция должна возвращать список
Максимальное число идущих подряд равных элементов
- Функция должна получать на вход список
Функция должна получать на вход список, модифицировать этот список непосредственно, а возвращать None (пустой return или его отсутствие).
- Функция должна получать на вход список. Будете ли вы модифицировать исходный список или формировать новый, решайте сами. Я бы рекомендовал второй вариант.
Скопировать решения в соответствующие файлы и проверить, что они всё ещё работают!
Имена файлов — от prog_8_1.py до prog_8_11.py
Прислать эти 11 файлов в виде шестнадцати приложений к одному письму по адресу <uneexlectures AT cs DOT msu DOT ru>
В поле Subject должно быть «слово» PhilosoPython2022 (другие слова тоже можно ☺)