rupython 1.2.10__py3-none-any.whl → 1.2.12__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (17) hide show
  1. rupython/__/342/225/250/320/256/342/225/250/342/226/222/342/225/244/320/231/342/225/250/342/225/225/342/225/250/342/225/241_/342/225/244/320/224/342/225/244/320/223/342/225/250/342/225/234/342/225/250/342/225/221/342/225/244/320/226/342/225/250/342/225/225/342/225/250/342/225/225__.py +9 -0
  2. rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/240/342/225/244/320/221/342/225/250/342/225/225/342/225/250/342/225/234/342/225/244/320/225/342/225/244/320/220.py +206 -0
  3. rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/241/342/225/250/320/244.py +45 -23
  4. rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/244/342/225/250/342/226/221/342/225/244/320/222/342/225/250/342/226/221/342/225/250/320/242/342/225/244/320/220/342/225/250/342/225/241/342/225/250/342/225/235/342/225/244/320/237.py +18 -5
  5. rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/252/342/225/244/320/223/342/225/244/320/227/342/225/250/342/226/221.py +87 -0
  6. rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/252/342/225/250/342/225/233/342/225/250/342/225/227/342/225/250/342/225/227/342/225/250/342/225/241/342/225/250/342/225/221/342/225/244/320/226/342/225/250/342/225/225/342/225/250/342/225/225.py +279 -146
  7. rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/256/342/225/244/320/227/342/225/250/342/225/241/342/225/244/320/220/342/225/250/342/225/241/342/225/250/342/224/244/342/225/244/320/234.py +177 -0
  8. rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/257/342/225/250/342/225/233/342/225/244/320/222/342/225/250/342/225/233/342/225/250/342/225/221/342/225/250/342/225/225.py +273 -0
  9. rupython//342/225/250/320/254/342/225/250/342/225/233/342/225/250/342/224/244/342/225/244/320/223/342/225/250/342/225/227/342/225/250/342/225/225//342/225/250/320/260/342/225/250/342/225/241/342/225/250/342/224/202/342/225/250/320/242/342/225/244/320/233/342/225/244/320/220.py +9 -9
  10. rupython//342/225/250/320/257/342/225/244/320/220/342/225/250/342/225/241/342/225/250/342/225/233/342/225/250/342/226/222/342/225/244/320/220/342/225/250/342/226/221/342/225/250/342/225/226/342/225/250/342/225/233/342/225/250/342/226/223/342/225/250/342/226/221/342/225/244/320/222/342/225/250/342/225/241/342/225/250/342/225/227/342/225/244/320/234.py +3 -3
  11. rupython-1.2.12.dist-info/LICENSE +27 -0
  12. {rupython-1.2.10.dist-info → rupython-1.2.12.dist-info}/METADATA +2 -2
  13. rupython-1.2.12.dist-info/RECORD +19 -0
  14. rupython-1.2.10.dist-info/LICENSE +0 -1
  15. rupython-1.2.10.dist-info/RECORD +0 -15
  16. {rupython-1.2.10.dist-info → rupython-1.2.12.dist-info}/WHEEL +0 -0
  17. {rupython-1.2.10.dist-info → rupython-1.2.12.dist-info}/top_level.txt +0 -0
@@ -20,3 +20,12 @@ def Ожидать_нажатие_клавиши(сообщение):
20
20
  старые_настройки = termios.tcgetattr(fd)
21
21
  try: tty.setraw(fd); Система.stdin.read(1)
22
22
  finally: termios.tcsetattr(fd, termios.TCSADRAIN, старые_настройки)
