Введение в функции. Модули

Введение

  • Функция — это группа инструкций, которая существует внутри программы с целью выполнения определенной задачи

  • Когда задача большая, её необходимо разбить на несколько приемлимых порций. Для этого используют функции.

  • Пример: нам нужно рассчитать заработную плату. Для написания программы нам нужно разбить задачу на подзадачи:

1. Получение почасовой ставки оплаты труда сотрудника
2. Получение числа отработанных часов
3. Расчёт заработной платы сотрудника до удержаний
4. Расчёт оплаты сверхурочных часов
5. Расчёт налоговых и прочих удержаний
6. Расчёт чистой заработной платы
7. Печать ведомости на получение заработной платы
  • Мы видим список инструкций, выполняя которые по очереди мы добьемся цели

  • Мы можем выделить функцию для решения каждой подзадачи. В нашей программе могли бы быть такие функции:

- функция получения почасовой ставки оплаты труда сотрудника
- функция получения количества часов
- функция расчета заработной платы сотрудника до удержаний
- функция расчета оплаты сверхурочных часов
- функция расчета налоговых и прочих удержаний
- функция расчета чистой заработной платы
- функция печати ведомости на получение заработной платы
  • Это называется модульным подходом и модуляризацией программы

  • Какие преимущества такого подхода?

    • Более простой код. Каждую функцию читать легче, чем одну длинную последовательность

    • Повторное использование кода — уменьшение дублирования в программе

    • Более простое тестирование

    • Более быстрая разработка: написанные однажды функции могут быть применены в нескольких программах

    • Упрощение командной работы

Возврат значения

  • функции без возврата значения просто выполняют инструкции и ничего не возвращают

  • функции с возвратом значения что-то возвращают в ту инструкцию, которая её вызвала Примеры:

  • функция input() возвращает значение — строку

  • функции int() и float() тоже возвращают значение

  • функция print() ничего не возвращает, а только выполняет инструкцию печати

Функции без возврата значения

  • Именование:

    • имя функции должно отражать то, что она делает

    • не должно быть пробелов, ключевых слов Python

    • первый символ — буква или нижнее подчеркивание

    • как правило в именах функции используются глаголы ("get, take, calculate, print и т.д")

  • Синтаксис написания функций следующий

  • Это называется определением функции. Говорят, что функция определена.

  • Теперь вызовем функцию:

  • Интерпретатор идет сверху вниз:

  1. Видит определение функции,

  2. Далее видит вызов функции,

  3. Возвращается к определению,

  4. Выполняет блок инструкций

  5. И затем снова возвращается к месту вызова.

  • Добавим ещё одну функцию в наш пример

Интерактив:

  • Из каких двух частей состоит определение функции?

  • Что значит "вызвать функцию"?

  • Зачем нужны отступы в блоке инструкций?

Разбор:

  • Подготовим "каркас нашей программы". Затем реализуем каждую функцию.

  • Напишите программу. "Точкой входа" должна быть функция main().

Области видимости: локальная и глобальная;

  • Когда переменной внутри функции присваивается значение, создаётся локальная переменная. Инструкции за пределами функции не имеют к ней доступа. Говорят, что переменная доступна в локальной области видимости

  • Когда переменная создается снаружи функции, она является глобальной и доступна в глобальной области видимости

  • Практика: напишите любую программу с применением глобальной и локальной переменных.

Передача аргументов в функцию

  • Аргумент — любая порция данных, передаваемая в функцию, когда она вызывается

  • Параметр — переменная, которая получает аргумент, переданный в функцию

  • Закончим программу и разберём каждый её шаг:

  • Передавать можно несколько аргументов:

  • Напишите функцию, которая принимает имя и фамилию, и печатает на экран фамилию и имя (именно в этом порядке)

Именованные аргументы

  • При передаче аргумента в функцию, можно прямо указать имя параметра и его значения. Такой аргумент называется именованным

  • Можно смешивать именованные и позиционные аргументы

  • Важно соблюдать порядок — сначала позиционные, потом именованные аргументы

Функции с возвратом значения

  • Функции могут не просто выполнять действие, но и возвращать результат

  • Для этого используется ключевое слово return. Значение, указанное после return, отправляется к месту вызова функции

  • Напишем программу, которая спрашивает пользователя доходы за месяц и расходы за месяц. В результате она должна сообщить баланс по итогам месяца

Разбор

Возвращение булевых значений

Интерактив:

  • Как называется функция?

  • Что функция делает?

  • Что покажет приведенная ниже инструкция с учетом определения функции?

Модули

  • Модуль — это файл, который содержит программный код Python. Большие программы легче отлаживать и поддерживать, когда они разделены на модули

  • Разделение, как правило, проводится по смыслу и логике — в одном модуле мы объединяем функции, выполняющие задачи в одной области

  • В стандартной библиотеке Python есть большое количество модулей, которые можно подключить при помощи инструкции import. Рассмотрим примеры использования одного из популярных модулей: random

  • Практика: познакомьтесь с возможностями модуля math. Решите задачу поиска длины гипотенузы, зная длины катетов прямоугольного треугольника при помощи модуля math.

Импорт самописных модулей

  • Когда мы импортируем один модуль в другой, то выполняются инструкции этого модуля: определяются функции и переменные

  • Если в модуле вызывается какая-то функция, то при импорте этого модуля, она тоже будет вызвана

  • Чтобы избежать этого, используется следующая конструкция:

Почему так происходит?

  • При обработке модуля интерпретатор создаёт переменную __name__

  • Если модуль импортируется, она равна имени модуля.

  • Если модуль запускается, она равна __main__

  • Таким образом, условие if __name__ == '__main__': выполнится только в случае, если модуль запускается непосредственно

Практика:

  1. Создайте два модуля. В каждом модуле определите по одной функции и вызовите их. Запустите каждый модуль — убедитесь, что будет вызвана только функция этого модуля

  2. Теперь импортируйте один модуль в другой. Запустите каждый модуль — понаблюдайте за результатом. Попробуйте добавить обратный импорт. Удалите вызов функции в одном модуле, потом в другом. Запускайте модули на каждом этапе.

  3. Добавьте конструкцию "if __name__ = '__main__':" в каждый модуль по очереди, проделайте шаги из пункта 2

  4. Обсудите результаты с преподавателем

Итог:

Всегда используйте конструкцию if __name__ == '__main__': в запускаемом (главном) модуле вашей программы


Интерактив:

  • Какое ключевое слово игнорируется интерпретатором и может использоваться в качестве местозаполнителя для кода, который будет написан позже?

  • Как определить функцию? Как её вызвать?

  • Глобальная или локальная переменная создаётся внутри функции?

  • Какая инструкция должна быть в функции для возврата значения?

  • Что такое булева функция?

  • Зачем разбивать большую программу на модули?

Last updated