Учебная страница курса биоинформатики,
год поступления 2014
Дополнения к памятке к практикуму 11
Пишем файл, сочетающий в себе модуль и главную программу
Модуль может узнать, запустили ли его как программу (python filename.py) или подключили как модуль (import filename):
Эта проверка основывается на том, что служебная переменная __name__ содержит строку "main", если файл запустили как программу. Это возможность может использоваться, чтобы написанный файл был сразу и программой, и модулем. Модуль ничего не делает (только определяет функции), а программа работает с пользователем в консоли (вводит данные, вызывает свои функции и печатает результат). Советуем именно так и писать модули, чтобы их было удобно тестировать.
* Рекурсивные функции
Если функция прямо или косвенно вызывает саму себя, то её называют рекурсивной функцией. Факториал числа (произведение всех целых чисел от 1 включительно до самого числа включительно) можно рассчитать, используя рекурсивную функцию. Математическое обозначение факториала - восклицательный знак (!).
Рассмотрим работу функции factorial. Если аргумент равен 0, она возвращает 1 (математики постановили, что факториал нуля равен единице). В остальных случаях на входе предполагается целое число, большее 0, а факториал такого числа равен факториалу предыдущего числа, умноженному на само число: n! = (n-1)! * n. Это значение функция и рассчитывает. Чтобы рассчитать факториал предыдущего числа, используется рекурсивный вызов factorial(x - 1).
Пока не отработает вызванная функция, не завершается и вызвавшая её функция. Количество таких запущенных функций (глубина рекурсии) ограничего несколькими сотнями или тысячами, обо что часто спотыкаются программы, активно использующие рекурсию. Теоретики доказали, что любую программу, использующую рекурсию, можно переписать без оной. Например, для факториала можно создать какую-нибудь числовую переменную, изначально равную 1, пройтись циклом по всем числам от 1 до N и домножать переменную на каждое из этих чисел (см. ниже). Такой подход называется динамическим программированием. Если следующее значение зависит не от одного предыдущего, а от нескольких предыдущих, то полезным бывает создать массив или несколько переменных с промежуточными результатами.