23
+
24
+ def Склонение_после_числительного(число, слова):
25
+ return str(число) + ' ' + (
26
+ слова[2] if число % 100 >= 5 and число % 100 <= 20 else (
27
+ слова[0] if число % 10 == 1 else (
28
+ слова[1] if число % 10 >= 2 and число % 10 <= 4 else слова[2]
29
+ )
30
+ )
31
+ )
@@ -0,0 +1,206 @@
1
+ import queue
2
+ from rupython import __Общие_функции__
3
+
4
+ Очередь_пуста = queue.Empty
5
+ Очередь_полна = queue.Full
6
+
7
+ Словарь_параметров = {
8
+ 'максимальный_размер': 'maxsize',
9
+ 'элемент': 'item',
10
+ 'блоковать': 'block',
11
+ 'таймаут': 'timeout',
12
+ 'приоритет': 'priority'
13
+ }
14
+
15
+ Словарь_склонений = {
16
+ 'элемент': ['элемент', 'элемента', 'элементов'],
17
+ 'задача': ['задача', 'задачи', 'задач']
18
+ }
19
+
20
+ class Очередь:
21
+ def __init__(здесь, максимальный_размер = 0):
22
+ ИА = {'maxsize': максимальный_размер}
23
+ здесь._queue = queue.Queue(**ИА)
24
+
25
+ def Добавить(здесь, элемент, блоковать = True, таймаут = None):
26
+ ИА = {'item': элемент, 'block': блоковать}
27
+ if таймаут is not None:
28
+ ИА['timeout'] = таймаут
29
+ здесь._queue.put(**ИА)
30
+
31
+ def Добавить_без_блокования(здесь, элемент):
32
+ здесь._queue.put_nowait(элемент)
33
+
34
+ def Получить(здесь, блоковать = True, таймаут = None):
35
+ ИА = {'block': блоковать}
36
+ if таймаут is not None:
37
+ ИА['timeout'] = таймаут
38
+ return здесь._queue.get(**ИА)
39
+
40
+ def Получить_без_блокования(здесь):
41
+ return здесь._queue.get_nowait()
42
+
43
+ def Задача_выполнена(здесь):
44
+ здесь._queue.task_done()
45
+
46
+ def Ждать_завершения(здесь):
47
+ здесь._queue.join()
48
+
49
+ def Пустая(здесь):
50
+ return здесь._queue.empty()
51
+
52
+ def Полная(здесь):
53
+ return здесь._queue.full()
54
+
55
+ def Размер(здесь):
56
+ return здесь._queue.qsize()
57
+
58
+ def __len__(здесь):
59
+ return здесь._queue.qsize()
60
+
61
+ def __str__(здесь):
62
+ размер = здесь.Размер()
63
+ return f"Очередь с {__Общие_функции__.Склонение_после_числительного(размер, Словарь_склонений['элемент'])}"
64
+
65
+ def В_строку_с_задачами(здесь):
66
+ размер = здесь.Размер()
67
+ return f"Очередь с {__Общие_функции__.Склонение_после_числительного(размер, Словарь_склонений['задача'])}"
68
+
69
+ class Стековая_очередь:
70
+ def __init__(здесь, максимальный_размер = 0):
71
+ ИА = {'maxsize': максимальный_размер}
72
+ здесь._queue = queue.LifoQueue(**ИА)
73
+
74
+ def Добавить(здесь, элемент, блоковать = True, таймаут = None):
75
+ ИА = {'item': элемент, 'block': блоковать}
76
+ if таймаут is not None:
77
+ ИА['timeout'] = таймаут
78
+ здесь._queue.put(**ИА)
79
+
80
+ def Добавить_без_блокования(здесь, элемент):
81
+ здесь._queue.put_nowait(элемент)
82
+
83
+ def Получить(здесь, блоковать = True, таймаут = None):
84
+ ИА = {'block': блоковать}
85
+ if таймаут is not None:
86
+ ИА['timeout'] = таймаут
87
+ return здесь._queue.get(**ИА)
88
+
89
+ def Получить_без_блокования(здесь):
90
+ return здесь._queue.get_nowait()
91
+
92
+ def Задача_выполнена(здесь):
93
+ здесь._queue.task_done()
94
+
95
+ def Ждать_завершения(здесь):
96
+ здесь._queue.join()
97
+
98
+ def Пустая(здесь):
99
+ return здесь._queue.empty()
100
+
101
+ def Полная(здесь):
102
+ return здесь._queue.full()
103
+
104
+ def Размер(здесь):
105
+ return здесь._queue.qsize()
106
+
107
+ def __len__(здесь):
108
+ return здесь._queue.qsize()
109
+
110
+ def __str__(здесь):
111
+ размер = здесь.Размер()
112
+ return f"Стековая_очередь с {__Общие_функции__.Склонение_после_числительного(размер, Словарь_склонений['элемент'])}"
113
+
114
+ def В_строку_с_задачами(здесь):
115
+ размер = здесь.Размер()
116
+ return f"Стековая_очередь с {__Общие_функции__.Склонение_после_числительного(размер, Словарь_склонений['задача'])}"
117
+
118
+ class Приоритетная_очередь:
119
+ def __init__(здесь, максимальный_размер = 0):
120
+ ИА = {'maxsize': максимальный_размер}
121
+ здесь._queue = queue.PriorityQueue(**ИА)
122
+
123
+ def Добавить(здесь, элемент, приоритет, блоковать = True, таймаут = None):
124
+ ИА = {'item': (приоритет, элемент), 'block': блоковать}
125
+ if таймаут is not None:
126
+ ИА['timeout'] = таймаут
127
+ здесь._queue.put(**ИА)
128
+
129
+ def Добавить_без_блокования(здесь, элемент, приоритет):
130
+ здесь._queue.put_nowait((приоритет, элемент))
131
+
132
+ def Получить(здесь, блоковать = True, таймаут = None):
133
+ ИА = {'block': блоковать}
134
+ if таймаут is not None:
135
+ ИА['timeout'] = таймаут
136
+ приоритет, элемент = здесь._queue.get(**ИА)
137
+ return элемент
138
+
139
+ def Получить_с_приоритетом(здесь, блоковать = True, таймаут = None):
140
+ ИА = {'block': блоковать}
141
+ if таймаут is not None:
142
+ ИА['timeout'] = таймаут
143
+ return здесь._queue.get(**ИА)
144
+
145
+ def Получить_без_блокования(здесь):
146
+ приоритет, элемент = здесь._queue.get_nowait()
147
+ return элемент
148
+
149
+ def Получить_без_блокования_с_приоритетом(здесь):
150
+ return здесь._queue.get_nowait()
151
+
152
+ def Задача_выполнена(здесь):
153
+ здесь._queue.task_done()
154
+
155
+ def Ждать_завершения(здесь):
156
+ здесь._queue.join()
157
+
158
+ def Пустая(здесь):
159
+ return здесь._queue.empty()
160
+
161
+ def Полная(здесь):
162
+ return здесь._queue.full()
163
+
164
+ def Размер(здесь):
165
+ return здесь._queue.qsize()
166
+
167
+ def __len__(здесь):
168
+ return здесь._queue.qsize()
169
+
170
+ def __str__(здесь):
171
+ размер = здесь.Размер()
172
+ return f"Приоритетная_очередь с {__Общие_функции__.Склонение_после_числительного(размер, Словарь_склонений['элемент'])}"
173
+
174
+ def В_строку_с_задачами(здесь):
175
+ размер = здесь.Размер()
176
+ return f"Приоритетная_очередь с {__Общие_функции__.Склонение_после_числительного(размер, Словарь_склонений['задача'])}"
177
+
178
+ class Простая_очередь:
179
+ def __init__(здесь):
180
+ здесь._queue = queue.SimpleQueue()
181
+
182
+ def Добавить(здесь, элемент):
183
+ здесь._queue.put(элемент)
184
+
185
+ def Получить(здесь):
186
+ return здесь._queue.get()
187
+
188
+ def Получить_без_блокования(здесь):
189
+ return здесь._queue.get_nowait()
190
+
191
+ def Пустая(здесь):
192
+ здесь._queue.empty()
193
+
194
+ def Размер(здесь):
195
+ return здесь._queue.qsize()
196
+
197
+ def __len__(здесь):
198
+ return здесь._queue.qsize()
199
+
200
+ def __str__(здесь):
201
+ размер = здесь.Размер()
202
+ return f"Простая_очередь с {__Общие_функции__.Склонение_после_числительного(размер, Словарь_склонений['элемент'])}"
203
+
204
+ def В_строку_с_задачами(здесь):
205
+ размер = здесь.Размер()
206
+ return f"Простая_очередь с {__Общие_функции__.Склонение_после_числительного(размер, Словарь_склонений['задача'])}"
@@ -47,7 +47,11 @@ import re as РегВыр
47
47
  'ПО': 'ON',
