Декомпозиция программы на функции
Уроки курсаДекомпозиция программы на функции
Точка входа программы и функция main()
После декомпозиции возникает новый вопрос: где теперь «начинается» программа? В монолитном коде это очевидно — первая строка сверху. Но когда файл состоит из нескольких определений функций, сразу не понятно, что запускается первым и в каком порядке.
Точка входа — это место, с которого Python начинает исполнение. Технически это первая инструкция верхнего уровня, которая не является определением функции. Но когда таких инструкций много и они разбросаны по файлу, читать код становится неудобно: нужно мысленно отделять «описания» функций от «действий».
Стандартное решение — собрать все вызовы в одну функцию main() и вызвать её явно:
# ... (функции из предыдущего раздела: get_price, apply_discount, print_receipt) ...
def main():
price = get_price()
discounted = apply_discount(price, rate=0.1)
print_receipt(discounted)
main()
Теперь структура файла читается однозначно: сверху — определения функций, снизу — единственный вызов main(), который запускает всё. Открыв файл, вы сразу видите, с чего начинается исполнение, не листая весь код.
Ещё один шаг — использовать конструкцию if __name__ == '__main__': вместо голого вызова main():
if __name__ == '__main__':
main()
Что это даёт? В Python у каждого файла есть встроенная переменная __name__. Когда файл запускается напрямую командой python script.py, значение __name__ равно строке '__main__'. Когда тот же файл импортируется в другой модуль, __name__ принимает имя файла — и блок внутри if не выполняется.
Для начального уровня это важно по одной причине: такой паттерн защищает код от случайного запуска при импорте. Если вы когда-нибудь захотите использовать get_price или apply_discount из другого файла, весь сценарий с вводом не запустится автоматически.
Итоговый вид всей программы с явной точкой входа:
def get_price():
return float(input("Введите цену: "))
def apply_discount(price, rate):
return price * (1 - rate)
def print_receipt(price):
print(f"Итого со скидкой: {price:.2f} руб.")
def main():
price = get_price()
discounted = apply_discount(price, rate=0.1)
print_receipt(discounted)
if __name__ == '__main__':
main()
Эта структура — стандарт, который вы будете встречать в большинстве Python-проектов. main() играет роль дирижёра: она не делает ничего сама, только вызывает остальные функции в нужном порядке. Именно в ней читается весь сценарий программы одним взглядом — без погружения в детали каждой функции.
