Инструменты пользователя

Инструменты сайта


develop:pyton:date

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
develop:pyton:date [2022/02/19 11:19]
admin создано
develop:pyton:date [2022/02/20 10:32] (текущий)
admin
Строка 2: Строка 2:
  
  
 +===== Работа с датой и временем =====
 +Модули:
 +  * **time** - текущие дата/время+ их форматированный вывод
 +  * **datetime** - манипуляции, арифметич операции и т.д.
 +  * **calendar** - календарь
 +  * **timeit** - позволяет измерить время выполнения фрагментов кода
  
  
 +==== Текущие дата/время ====
 +Модуль **time**
 +  * **time()**- вещественное число, кол-во секунд с начала эпохи (01.01.1970)
 +  * **gmtime(<sec>= )**- возвращает **struct_time** текущего времени либо указанному кол-ву сек с начала эпохи
 +  * **localtime(<sec>= )**- тоже самое, ток локальное время
 +  * **mktime(<struct_time>)**- -||-
 +
 +Объект **struct_time** содержит: 
 +  * **tm_year (0)**- год
 +  * **tm_mon (1)**- месяц
 +  * **tm_mday (2)**- день
 +  * **tm_hour (3)**- час
 +  * **tm_min (4)**- мин
 +  * **tm_sec (5)**- сек
 +  * **tm_wday (6)**- день недели
 +  * **tm_yday (7)**- кол-во дней с начала года
 +  * **tm_isdst (8)**- флаг летнего времени 
 +
 +<code python>
 +d= time.gmtime()
 +d.tm_year, d[0]
 +
 +# Все содержимое
 +tuple(d)
 +>> (2017, 11, 21, 14, 19, 34, 1, 325, 0)
 +</code>
 +
 +
 +==== Форматирование даты/время ====
 +  * **strftime(<строка формата>, <struct_time>= )** - ДТ строкой, в указанном формате
 +  * **strptime(<строка с датой>, <строка формата>= )** - разбирает строку в **struct_time**
 +  * **asctime(<struct_time>= )** - строка в формате "%a %b %d %H:%M:%S"
 +  * **ctime(<sec>= )** - аналогично предыдущему, но принимает кол-во секунд
 +
 +<details>
 +<summary>:!: Аргументы форматирования: </summary>
 +  * %a Сокращенное название дня недели Вс, Пн
 +  * %A Полное название дня недели воскресенье, понедельник
 +  * %w День недели в виде десятичного числа 0…6
 +  * %d День месяца в виде десятичной дроби с нулями 01, 02
 +  * %-d день месяца в виде десятичного числа 1, 2..
 +  * %b Сокращенное название месяца Jan, Feb
 +  * %m месяц как десятичное число, дополненное нулями 01, 02
 +  * %-м месяц в виде десятичного числа 1, 2
 +  * %B Полное название месяца Январь, Февраль
 +  * %y год без века в виде десятичного числа, дополненного нулями 99, 00
 +  * %-й год без века в виде десятичного числа 0, 99
 +  * %Y год с веком в виде десятичного числа 2000, 1999
 +  * %H час (24-часовой формат) как десятичное число с нулями 01, 23
 +  * %-H час (24-часовой формат) в виде десятичного числа 1, 23
 +  * %I час (12-часовой формат) в виде десятичного числа с нулевым заполнением 01, 12
 +  * %-I час(12 часов) как десятичное число 1, 12
 +  * %p языковой стандарт AM или PM AM, PM
 +  * %M Минуты в виде десятичного числа, дополненного нулями 01, 59
 +  * %-M Минуты в виде десятичного числа 1, 59
 +  * %S Second как десятичное число, дополненное нулями 01, 59
 +  * %-S Секунда как десятичное число 1, 59
 +  * %f микросекунды в виде десятичного числа, дополненного нулями слева 000000, 999999
 +  * %z смещение UTC в формате +ЧЧММ или -ЧЧММ
 +  * %Z Название часового пояса
 +  * %j день года в виде десятичного числа, дополненного нулями 001, 365
 +  * %-j день года в виде десятичного числа 1 365
 +  * %U Номер недели в году (первым считается воскресенье) 0, 6
 +  * %W Номер недели года 00, 53
 +  * Соответствующее представление даты и времени локали %c Пн, 30 сентября, 07:06:05 2013 г.
 +  * %x языковое стандартное представление даты 30.11.98
 +  * Соответствующее представление времени локали %X 10:03:43
 +  * %% Буквенный символ «%» %
 +</details>
 +
 +
 +==== "Засыпание" скрипта ====
 +time.sleep(sec)
 +
 +
 +==== Модуль "datetime" манипуляции с ДТ ====
 +Модуль содержит классы:
 +  * **timedelta** - дата в виде кол-ва дней, сек, микросек. Экземпляр можно складывать с **date**/**datetime**. Результат будет в этом формате
 +  * **date, time, datetime** - дата, время, комбинация даты/время в виде объекта
 +  * **tzinfo** - time zone
 +
 +
 +=== timedelta ===
 +Конструктор- timedelta(<days>=, <seconds>=, <microsec>=, <milisec>=, <minutes>=, <hours>=, <weeks>= )\\
 +Можно присваивать в порядке следования, либо **именованными аргументами** (timedelta(hours= 1))\\
 +Поддерживаются арифметические операции, сравнение и т.д.\\
 +
 +<code python>
 +d1= datetime.timedelta(days= 2)
 +d2= datetime.timedelta(days= 7)
 +d1 + d2, d1 / d2 ...
 +</code>
 +
 +
 +=== date ===
 +Операции над датами. date(<год>, <месяц>, <день>).\\
 +
 +Для получения есть методы:\\
 +  * **today()** - текущая дата
 +  * **fromtimestamp(<sec>)** - дата, в соответствии кол-ва секунд с начала эпохи
 +  * **fromordinal()** - 
 +
 +<code python>
 +d= datetime.date.today()
 +d.day, d.month, d.year
 +</code>
 +
 +Есть методы: replace(), strftime(), isoformat(), ctime(), timetuple(), toordinal(), weekday(), isoweekday(), isocalendar().\\
 +
 +
 +=== time ===
 +Операции над временем. time(<hour>=, <minute>=, <second>=, <microsec>=, <tzinfo>=, <fold>= )\\
 +**Арифметические действия не поддерживаются**, только сравнение.\\
 +
 +
 +=== datetime ===
 +В целом аналогично предыдущим, включает многое из них, в конструкторе обязательно дата, время не обязательно\\
 +  * **today()**, **now(<Timezone>= )**- если зона не указана, то аналогичен первому методу.\\
 +  * **utcnow()** - текущее время UTC
 +  * **[utc]fromtimestamp(<sec>)**
 +  * **combine(<date>, <time>)** - на основе двух экземпляров
 +  * **strptime(<строка даты>, <формат>)** - строка в дату
 +
 +
 +==== Модуль calendar ====
 +Содержит классы для вывода календаря в простом, текстовом виде\\
 +Базовый класс **Calendar**, возвратит перечень всех чисел указанного месяца, сгруппированных по дням недели\\
 +**TextCalendar (LocateCalendar )** в виде форматированного текста (локализованные названия)\\
 +**HTMLCalendar, LocateHTMLCalendar** в html формате\\
 +
 +<code python>
 +import calendar
 +
 +c= calendar.Calendar(0)
 +print(c.monthdayscalendar(2017, 11))
 +
 +c= calendar.TextCalendar(0)
 +print(c.formatyear(2017))
 +</code>
 +
 +
 +=== Другие функции ===
 +  * **weekheader()** - строка- аббревиатур дней недели
 +  * **isleap()** - проверка года високосный
 +  * **weekday()** - номер дня недели указанной даты
 +
 +Атрибуты:
 +  * **day_[name,abbr]** - список, содержащий перечень локализованных названий дней недели
 +  * **month_[name,abbr]** - список, содержащий перечень локализованных названий месяцев
 +
 +
 +==== Время выполнения фрагментов кода ====
 +Замер не конкретного куска кода а **лишь образца** кода, который передается строкой..\\
 +from timeit import Timer\\
 +Timer(<stmt>=, <setup>=, <timer>= ) - в первом указывается код, который нужно замерить, второй- код который нужно выполнить перед измерением\\
 +
 +<code python>
 +code1= """ for line in arr: ... """
 +t1= Timer(stmt= code1)
 +>> t1.timeit()
 +</code>
 +
 +
 +
 +===== Пользовательские функции =====
 +Оператор **pass** можно использовать как загрузку для пустой функции\\
 +
 +==== Определение и вызов ====
 +Функция сама является объектом, ссылкой, которую можно присваивать переменны, передавать и т.д.\\
 +Поддерживает стандартные атрибуты, такие как: **__name__**, **__doc__**, **__sizeof__**, **__dir__** и т.д., перечень можно получить вызовом функции **dir()**\\
 +
 +
 +==== Расположение определения ====
 +Определение должно быть перед вызовом, при использовании функции **main**, по сути не актуально\\
 +
 +
 +==== Необязательные параметры ====
 +Необязательность имеется ввиду значение по умолчанию, определение по ключам (по имени) поддерживается априори и порядок не имеет значения\\
 +Все **аргументы передаются по ссылке** поэтому изменяемые типы данных **могут изменить исходную переменную**, чтобы избежать, можно передавать копию, (func(var.copy()))\\
 +
 +:!: Что касается предопределенных переменных - они **похоже статические** и **могут накапливать значение** при повторных вызовах, можно указать значение **None**\\
 +
 +
 +==== Переменное число параметров ====
 +Если перед переменной указать звездочку, то принимать сможем **любое кол-во** аргументов, придут они **в кортеже**\\
 +Если две звездочки, тогда в словаре\\
 +Если указать первое затем второе, то функция примет любое кол-во переменных. Указанные между ними параметры можно будет передавать только по именам.\\
 +
 +Если функция не должна принимать переменного кол-ва параметров, но должна принимать только по именам, нужно указать звездочку без имени переменной\\
 +
 +<code python>
 +# Произвольное кол-во параметров
 +def func(*t):
 +  for i in t:
 +    ...
 +
 +# Ф-я примет любые параметры
 +def func(*x, **y):
 +  ...
 +
 +# Аргументы только по именам
 +def func(x=1, y=2, *, a):
 +  ...
 +</code>
 +
 +
 +==== Анонимные функции ====
 +т.н. **лямбда функция**, без имени, в качестве значения возвращает ссылку на объект-функцию, которую можно передать или присвоить переменной\\
 +<code python>
 +f1= lambda: 10 + 20
 +f2= lambda x, y: x + y # аргументы
 +
 +print(f1())
 +print(f2(10, 20))
 +</code>
 +
 +
 +==== Функции-генераторы ====
 +При последовательных вызовах, возвращает очередной элемент какой-либо последовательности, приостановить выполнение в текущем вызове можно оператором **yield**\\
 +Использование этого оператора собсна и делает обычную функцию функцией-генератором\\
 +Удобно при обработке действительно большой последовательности, в таком случае она не будет вся загружаться в память, а будет обрабатываться последовательно\\
 +Эти функции поддерживают метод **__next()__**, позволяющий получить следующее значение\\
 +Можно вкладывать генераторы\\
 +
 +<code python>
 +def func(x, y):
 +  for i in range(1, x+ 1):
 +    yield i ** y
 +
 +i= func(3, 3)
 +print(i.__next__()) # Выведет: 1 (1 ** 3)
 +print(i.__next__()) # Выведет: 8 (2 ** 3)
 +print(i.__next__()) # Выведет: 27 (3 ** 3)
 +print(i.__next__()) # Исключение StopIteration
 +</code>
 +
 +
 +==== Декораторы функции ====
 +Обычные функции, выполняются перед вызовом целевой, для этого нужно указать "@mydecor" перед определением целевой\\
 +В аргументе декора передается ссылка на целевую функцию, видимо\\
 +
 +<code python>
 +def deco(f):
 +  ...
 +  return f # ссылка на целевую ф-ю
 +
 +@deco
 +def func(x):
 +  ...
 +  
 +print (func(10))
 +</code>
 +
 +
 +==== Рекурсия ====
 +Все как обычно, только **кол-во вызовов ограничено** (1К), превышение вызывает исключение\\
 +
 +
 +==== Глобальные и локальные переменные ====
 +Глобальные переменные те что определены за пределами любой функции, и доступны во всем скрипте\\
 +Для обращение к ней из функции, возможно нужно внутри определить ее ключевым словом **global**, т.к. в локальной области по умолчанию переменные не пересекаются с глобальными, даже с одинаковым названием\\
 +
 +
 +==== Вложенные функции ====
 +Внутри вложенной функции **доступна область видимости** родительской функции\\
 +Доступны но изменить во вложенной так просто нельзя видимо, нужно объявить ее там оператором **nonlocal**\\
 +Не забываем что переменные передаются ссылками\\
 +
 +
 +==== Аннотации функций ====
 +Документирование аргументов функций\\
 +<code python>
 +# Описание после двоеточия, можно указать выражение
 +def func(a: "Нужная переменная", b: 10+2= 12) 
 +</code>
  
develop/pyton/date.1645269589.txt.gz · Последнее изменение: 2022/02/19 11:19 — admin