Как определить високосный год в питоне
Перейти к содержимому

Как определить високосный год в питоне

  • автор:

Високосные годы

Надеюсь, вы отлично встретили новый год, и сейчас у вас отличное праздничное настроение. По крайней мере у меня это именно так — мы не пили никакого алкоголя, и чокнулись в полночь бокалами с водой из пятилитровой канистры, поэтому мы проснулись, погуляли, и тут я вспомнил одно из вчерашних поздравлений с Новым годом:

Желаю, чтобы в конце каждого года ты, вспоминая то, что было за последние 366 if ((year%4 == 0 and year%100 != 0) or (year%400 == 0)) else 365 дней, думал про себя:

— Ох, нифига себе, какой был экшен. Обязательно буду рассказывать внукам или напишу об этом потом книгу.

Итак, выше достаточно простой inline-способ определить количество дней в году (переменная year), который, по сути, полностью раскрывает их суть: в григорианском календаре високосными годами считаются те годы, порядковый номер которых либо кратен 4, но при этом не кратен 100, либо кратен 400. Иными словами, если год делится на 4 без остатка, но делится на 100 только с остатком, то он високосный, иначе — невисокосный, кроме случая, если он делится без остатка на 400 — тогда он всё равно високосный.

Например, 2013 год невисокосный, 1700, 1800 и 1900 — опять же невисокосные годы, а вот 2000, 2004, 2008 и 2012 — високосные.

Но что, если мы не помним, сколько дней в високосных (366 дней) и невисокосных (365 дней) годах, или просто хотим написать определение количества дней в году максимально быстро? Можно ли сделать так на Python? Конечно же, можно.

Итак, в Python есть модуль calendar. Он как раз отлично подходит для того, чтобы узнать, является ли тот или иной год високосным (или, например, сколько високосных годов в определённом интервале), определить количество дней в месяце, получить номер дня недели для определённой даты и так далее.

В частности, мы можем получить количество дней в каждом месяце года, и просто сложить.

Функция calendar.monthrange принимает номер года в качестве первого аргумента и номер месяца в качестве второго аргумента. Возвращает номер дня недели первого числа данного месяца и количество дней в данном месяце:

Соответственно, мы можем подсчитать общее количество дней для всех 12 месяцев, и получить таким образом количество дней для данного года:

Но если подумать о том, как именно выполняется эта строка, становится очевидно, что это решение очень неэффективно, если нужно посчитать количество дней для большого количества годов.

Проверяем с помощью модуля timeit.

На то, чтобы выполнить её 1 миллион раз, требуется 13.69 секунд, если import calendar делается один раз в начале. Если import calendar делается каждый раз, тогда 14.49 секунд.

Теперь попробуем другой вариант. Он требует знания того, сколько дней в високосных и невисокосных годах, но зато он очень короткий:

И, как легко догадаться, он уже намного быстрее: 0.83 секунд, включая import calendar, и 0.26 секунд, если import calendar делается один раз в начале.

Давайте также посмотрим, сколько требуется времени самому первому варианту, с «ручным» подходом: 0.07 секунд для 2012 и 2013 и 0.12 секунд для 2000 (думаю, всем понятно, откуда берётся такая разница в скорости для этих годов).

Получается, что это и есть самый быстрый вариант из этих трёх:

Конечно, в большинстве случаев вы можете использовать любой из этих вариантов — в конце концов, при определении количества дней в одном, двух, десяти или ста годах вы вряд ли почувствуете какую-либо разницу.

Пишите, оптимизируйте, улучшайте, тестируйте и считайте производительность — но не забывайте о читаемости исходников ваших программ.

С Новым годом! Удачи, счастья, радости и самосовершенствования в новом году.

Как проверить високосный ли год на Python

Стандартный год состоит из 365 дней, а високосный из 366 дней. Високосный год кратен 4, но при этом не кратен 100, либо кратен 400. Иными словами, если год делится на 4 без остатка, но делится на 100 только с остатком, то он високосный, иначе — невисокосный, кроме случая, если он делится без остатка на 400 — тогда он всё равно високосный.

Проверка с помощью условия if

На Python можно выполнить проверку использовав вышеописанные условия:

Проверка с дополнительными условиями elif

Данная программа поможет лучше понять логику проверки года на високосность.

Name already in use

informatics.mccme.ru / python / 1 / 2 / 253.py /

  • Go to file T
  • Go to line L
  • Go to definition R
  • Copy path
  • Copy permalink
  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents

Copy raw contents

Copy raw contents

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

Модуль Calendar в Python

В Python есть встроенный модуль Calendar, который содержит полезные классы и функции для поддержки различных операций с календарем. По умолчанию модуль «Calendar» следует григорианскому календарю, где понедельник – это первый день (0) недели, а воскресенье –последний день недели (6).

