Делаем свой таймер на Python

У нас когда-то был мини-проект: сде­лать свой таймер-напоминалку, кото­рый спра­ши­ва­ет, про что вам напом­нить, а потом выда­ёт сооб­ще­ние через нуж­ное вре­мя. В про­шлый раз мы его сде­ла­ли на JavaScript, теперь напи­шем на Python. Пото­му что Python — это мод­но, кра­си­во и при­ят­но.

Отличия и особенности

JavaScript пре­кра­сен тем, что его мож­но запу­стить в кон­со­ли любо­го совре­мен­но­го бра­у­зе­ра. Это для него род­ная сре­да, и JS лег­ко рабо­та­ет со стра­ни­ца­ми, объ­ек­та­ми на ней, вклад­ка­ми бра­у­зе­ра и всем, что с ним свя­за­но.

Python — более уни­вер­саль­ный язык, кото­рый рабо­та­ет не толь­ко с бра­у­зе­ра­ми, поэто­му для него нужен отдель­ный интер­пре­та­тор. Интер­пре­та­тор — это про­грам­ма, кото­рая берёт исход­ный код и выпол­ня­ет коман­ду за коман­дой. Вы може­те напи­сать отлич­ный код, но что­бы его испол­нить, вам все­гда нужен будет интер­пре­та­тор.

Есть два спо­со­ба запу­стить Python-код:

1. Поста­вить Python себе на ком­пью­тер — этот спо­соб хорош, если вы реши­ли осно­ва­тель­но изу­чить язык или про­сто люби­те, когда всё быст­ро и под кон­тро­лем. Ска­чать Python мож­но с офи­ци­аль­но­го сай­та — есть вер­сии для всех основ­ных опе­ра­ци­он­ных систем.
Из мину­сов — нуж­но раз­би­рать­ся в пара­мет­рах уста­нов­ки и настрой­ки и уметь рабо­тать с команд­ной стро­кой.
Плю­сы — пол­ный кон­троль и быст­ро­дей­ствие.

2. Исполь­зо­вать онлайн-сервисы, напри­мер, этот: onlinegdb.com/online_python_compiler. Рабо­та­ет точ­но так же — пише­те код, нажи­ма­е­те кноп­ку Run и смот­ри­те на резуль­тат.
Мину­сы: так как это онлайн-сервис, им поль­зу­ет­ся одно­вре­мен­но мно­го чело­век, поэто­му быст­ро­дей­ствия от него ждать не сто­ит. С под­клю­че­ни­ем внеш­них моду­лей тоже могут воз­ник­нуть про­бле­мы, но с этим мож­но разо­брать­ся, если потра­тить немно­го вре­ме­ни.
Плюс: не нуж­но ниче­го настра­и­вать и уста­нав­ли­вать, всё рабо­та­ет сра­зу из бра­у­зе­ра. Есть под­свет­ка син­так­си­са, сооб­ще­ния об ошиб­ках и воз­мож­ность сохра­не­ния кода.

Сей­час мы напи­шем тай­мер с огляд­кой на онлай­но­вый сер­вис. А отдель­но ещё рас­ска­жем об уста­нов­ке.

Исходный код на JavaScript

    
language: JavaScript
// Спрашиваем текст напоминания, который нужно потом показать пользователю
var text = prompt('О чём вам напомнить?');
// Тут будем хранить время, через которое нужно показать напоминание
var time = prompt('Через сколько минут?');
// Чтобы работать со временем в JavaScript, нам нужно перевести его в миллисекунды. Для этого число минут умножаем на 60 тысяч:
time = time * 60 * 1000;
// Ставим таймер на нужное время с помощью функции setTimeout
setTimeout(function () {
// Выводим на экран текст напоминания, который хранится в переменной text
alert(text);
// Привлекаем внимание к окну мигающим заголовком
titleAlert();
// В самом конце функции указываем время, через которое она должна сработать
}, time);


Ско­пи­ро­вать код
Код ско­пи­ро­ван

Что мы здесь сде­ла­ли:

Осо­бен­ность Python в том, что в нём нет встро­ен­ных средств рабо­ты с бра­у­зе­ром и его вклад­ка­ми, поэто­му поми­гать заго­лов­ком пока не полу­чит­ся. С дру­гой сто­ро­ны, Python не зави­сит от бра­у­зе­ра, поэто­му будем исполь­зо­вать штат­ные сред­ства вво­да и выво­да сооб­ще­ний.

Простая реализация на Python

Самое про­стое, что мож­но сде­лать — поста­вить про­грам­му на пау­зу на нуж­ное вре­мя, а потом выве­сти сооб­ще­ние. Для это­го под­клю­ча­ем стан­дарт­ный модуль time — он отве­ча­ет за рабо­ту со вре­ме­нем.

Модуль в Python — это уже гото­вый python-файл, где собра­ны зап­ча­сти, кото­рые помо­га­ют решать какую-то узкую зада­чу: функ­ции и клас­сы. Напри­мер, заме­рять вре­мя, рабо­тать с мате­ма­ти­че­ски­ми функ­ци­я­ми или кален­да­рём.

Что­бы сде­лать пау­зу, исполь­зу­ют коман­ду time.sleep(). Time — это назва­ние моду­ля, кото­рый мы под­клю­чи­ли, а sleep — функ­ция, кото­рая нахо­дит­ся внут­ри моду­ля. Её зада­ча — подо­ждать нуж­ное коли­че­ство секунд, а потом про­дол­жить выпол­не­ние про­грам­мы.

    
language: Python 3
# Подключаем нужный модуль

import time

# Спрашиваем текст напоминания, который нужно потом показать пользователю

print("О чём вам напомнить?")

# Ждём ответа пользователя и результат помещаем в строковую переменную text

text = str(input())

# Спрашиваем про время

print("Через сколько минут?")

# Тут будем хранить время, через которое нужно показать напоминание

local_time = float(input())

# Переводим минуты в секунды

local_time = local_time * 60

# Ждём нужное количество секунд, программа в это время ничего не делает

time.sleep(local_time)

# Показываем текст напоминания

print(text)


Ско­пи­ро­вать код
Код ско­пи­ро­ван

Что дальше: многозадачность и оптимизация

Наша про­грам­ма уже рабо­та­ет как нуж­но, но её мож­но улуч­шить. Дело в том, что ста­вить весь код на пау­зу — не самое удач­ное реше­ние с точ­ки зре­ния про­из­во­ди­тель­но­сти. Пред­ставь­те, что вам нуж­но поста­вить себе несколь­ко напо­ми­на­ний на раз­ное вре­мя. С таким под­хо­дом нам при­дёт­ся выяс­нять, какое сра­бо­та­ет рань­ше, потом кор­рек­ти­ро­вать вре­мя пау­зы для сле­ду­ю­ще­го напо­ми­на­ния и так далее.

Мож­но сде­лать так: выно­сить напо­ми­на­ния в отдель­ные пото­ки. Это как под­про­грам­ма, кото­рая рабо­та­ет парал­лель­но с нашей про­грам­мой и не силь­но зави­сит от неё. Это поз­во­лит не ждать пер­во­го собы­тия, а запус­кать их одно­вре­мен­но. Но про всё это — в сле­ду­ю­щем мате­ри­а­ле.