Различия между версиями 3 и 4
Версия 3 от 2022-11-28 00:17:37
Размер: 16754
Редактор: FrBrGeorge
Комментарий:
Версия 4 от 2022-12-04 11:27:26
Размер: 16770
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 116: Строка 116:
   * Функция должна получать на вход список, ''но не возвращать ничего'', а вместо этого модифицировать этот список непосредственно    * Функция должна получать на вход список, модифицировать этот список непосредственно, а возвращать `None` (пустой `return` или его отсутствие).

Функции

  • {i} повторение: какие функции мы знаем, и как ими пользоваться?

    • Что такое «параметры функции»?
    • Что такое «возвращаемое значение функции»?
  • Задача повторного использования (code reuse).
  • Функция — это именованный алгоритм
    • Нужно указать входные данные: это формальные параметры

    • Можно использовать промежуточные результаты: это локальные переменные (имена)

    • Функция что-то вычисляет: это возвращаемое значение

  • Общий вид (упрощённый):
       1 def имя_функции(имя_1, имя_2, …):
       2 тело
       3         return выражение
       4 
       5 
       6 результат = имя_функции(выражение_1, выражение_2, …)
    
    • Операторов return может быть несколько (например, внутри условия и в конце)

    • Выражение из return вычисляется и подставляется в качестве результата вызова

    • имя_1, имя_2 и т. п. — это формальные параметры (их может быть сколько угодно, в том числе ноль)

    • выражение_1, выражение_2 — это фактические параметры, они сначала высчисляются, а полученные объекты передаются в функцию

Примеры

  • {OK} Пример. Функция сложения двух чисел add2(a, b).

    • {i} Вбить этот пример в визуализатор

    • {i} Проверить, а будет ли работать эта функция, если передать ей строки? списки? число и строку?

  • {i} Написать функцию сложения трёх чисел add3(a, b, c), в которой вместо операции сложения используется только add2().

  • {i} Функция aver(a, b) вычисления среднего арифметического из двух чисел.

  • {OK} (по возможности {i} ) Повторение: среднее арифметическое списка (кортежа)

  • {i} Превратить это в функцию aver(список) (в которую передаётся список)

Неизвестное число параметров

  • При задании функции фактические параметры можно не «раскладывать» по локальным именам, а принять их все в виде одного кортежа:
       1 def varfun(*args):
       2 args[0] … # первый параметр
       3 
       4 args[2] … # третий параметр
    
  • {OK} Сколько параметров непусты?

  • {i} Переделать функцию aver(список) в вариант с неопределённым количеством параметров

    • Подсказка: добавить один символ))
    • {i} Вбить этот пример в визуализатор

  • {OK} Алсо, можно и наоборот: распаковать последовательность при вызове

    • В частности, print(*список) — это именно оно!

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

  • {OK} Формальные параметры — локальные имена, их нет, когда функция не выполняется

  • {OK} locals()/dir() и globals() (на примере функции с параметрами)

  • {OK} Другие локальные имена образуются, когда в функции появляется операция связывания

    • Строгая локальность при связывании
  • {OK} Программа: решение квадратного уравнения $$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)$$

  • {i} Написать функцию sqroot(a, b, c), которая делает то же самое

    • Если нет корней, возвращает пустой список []

    • Если корень один, возвращает список из одного элемента [x]

    • Если корней два, возвращает список из

Рекурсия

  • Функция может вызывать другие функции (add3() вызывала add2(), sqroot() вызывала sqrt()).

  • {i} / {OK} Что будет, если функция вызовет саму себя?

  • {OK} Что сделать, чтобы она не сожрала все ресурсы?

    • Написать функцию так, чтобы она достигала основания рекурсии (./) — больше себя не вызывала.

  • Когда это не нужно?

    • Когда можно тупо написать цикл: факториал, числа Фибоначчи и т. п.
    • Если успеем: вбить факториал в визуализатор
  • {OK} Разбор странного Д/З

  • Когда это бывает нужно?

{OK} Задача: дано число s и числовая последовательность seq. Проверить, правда ли, что сумма каких-то элементов последовательности равна s (если s = 0, ответ True, ибо это сумма никаких элементов)

  • FrBrGeorge/MyDict/speech_balloon_question.png А как это вообще решать?

  • Предлагается:
    • (./) Если s равно нулю, ответ True (по условию)

    • (./) Если s не равно нулю, а seq пуста, ответ False

    • Если s не 0 и seq непусто, то есть состоит из числа a и хвоста последовательности tail:

      • $$ s != 0; seq = ["a"] + ubrace"[b, c, …]"_("tail") $$

      1. Или используем a и проверяем s-a и tail

      2. Или выбрасываем a и проверяем s и tail. Годятся оба варианта.

  • Переписываем на Python:
       1 def issum(s, seq):
       2     if s == 0:
       3         return True
       4     if not seq:
       5         return False
       6     return issum(s, seq[1:]) or issum(s - seq[0], seq[1:])
    
  • МАГИЯ >:> !

Д/З

Не поддаваться на провокации и не использовать рекурсию там, где она не нужна!

  • Прощёлкать Восьмое занятие учебника

  • Решить следующие (уже решённые ☺) задачи, оформив каждое решение в виде:
    1. Определения некоторой функции
    2. Ввода входных данных
    3. Однократного вызова функции с соответствующими параметрами.

      • Сама функция ничего не вводит и не выводит.

      • Всё, что нужно вывести, функция возвращает как значение
      • Если по условию нужно вывести более одного объекта, все эти объекты функция заносит в список и возвращает список
    4. Вывода всего, что вернула функция
  • Задачи:
    1. Минимум из трех чисел

    2. Ход ферзя

    3. Число десятков

    4. Факториал

    5. Лесенка

      • Функция должна возвращать список (например, ["1", "12", "123"] или [1, 12, 123] — как вам удобнее), а основная программа — выводить его построчно

    6. Первое и последнее вхождения

      • Функция должна возвращать список из 0, 1, или 2 элементов, а основная программа — делать print(*список)

    7. Удалить каждый третий символ

    8. Список квадратов

      • Функция должна возвращать список
    9. Максимальное число идущих подряд равных элементов

      • Функция должна получать на вход список
    10. Переставить соседние

      • Функция должна получать на вход список, модифицировать этот список непосредственно, а возвращать None (пустой return или его отсутствие).

    11. Уникальные элементы

      • Функция должна получать на вход список. Будете ли вы модифицировать исходный список или формировать новый, решайте сами. Я бы рекомендовал второй вариант.
  • Скопировать решения в соответствующие файлы и проверить, что они всё ещё работают!

    • Имена файлов — от prog_8_1.py до prog_8_11.py

  • Прислать эти 11 файлов в виде шестнадцати приложений к одному письму по адресу <uneexlectures AT cs DOT msu DOT ru>

    • В поле Subject должно быть «слово» PhilosoPython2022 (другие слова тоже можно ☺)

Python/PhilosoPython2022/12_Functions (последним исправлял пользователь FrBrGeorge 2022-12-04 11:27:26)