48
48
  'ПЕРЕКРЁСТНО': 'CROSS',
49
49
  'ИСПОЛЬЗУЯ': 'USING',
50
- 'ВСТАВИТЬ ИЛИ ___ В': 'INSERT OR ___ INTO',
50
+ 'ВСТАВИТЬ ИЛИ ПРЕРВАТЬ В': 'INSERT OR ABORT INTO',
51
+ 'ВСТАВИТЬ ИЛИ СБОЙ В': 'INSERT OR FAIL INTO',
52
+ 'ВСТАВИТЬ ИЛИ ПРОПУСТИТЬ В': 'INSERT OR IGNORE INTO',
53
+ 'ВСТАВИТЬ ИЛИ ЗАМЕНИТЬ В': 'INSERT OR REPLACE INTO',
54
+ 'ВСТАВИТЬ ИЛИ ОТКАТИТЬ В': 'INSERT OR ROLLBACK INTO',
51
55
  'ДОБАВИТЬ В': 'INSERT INTO',
52
56
  'ЗНАЧЕНИЯ': 'VALUES',
53
57
  'ИЗМЕНИТЬ': 'UPDATE',
@@ -121,7 +125,38 @@ import re as РегВыр
121
125
  'ПО_УМОЛЧАНИЮ': 'DEFAULT',