В Python модули datetime и time также предоставляют низкоуровневые функции, связанные с календарем. В дополнение к этим модулям, модуль Calendar предоставляет важные функции, связанные с отображением и управлением календарями.

Для печати календарей и управления ими в модуле Calendar есть 3 важных класса: Calendar, TextCalendar и HTMLCalendar. В этой статье мы увидим, как эти классы могут помочь реализовать множество функций, связанных с календарем.

Функциональные возможности

Чтобы использовать модуль Calendar, нам нужно сначала импортировать модуль, используя:

Давайте посмотрим на список полезных функций в этом модуле.

Печать календаря на определенный месяц

Мы можем распечатать календарь на определенный месяц, используя следующую функцию:

Аргументы, передаваемые этой функции, – это год (yyyy), месяц (m), ширина столбца даты (w) и количество строк в неделю (l), соответственно. Например, давайте воспользуемся этой функцией для печати календаря на март 2019 года:

Печать календаря на определенный год

Мы можем распечатать календарь на целый год, используя следующую функцию:

Вышеупомянутая функция возвращает календарь на весь год для года, указанного в качестве аргумента. В эту функцию передаются следующие аргументы: год (yyyy), ширина столбца даты (w), количество строк в неделю (l), количество пробелов между столбцом месяца (c), количество столбцов (m).

Например, чтобы распечатать календарь на 2019 год, используйте:

Примечание. Вместо использования «print» мы можем поочередно использовать функции calendar.prmonth() и calendar.pryear() для печати календарей на месяц и год. Эти функции распечатывают вывод на вашем терминале.

Проверка на високосный год

Мы можем использовать функцию isleap(), чтобы проверить, является ли год високосным или нет. Год передается в качестве аргумента функции, и функция возвращает True, если год високосный, в противном случае возвращает False, если год не високосный. Давайте воспользуемся этой функцией, чтобы увидеть, является ли 2016 год високосным:

Количество високосных лет в пределах диапазона

Также можно проверить количество високосных лет в заданном диапазоне лет, указанном в качестве аргумента функции ниже:

Аргументы, переданные в функцию, – это 2 действительных значения года. Эта функция возвращает количество високосных лет между этими годами.

Как видно, между 2000 и 2017 годами 5 високосных лет, следовательно, результат равен 5.

Возврат дня недели

Метод буднего дня принимает 3 аргумента, а именно: год, месяц и день. Функция возвращает день недели, при этом понедельник имеет индекс 0, а воскресенье – 6. Например:

Как видно, эта функция возвращает значение индекса «3», то есть «четверг».

Получение сокращенных названий дней недели

Функция weekheader принимает аргумент n, который указывает количество символов для определенного имени дня недели и возвращает заголовок, содержащий сокращенные имена дней недели.

Получение количества дней в месяце

Функция monthrange принимает 2 аргумента: год и месяц. Эта функция возвращает кортеж, содержащий индекс дня недели, в который начинается месяц, и количество дней в месяце.

Поскольку первый день декабря 1983 г. был четвергом, функция возвращает значение индекса четверга в качестве первого элемента кортежа и 31, поскольку это количество дней в декабре.

Получение недели в месяце

Функция monthcalendar принимает 2 аргумента: год и месяц и возвращает матрицу, в которой каждая строка представляет неделю в этом месяце.

Как видите, массив каждой недели начинается с понедельника, а дни вне месяца представлены нулями. Итак, первый массив указывает, что первый день месяца – вторник.

Изменение настроек по умолчанию

Настройки календаря по умолчанию можно изменить в соответствии с вашими потребностями. Например, следующий скрипт устанавливает понедельник, как первый день недели.

По умолчанию календари следуют европейскому соглашению, в котором понедельник является первым днем недели, а воскресенье – последним днем недели. Кроме того, месяц январь имеет значение индекса 1, а декабрь – значение индекса 12.

Полезные методы

Ниже приведены некоторые из наиболее полезных методов класса календаря.

iterweekdays()

Этот метод возвращает итератор, содержащий список индексов дней недели.

itermonthdates()

Itermonthdates() принимает 2 аргумента: год и месяц. Эта функция возвращает итератор всех дней данного месяца. Кроме того, отображаются все дни до начала месяца и после его окончания, необходимые для получения полной недели.

itermonthdays()

Этот метод похож на метод itermonthdates, но возвращает только номера дней.

Как видите, все дни до начала месяца и после конца месяца для получения полной недели установлены на «0».

itermonthdays2()

Этот метод отображает кортеж, состоящий из номеров дня и недели.

itermonthdays3()

Этот метод очень похож на метод itermonthdays3(), за исключением того, что он возвращает кортеж из года, месяца и дня месяца.

monthdatescalendar()

