Функции
 повторение: какие функции мы знаем, и как ими пользоваться? - Что такое «параметры функции»?
 - Что такое «возвращаемое значение функции»?
 
- Задача повторного использования (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 (другие слова тоже можно ☺)