122
126
  'САМОУВЕЛИЧИВАЮЩЕЕСЯ': 'AUTOINCREMENT',
123
127
  'ССЫЛАЕТСЯ НА': 'REFERENCES',
128
+ 'БЕЗ ИСКЛЮЧЕНИЙ': 'EXCLUDE NO OTHERS',
129
+ 'ИСКЛЮЧАЯ ТЕКУЩУЮ СТРОКУ': 'EXCLUDE CURRENT ROW',
130
+ 'ИСКЛЮЧАЯ ГРУППУ': 'EXCLUDE GROUP',
131
+ 'ИСКЛЮЧАЯ РАВНЫЕ': 'EXCLUDE TIES',
132
+ 'РАЗДЕЛИВ ПО': 'PARTITION BY',
124
133
  'ОТОБРАВ': 'FILTER',
134
+ 'ПРИВЕСТИ': 'CAST',
135
+ 'НАД': 'OVER',
136
+ 'ГРУППЫ': 'GROUPS',
137
+ 'ДИАПАЗОН': 'RANGE',
138
+ 'СТРОКИ': 'ROWS',
139
+ 'ПЕРВОЕ_НЕПУСТОЕ': 'COALESCE',
140
+ 'ТЕКУЩЕЙ СТРОКОЙ': 'CURRENT ROW',
141
+ 'НЕОГРАНИЧЕННО': 'UNBOUNDED',
142
+ 'ВПЕРЁД': 'FOLLOWING',
143
+ 'НАЗАД': 'PRECEDING',
144
+ 'НОМЕР_СТРОКИ': 'ROW_NUMBER',
145
+ 'РАНГ': 'RANK',
146
+ 'СЖАТЫЙ_РАНГ': 'DENSE_RANK',
147
+ 'РАЗДЕЛИТЬ_НА_ЧАСТИ': 'NTILE',
148
+ 'ПРЕДЫДУЩЕЕ': 'LAG',
149
+ 'СЛЕДУЮЩЕЕ': 'LEAD',
150
+ 'SIN': 'SIN',
151
+ 'COS': 'COS',
152
+ 'TG': 'TAN',
153
+ 'ARCSIN': 'ASIN',
154
+ 'ARCCOS': 'ACOS',
155
+ 'ARCTG': 'ATAN',
156
+ 'LN': 'LOG',
157
+ 'EXP': 'EXP',
158
+ 'СТЕПЕНЬ': 'POWER',
159
+ 'КВАДРАТНЫЙ_КОРЕНЬ': 'SQRT',
125
160
  'КОЛИЧЕСТВО': 'COUNT',
126
161
  'СУММА': 'SUM',
127
162
  'СРЕДНЕЕ': 'AVG',
@@ -156,14 +191,16 @@ import re as РегВыр
156
191
  'ОБРЕЗАТЬ_СЛЕВА': 'LTRIM',
157
192
  'ОБРЕЗАТЬ_СПРАВА': 'RTRIM',
158
193
  'ОБЩЕЕ': 'TOTAL',
194
+ 'ГРУППОВОЕ_СЦЕПЛЕНИЕ': 'GROUP_CONCAT',
159
195
  'СТАНДАРТНОЕ_ОТКЛОНЕНИЕ': 'STDDEV',
160
196
  'ДИСПЕРСИЯ': 'VARIANCE',
161
- 'СТРОКА_В_ЧИСЛО': 'CAST',
197
+ 'ПЕРВОЕ_ЗНАЧЕНИЕ': 'FIRST_VALUE',
198
+ 'ПОСЛЕДНЕЕ_ЗНАЧЕНИЕ': 'LAST_VALUE',
162
199
  'МАКСИМАЛЬНАЯ_ДЛИНА': 'MAXLEN',
163
200
  'МИНИМАЛЬНАЯ_ДЛИНА': 'MINLEN',
164
201
  'СЖАТЬ': 'COMPRESS',
165
202
  'РАСЖАТЬ': 'UNCOMPRESS',
166
- 'ВЫЧИСЛИТЬ_ХЭШ': 'HEX',
203
+ 'В_ШЕСТН_ТЕКСТ': 'HEX',
167
204
  'ЗАКОДОВАТЬ_64': 'BASE64',