Этот метод принимает в качестве аргументов год и месяц и возвращает список полных недель в месяце. Каждая неделя представляет собой список из 7 объектов datetime.date.

monthdays2calendar()

Эта функция принимает в качестве аргументов год и месяц и возвращает список недель с каждой неделей в виде 7 кортежей дня месяца и дня недели.

Как видите, первое значение кортежа – это день месяца (0-31), а второе значение кортежа – это номер недели (0-6).

monthdayscalendar()

Этот метод принимает в качестве аргументов год и месяц и возвращает список полных недель, при этом каждая неделя представляет собой список дней месяца.

yeardatescalendar()

Эта функция принимает год (гггг) и количество месяцев в строке месяца (w). По умолчанию параметр w равен 3. Функция возвращает список строк месяца, где дни – это объекты datetime.date.

yeardays2calendar()

Эта функция принимает год (yyyy) и количество месяцев, которые мы хотим в строке месяца (w). По умолчанию параметр w равен 3. Функция возвращает список недель в виде кортежей дней месяца и дня недели.

yeardayscalendar()

Эта функция принимает год (yyyy) и количество месяцев, которое мы хотим в строке месяца (w). По умолчанию параметр w равен 3. Функция возвращает список недель как день месяца.

Класс TextCalendar

TextCalendar используется для создания текстовых календарей, аналогично классу Calendar. Этот класс принимает конструктор, в котором для первого дня недели по умолчанию установлено значение 0. Давайте посмотрим на методы, предоставляемые классом TextCalendar.

formatmonth()

Этот метод принимает 4 аргумента, а именно: год, месяц, столбец ширины дней (w) и количество строк, используемых каждой неделей (l). Этот метод возвращает многострочную строку.

Это отображает календарь на январь 2019 года.

prmonth()

Этот метод печатает календарь на месяц, возвращенный методом formatmonth. Мы можем использовать эту функцию, чтобы избежать использования функции «print» для печати календаря на терминале.

Чтобы распечатать календарь на январь 2019 года, используйте:

formatyear()

Этот метод возвращает календарь в столбце «m» на весь год. В эту функцию передаются следующие аргументы: год (yyyy), ширина столбца даты (w), количество строк в неделю (l), количество пробелов между столбцом месяца (c), количество столбцов (m).

Класс LocaleTextCalendar

Это подкласс класса TextCalendar. Его конструктор принимает дополнительный аргумент locale. Он вернет названия месяца и дня недели в указанном языковом стандарте. Мы можем создать объект текстового календаря на нашем родном языке. Мы можем получить месяц или дни недели или другие данные для отображения календаря, отформатированного из локальной системы, кроме текущего по умолчанию. Пример:

Это напечатает название месяцев в соответствии с локальной системой.

Класс HTMLCalendar

Это похоже на класс TextCalendar, но генерирует календарь HTML. В конструкторе этого класса для параметра firstweekday установлено значение «0».

Ниже приведены некоторые методы, предоставляемые классом HTMLCalendar.

formatmonth()

Эта функция отображает календарь на месяц в формате таблицы HTML. Мы можем отобразить календарь на апрель 2019 года в виде таблицы HTML, используя:

formatyear()

Этот метод принимает год и количество месяцев в строке (w) в качестве аргументов и печатает календарь всего года в виде таблицы HTML. По умолчанию ширина установлена на 3. Мы можем отобразить календарь на 2019 год в виде таблицы HTML, используя:

formatyearpage()

Этот метод принимает в качестве аргументов год, количество месяцев в строке (w), каскадную таблицу стилей (CSS) и кодировку. Аргументы css и encoding могут иметь значение None, если мы не используем CSS и кодировку. Эта функция отображает календарь на весь год в виде HTML-страницы с шириной по умолчанию 3. Мы можем распечатать календарь на 2019 год в виде HTML-страницы, используя:

Вывод HTMLCalendar похож на текстовую версию, но заключен в HTML-теги. Ячейка таблицы HTML содержит атрибут класса, соответствующий дню недели. Следовательно, HTML-календарь можно стилизовать с помощью CSS.

Класс LocaleHTMLCalendar

Это подкласс класса HTMLCalendar. Его конструктор принимает дополнительный аргумент locale. Он вернет названия месяцев и дней недели в указанном языковом стандарте в виде таблицы HTML. Мы можем создать объект текстового календаря на нашем родном языке. Например, мы можем сгенерировать календарь на апрель 2019 года в виде таблицы HTML в локали en_AU, используя:

Заключение

В этом руководстве мы обсудили использование различных классов и подклассов модуля Calendar в Python для работы с датами для управления значениями, ориентированными на неделю, месяц и год. Мы также обсудили использование функций в модуле Calendar. Наряду с этим мы также реализовали классы TextCalendar и HTMLCalendar для создания предварительно отформатированного вывода.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *