Введение в функции. Модули
Введение
Функция — это группа инструкций, которая существует внутри программы с целью выполнения определенной задачи
Когда задача большая, её необходимо разбить на несколько приемлимых порций. Для этого используют функции.
Пример: нам нужно рассчитать заработную плату. Для написания программы нам нужно разбить задачу на подзадачи:
1. Получение почасовой ставки оплаты труда сотрудника
2. Получение числа отработанных часов
3. Расчёт заработной платы сотрудника до удержаний
4. Расчёт оплаты сверхурочных часов
5. Расчёт налоговых и прочих удержаний
6. Расчёт чистой заработной платы
7. Печать ведомости на получение заработной платыМы видим список инструкций, выполняя которые по очереди мы добьемся цели
Мы можем выделить функцию для решения каждой подзадачи. В нашей программе могли бы быть такие функции:
- функция получения почасовой ставки оплаты труда сотрудника
- функция получения количества часов
- функция расчета заработной платы сотрудника до удержаний
- функция расчета оплаты сверхурочных часов
- функция расчета налоговых и прочих удержаний
- функция расчета чистой заработной платы
- функция печати ведомости на получение заработной платыЭто называется модульным подходом и модуляризацией программы
Какие преимущества такого подхода?
Более простой код. Каждую функцию читать легче, чем одну длинную последовательность
Повторное использование кода — уменьшение дублирования в программе
Более простое тестирование
Более быстрая разработка: написанные однажды функции могут быть применены в нескольких программах
Упрощение командной работы
Возврат значения
функции без возврата значения просто выполняют инструкции и ничего не возвращают
функции с возвратом значения что-то возвращают в ту инструкцию, которая её вызвала Примеры:
функция input() возвращает значение — строку
функции int() и float() тоже возвращают значение
функция print() ничего не возвращает, а только выполняет инструкцию печати
Функции без возврата значения
Именование:
имя функции должно отражать то, что она делает
не должно быть пробелов, ключевых слов Python
первый символ — буква или нижнее подчеркивание
как правило в именах функции используются глаголы ("get, take, calculate, print и т.д")
Синтаксис написания функций следующий
Это называется определением функции. Говорят, что функция определена.
Теперь вызовем функцию:
Интерпретатор идет сверху вниз:
Видит определение функции,
Далее видит вызов функции,
Возвращается к определению,
Выполняет блок инструкций
И затем снова возвращается к месту вызова.
Добавим ещё одну функцию в наш пример
Интерактив:
Из каких двух частей состоит определение функции?
Что значит "вызвать функцию"?
Зачем нужны отступы в блоке инструкций?
Разбор:
Подготовим "каркас нашей программы". Затем реализуем каждую функцию.
Напишите программу. "Точкой входа" должна быть функция main().
Области видимости: локальная и глобальная;
Когда переменной внутри функции присваивается значение, создаётся локальная переменная. Инструкции за пределами функции не имеют к ней доступа. Говорят, что переменная доступна в локальной области видимости
Когда переменная создается снаружи функции, она является глобальной и доступна в глобальной области видимости
Практика: напишите любую программу с применением глобальной и локальной переменных.
Передача аргументов в функцию
Аргумент — любая порция данных, передаваемая в функцию, когда она вызывается
Параметр — переменная, которая получает аргумент, переданный в функцию
Закончим программу и разберём каждый её шаг:
Передавать можно несколько аргументов:
Напишите функцию, которая принимает имя и фамилию, и печатает на экран фамилию и имя (именно в этом порядке)
Именованные аргументы
При передаче аргумента в функцию, можно прямо указать имя параметра и его значения. Такой аргумент называется именованным
Можно смешивать именованные и позиционные аргументы
Важно соблюдать порядок — сначала позиционные, потом именованные аргументы
Функции с возвратом значения
Функции могут не просто выполнять действие, но и возвращать результат
Для этого используется ключевое слово return. Значение, указанное после return, отправляется к месту вызова функции
Напишем программу, которая спрашивает пользователя доходы за месяц и расходы за месяц. В результате она должна сообщить баланс по итогам месяца
Возвращение булевых значений
Интерактив:
Как называется функция?
Что функция делает?
Что покажет приведенная ниже инструкция с учетом определения функции?
Модули
Модуль — это файл, который содержит программный код Python. Большие программы легче отлаживать и поддерживать, когда они разделены на модули
Разделение, как правило, проводится по смыслу и логике — в одном модуле мы объединяем функции, выполняющие задачи в одной области
В стандартной библиотеке Python есть большое количество модулей, которые можно подключить при помощи инструкции import. Рассмотрим примеры использования одного из популярных модулей: random
Практика: познакомьтесь с возможностями модуля math. Решите задачу поиска длины гипотенузы, зная длины катетов прямоугольного треугольника при помощи модуля math.
Документация: https://docs.python.org/3/library/math.html
Импорт самописных модулей
Когда мы импортируем один модуль в другой, то выполняются инструкции этого модуля: определяются функции и переменные
Если в модуле вызывается какая-то функция, то при импорте этого модуля, она тоже будет вызвана
Чтобы избежать этого, используется следующая конструкция:
Почему так происходит?
При обработке модуля интерпретатор создаёт переменную __name__
Если модуль импортируется, она равна имени модуля.
Если модуль запускается, она равна
__main__Таким образом, условие
if __name__ == '__main__':выполнится только в случае, если модуль запускается непосредственно
Практика:
Создайте два модуля. В каждом модуле определите по одной функции и вызовите их. Запустите каждый модуль — убедитесь, что будет вызвана только функция этого модуля
Теперь импортируйте один модуль в другой. Запустите каждый модуль — понаблюдайте за результатом. Попробуйте добавить обратный импорт. Удалите вызов функции в одном модуле, потом в другом. Запускайте модули на каждом этапе.
Добавьте конструкцию "
if __name__ = '__main__':" в каждый модуль по очереди, проделайте шаги из пункта 2Обсудите результаты с преподавателем
Итог:
Всегда используйте конструкцию if __name__ == '__main__': в запускаемом (главном) модуле вашей программы
Интерактив:
Какое ключевое слово игнорируется интерпретатором и может использоваться в качестве местозаполнителя для кода, который будет написан позже?
Как определить функцию? Как её вызвать?
Глобальная или локальная переменная создаётся внутри функции?
Какая инструкция должна быть в функции для возврата значения?
Что такое булева функция?
Зачем разбивать большую программу на модули?
Last updated