168
205
  'РАСКОДОВАТЬ_64': 'UNBASE64',
169
206
  'ВКЛЮЧЕНО': 'ON',
@@ -287,7 +324,7 @@ def Получить_токены(запрос):
287
324
  def Перевести_токены(токены):
288
325
  переведённые_токены = []
289
326
  i = 0
290
-
327
+
291
328
  while i < len(токены):
292
329
  токен = токены[i]
293
330
 
@@ -301,30 +338,15 @@ def Перевести_токены(токены):
301
338
  найдено_ключевое_слово = False
302
339
  for длина in range(5, 0, -1):
303
340
  if i + длина <= len(токены):
304
- фраза = ' '.join(токены[i:i + длина]).upper()
305
-
306
- for ключ, значение in Словарь_перевода.items():
307
- if '___' in ключ:
308
- шаблон = '^' + ключ.replace('___', r'(\S+)') + '$'
309
- совпадение = РегВыр.match(шаблон, фраза)
310
- if совпадение:
311
- переменная = совпадение.group(1).upper()
312
- if переменная in Словарь_перевода:
313
- переведённая_переменная = Словарь_перевода[переменная]
314
- переведённая_фраза = значение.replace('___', переведённая_переменная)
315
- переведённые_токены.append(переведённая_фраза)
316
- i += длина
317
- найдено_ключевое_слово = True
318
- break
319
-
320
- if найдено_ключевое_слово:
321
- break
322
-
341
+ фраза = ' '.join(токены[i:i + длина])
323
342
  if фраза in Словарь_перевода:
324
343
  переведённые_токены.append(Словарь_перевода[фраза])
325
344
  i += длина
326
345
  найдено_ключевое_слово = True
327
346
  break
347
+ if not найдено_ключевое_слово:
348
+ переведённые_токены.append(токен)
349
+ i += 1
328
350
 
329
351
  return переведённые_токены
330
352
 
@@ -68,11 +68,11 @@ class Дата_и_время:
68
68
  здесь._дата_время = datetime.datetime(*ПА, **ИА)
69
69
 
70
70
  @staticmethod
71
- def Сейчас(часовой_пояс=None):
71
+ def Сейчас(часовой_пояс = None):
72
72
  return Дата_и_время(datetime.datetime.now(часовой_пояс))
73
73
 
74
74
  @staticmethod
75
- def Из_метки_времени(метка_времени, часовой_пояс=None):
75
+ def Из_метки_времени(метка_времени, часовой_пояс = None):
76
76
  return Дата_и_время(datetime.datetime.fromtimestamp(метка_времени, часовой_пояс))
77
77
 
78
78
  @staticmethod
@@ -88,11 +88,11 @@ class Дата_и_время:
88
88
  формат = Перевести_формат(формат)
89
89
  return здесь._дата_время.strftime(формат)
90
90
 
91
- def __str__(строка):
91
+ def __str__(здесь):
92
92
  формат = Перевести_формат(Формат_даты_и_времени)
93
93
  return здесь._дата_время.strftime(формат)
94
94
 
95
- def Словами(здесь, формат='полный'):
95
+ def Словами(здесь, формат = 'полный'):
96
96
  день_недели = здесь.Номер_дня_недели()
97
97
  if формат == 'полный':
98
98
  return f"{Дни_недели_полные[день_недели]}, {здесь.День} {Месяцы_родительный[здесь.Месяц]} {здесь.Год} года, {здесь.Часов:02d}:{здесь.Минут:02d}"
@@ -162,6 +162,9 @@ class Дата_и_время:
162
162
  return здесь._дата_время >= другой._дата_время
163
163
  return NotImplemented
164
164
 
165
+ def __format__(здесь, формат):
166
+ return здесь.В_формат(формат)
167
+
165
168
  @property
166
169
  def Год(здесь):
167
170
  return здесь._дата_время.year
@@ -220,7 +223,7 @@ class Дата:
220
223
  return здесь._дата.strftime(формат)
221
224
 
222
225
  def Из_строки(строка):
223
- return Время(Дата_и_время.Разобрать(строка, Формат_времени)._дата_время.time())
226
+ return Дата(Дата_и_время.Разобрать(строка, Формат_времени)._дата_время.time())
224
227
 
225
228
  def День_недели(здесь):
226
229
  return здесь._дата.isoweekday()
@@ -271,6 +274,9 @@ class Дата:
271
274
  return здесь._дата >= другой._дата
272
275
  return NotImplemented
273
276
 
277
+ def __format__(здесь, формат):
278
+ return здесь.В_формат(формат)
279
+
274
280
  @property
275
281
  def год(здесь): return здесь._дата.year
276
282
 
@@ -287,6 +293,10 @@ class Время:
287
293
  )
288
294
  здесь._время = datetime.time(*ПА, **ИА)
289
295
 
296
+ @staticmethod
297
+ def Сейчас(часовой_пояс=None):
298
+ return Время(datetime.datetime.now(часовой_пояс).time())
299
+
290
300
  def В_формат(здесь, формат):
291
301
  формат = Перевести_формат(формат)
292
302
  return здесь._время.strftime(формат)
@@ -351,6 +361,9 @@ class Время:
351
361
  return здесь._время >= другой._время
352
362
  return NotImplemented
353
363
 
364
+ def __format__(здесь, формат):
365
+ return здесь.В_формат(формат)
366
+
354
367
  @property
355
368
  def Часов(здесь):
356
369
  return здесь._время.hour
@@ -0,0 +1,87 @@
1
+ import heapq
2
+ from rupython import __Общие_функции__
3
+
4
+ # Словарь для перевода параметров
5
+ Словарь_параметров = {
6
+ 'перебираемое': 'iterable',
7
+ 'ключ': 'key',
8
+ 'количество': 'n',
9
+ 'элемент': 'item'
10
+ }
11
+
12
+ Словарь_склонений = {
13
+ 'элемент': ['элемент', 'элемента', 'элементов']
14
+ }
15
+
16
+ def Склонение_после_числительного(число, слова):
17
+ return str(число) + ' ' + (
18
+ слова[2] if число % 100 >= 5 and число % 100 <= 20 else (
19
+ слова[0] if число % 10 == 1 else (
20
+ слова[1] if число % 10 >= 2 and число % 10 <= 4 else слова[2]
21
+ )
22
+ )
23
+ )
24
+
25
+ class Куча:
26
+ def __init__(здесь, перебираемое=None):
27
+ здесь._heap = list(перебираемое or [])
28
+ heapq.heapify(здесь._heap)
29
+
30
+ def Добавить(здесь, элемент):
31
+ heapq.heappush(здесь._heap, элемент)
32
+
33
+ def Извлечь(здесь):
34
+ if not здесь._heap:
35
+ raise IndexError("Куча пуста")
36
+ return heapq.heappop(здесь._heap)
37
+
38
+ def Добавить_и_извлечь(здесь, элемент):
39
+ return heapq.heappushpop(здесь._heap, элемент)
40
+
41
+ def Заменить(здесь, элемент):
42
+ if not здесь._heap:
43
+ raise IndexError("Куча пуста")
44
+ return heapq.heapreplace(здесь._heap, элемент)
45
+
46
+ def Наибольшие(здесь, количество, ключ=None):
47
+ kwargs = {'n': количество}
48
+ if ключ is not None:
49
+ kwargs['key'] = ключ
50
+ return heapq.nlargest(**kwargs, iterable=здесь._heap)
51
+
52
+ def Наименьшие(здесь, количество, ключ=None):
53
+ kwargs = {'n': количество}
54
+ if ключ is not None:
55
+ kwargs['key'] = ключ
56
+ return heapq.nsmallest(**kwargs, iterable=здесь._heap)
57
+
58
+ def Размер(здесь):
59
+ return len(здесь._heap)
60
+
61
+ def Пустая(здесь):
62
+ return len(здесь._heap) == 0
63
+
64
+ def Получить_список(здесь):
65
+ return list(здесь._heap)
66
+
67
+ def __len__(здесь):
68
+ return len(здесь._heap)
69
+
70
+ def __iter__(здесь):
71
+ return iter(здесь._heap)
72
+
73
+ def __contains__(здесь, элемент):
74
+ return элемент in здесь._heap
75
+
76
+ def __str__(здесь):
77
+ размер = здесь.Размер()
78
+ return f"Куча с {Склонение_после_числительного(размер, Словарь_склонений['элемент'])}: {здесь._heap}"
79
+
80
+ def Слить_кучи(*перебираемые, ключ=None):
81
+ kwargs = {}
82
+ if ключ is not None:
83
+ kwargs['key'] = ключ
84
+ return heapq.merge(*перебираемые, **kwargs)
85
+
86
+ def Создать_кучу(перебираемое):
87
+ return Куча(перебираемое)