Python: задачки и вопросы
Kanalga Telegram’da o‘tish
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/media
Ko'proq ko'rsatish6 877
Obunachilar
-524 soatlar
-167 kun
-4830 kun
Ma'lumotlar yuklanmoqda
O'xshash kanallar
Taglar buluti
Kirish va chiqish esdaliklari
---
---
---
---
---
---
Obunachilarni jalb qilish
Oktabr '26Okt '26
Oktabr '26
+43
0 kanalda
Sentabr '26
+32
0 kanalda
Get PRO
Avgust '26
+24
0 kanalda
Get PRO
Iyul '26
+28
1 kanalda
Get PRO
Iyun '26
+48
0 kanalda
Get PRO
May '26
+58
1 kanalda
Get PRO
Aprel '26
+33
0 kanalda
Get PRO
Mart '26
+29
1 kanalda
Get PRO
Fevral '26
+32
1 kanalda
Get PRO
Yanvar '26
+39
0 kanalda
Get PRO
Dekabr '25
+44
0 kanalda
Get PRO
Noyabr '25
+102
3 kanalda
Get PRO
Oktabr '25
+61
0 kanalda
Get PRO
Sentabr '25
+56
1 kanalda
Get PRO
Avgust '25
+65
3 kanalda
Get PRO
Iyul '25
+58
0 kanalda
Get PRO
Iyun '25
+56
0 kanalda
Get PRO
May '25
+52
0 kanalda
Get PRO
Aprel '25
+89
0 kanalda
Get PRO
Mart '25
+77
1 kanalda
Get PRO
Fevral '25
+108
3 kanalda
Get PRO
Yanvar '25
+115
2 kanalda
Get PRO
Dekabr '24
+94
1 kanalda
Get PRO
Noyabr '24
+81
1 kanalda
Get PRO
Oktabr '24
+78
0 kanalda
Get PRO
Sentabr '24
+82
0 kanalda
Get PRO
Avgust '24
+75
0 kanalda
Get PRO
Iyul '24
+73
0 kanalda
Get PRO
Iyun '24
+82
0 kanalda
Get PRO
May '24
+163
2 kanalda
Get PRO
Aprel '24
+158
0 kanalda
Get PRO
Mart '24
+117
0 kanalda
Get PRO
Fevral '24
+117
0 kanalda
Get PRO
Yanvar '24
+143
1 kanalda
Get PRO
Dekabr '23
+140
0 kanalda
Get PRO
Noyabr '23
+120
0 kanalda
Get PRO
Oktabr '23
+94
0 kanalda
Get PRO
Sentabr '23
+95
0 kanalda
Get PRO
Avgust '23
+145
0 kanalda
Get PRO
Iyul '23
+312
0 kanalda
Get PRO
Iyun '23
+90
0 kanalda
Get PRO
May '23
+140
0 kanalda
Get PRO
Aprel '23
+258
0 kanalda
Get PRO
Mart '23
+217
0 kanalda
Get PRO
Fevral '23
+307
0 kanalda
Get PRO
Yanvar '23
+222
0 kanalda
Get PRO
Dekabr '22
+327
0 kanalda
Get PRO
Noyabr '22
+256
0 kanalda
Get PRO
Oktabr '22
+286
0 kanalda
Get PRO
Sentabr '22
+294
0 kanalda
Get PRO
Avgust '22
+652
0 kanalda
Get PRO
Iyul '22
+410
0 kanalda
Get PRO
Iyun '22
+246
0 kanalda
Get PRO
May '22
+360
0 kanalda
Get PRO
Aprel '22
+266
0 kanalda
Get PRO
Mart '22
+204
0 kanalda
Get PRO
Fevral '22
+340
0 kanalda
Get PRO
Yanvar '22
+2 183
0 kanalda
Get PRO
Dekabr '21
+2 522
0 kanalda
Get PRO
Noyabr '21
+1 808
0 kanalda
Get PRO
Oktabr '21
+1 036
0 kanalda
| Sana | Obunachilarni jalb qilish | Esdaliklar | Kanallar | |
| 26 Oktabr | +2 | |||
| 25 Oktabr | 0 | |||
| 24 Oktabr | +1 | |||
| 23 Oktabr | +2 | |||
| 22 Oktabr | +3 | |||
| 21 Oktabr | +3 | |||
| 20 Oktabr | 0 | |||
| 19 Oktabr | +1 | |||
| 18 Oktabr | 0 | |||
| 17 Oktabr | +1 | |||
| 16 Oktabr | 0 | |||
| 15 Oktabr | 0 | |||
| 14 Oktabr | 0 | |||
| 13 Oktabr | +1 | |||
| 12 Oktabr | +8 | |||
| 11 Oktabr | +1 | |||
| 10 Oktabr | +2 | |||
| 09 Oktabr | +1 | |||
| 08 Oktabr | +6 | |||
| 07 Oktabr | +2 | |||
| 06 Oktabr | 0 | |||
| 05 Oktabr | 0 | |||
| 04 Oktabr | 0 | |||
| 03 Oktabr | 0 | |||
| 02 Oktabr | +1 | |||
| 01 Oktabr | +8 |
Kanal postlari
Два вызова после замены
1️⃣b.name создаёт связанный метод. Он хранит экземпляр b и функцию из класса Bot на момент обращения.
2️⃣tag сохраняет этот метод. Присваивание Bot.name = name заменяет атрибут класса, а сохранённую функцию внутри tag не меняет.
3️⃣Поэтому tag() вызывает прежнюю функцию и возвращает v1.
4️⃣b.name() ищет атрибут заново, уже после замены. Находит новую функцию и возвращает v2. print выводит v1 v2.
Почему это важно
Если сохранить метод как callback, последующая замена метода класса не обновит этот callback. При необходимости использовать текущую реализацию обращайтесь к методу непосредственно перед вызовом.
| 2 | Matn yo'q... | 159 |
| 3 | Ноль, которого нет
1️⃣a хранит apple=2. У b дополнительно есть pear=0, у c — pear=-1.
2️⃣Нулевое значение не удаляет ключ из b. В обычном словаре наличие такого дополнительного ключа повлияло бы на равенство.
3️⃣С Python 3.10 сравнения Counter считают отсутствующие элементы нулевыми. В a счётчик pear равен нулю для сравнения, как и в b. Поэтому a == b даёт True.
4️⃣В c значение pear равно -1. Ноль и минус один различаются, поэтому a == c даёт False. Итоговая строка: True False.
Почему это важно
Равенство Counter проверяет частоты, а не одинаковый набор сохранённых ключей. Если в тесте важна структура записей, сравнивайте dict(a) и dict(b): здесь они различаются. | 202 |
| 4 | Matn yo'q... | 193 |
| 5 | Настройка на один вызов
1️⃣partial(print, sep="-") создаёт fmt с заранее заданным именованным аргументом sep.
2️⃣В первом вызове свой sep не передан. print использует дефис и выводит a-b.
3️⃣Во втором вызове sep="|" переопределяет сохранённое значение. print получает один sep и выводит a|b, ошибки нет.
4️⃣Это переопределение действует на конкретный вызов: само сохранённое значение в fmt не меняется. Следующий вызов без sep снова использовал бы дефис.
Почему это важно
Именованные аргументы partial можно переопределять при вызове. Для обработчиков это удобные настройки по умолчанию. Позиционные аргументы, связанные в partial, работают иначе: новые позиционные аргументы добавляются к ним. | 197 |
| 6 | Matn yo'q... | 180 |
| 7 | Куда делась запись
1️⃣В исходном словаре число 1 и строка "1" — разные ключи. Обе записи существуют, поэтому первый print выводит 2.
2️⃣При json.dumps числовой ключ преобразуется в строковый. В JSON появляются два одинаковых имени "1", сначала со значением number, затем со значением text.
3️⃣Стандартный json.loads принимает повторяющиеся имена и оставляет последнее значение. Получается словарь с одной парой: '1': 'text'.
4️⃣Последний print выводит число записей и значение строкового ключа: 1 text.
Почему это важно
Сохранение в JSON и обратное чтение не гарантируют сохранения структуры произвольного Python-словаря. Для идентификаторов выберите один тип ключей заранее и проверяйте коллизии при преобразовании. Если нужно сохранить типы ключей, можно передать записи списком пар с явным описанием типа. | 233 |
| 8 | Matn yo'q... | 252 |
| 9 | Порядок подготовки вызова
1️⃣Функция mark печатает переданную метку и возвращает ту же строку. Тело send печатает sent.
2️⃣Сначала готовятся позиционные аргументы, в том числе распакованные через *. Выражение [mark("item")] печатает item и даёт один позиционный аргумент.
3️⃣Затем вычисляется именованный аргумент label. Вызов mark("label") печатает label и возвращает его значение. Написанный левее аргумент здесь вычисляется позже.
4️⃣После подготовки аргументов вызывается send. Итоговые строки: item, label, sent. Такой вызов допустим: после именованного аргумента стоит распаковка *, а не обычный позиционный аргумент.
Почему это важно
Не рассчитывайте на визуальный порядок побочных эффектов в смешанном вызове с *. Если операции должны идти строго по порядку, вычислите их результаты отдельными инструкциями перед вызовом функции. | 274 |
| 10 | Matn yo'q... | 260 |
| 11 | Два момента применения точности
1️⃣В локальном контексте ctx.prec = 3 задаёт три значащие цифры для операций Decimal. Это не число знаков после запятой.
2️⃣Decimal("1.2345") точно сохраняет переданную десятичную строку. Конструктор не обрезает её по prec, поэтому первый print выводит 1.2345.
3️⃣Выражение +price выполняет операцию Decimal в текущем контексте. При точности 3 результат округляется до 1.23.
4️⃣Второй print выводит 1.23. Исходный price не изменился: унарный плюс вернул новое значение.
Почему это важно
Точность контекста влияет на вычисления, а не на количество цифр, которое разрешено загрузить из строки. При расчётах цены различайте точность арифметики и округление до денежной единицы: для фиксированного числа знаков после запятой обычно задают явный quantize. | 293 |
| 12 | Matn yo'q... | 280 |
| 13 | Поиск и вставка
1️⃣Записи rows упорядочены по первому числу. Функция key возвращает это число из каждой строки.
2️⃣bisect_left применяет key к элементам rows, но не к аргументу new. Поэтому при поиске сравниваются число и кортеж. Возникает TypeError, обработчик печатает search failed.
3️⃣insort_left при поиске позиции вычисляет key(new), получая 15. Число попадает между 10 и 20, и вставка успешно находит индекс 1.
4️⃣В список вставляется исходный кортеж, не число 15. Результат: [(10, 'a'), (15, 'b'), (20, 'c')].
Почему это важно
При ручном поиске позиции передавайте значение в пространстве ключей: bisect_left(rows, key(new), key=key). При вставке через insort передают целую запись. Похожие параметры этих функций не означают одинаковую обработку искомого объекта. | 297 |
| 14 | Matn yo'q... | 270 |
| 15 | Что меняют скобки
1️⃣Строка text содержит три имени, разделённые двоеточиями. Оба шаблона находят те же два разделителя.
2️⃣В первом вызове шаблон : не содержит групп. re.split возвращает только части между разделителями: ['api', 'db', 'auth'].
3️⃣Во втором вызове скобки создают захватывающую группу. Её совпадения тоже входят в результат, между соседними частями текста.
4️⃣Поэтому второй список — ['api', ':', 'db', ':', 'auth']. Двоеточия не исчезли: их попросили захватить.
Почему это важно
Так можно разбить выражение на токены и сохранить операторы или пунктуацию. Если скобки нужны лишь для группировки шаблона, используйте незахватывающую группу (?:...), чтобы разделители не добавлялись в результат. | 301 |
| 16 | Matn yo'q... | 296 |
| 17 | Что успевает выполниться
1️⃣Класс Limit определяет метод __int__, который возвращает целое число 2. Экземпляр этого класса сохраняется в limit.
2️⃣Вызов int(limit) использует __int__. Преобразование успешно, поэтому первый print выводит 2.
3️⃣Во втором вызове сначала вычисляется аргумент: срез строки "abcdef" с границей limit. Для такого объекта Python требует метод __index__, возвращающий целое число. Одного __int__ недостаточно.
4️⃣У Limit нет __index__, поэтому возникает TypeError. Второй print не вызывается: в обычном выводе остаётся только 2, а выполнение завершается с ошибкой.
Почему это важно
Вызов int(obj) разрешает объекту преобразоваться в число, но не делает его автоматически допустимым индексом. При создании собственного целочисленного типа для срезов или range нужен __index__. Если же лимит нужно явно преобразовать, это можно сделать в месте использования: "abcdef"[:int(limit)] даст ab. | 294 |
| 18 | Matn yo'q... | 288 |
| 19 | Как меняется буфер
1️⃣В data лежат байты AB. Вызов memoryview(data) создаёт представление того же буфера, не копию данных.
2️⃣Присваивание data[0] = ord("Z") заменяет первый байт без изменения размера. Представление видит эту запись, поэтому первый print выводит b'ZB'.
3️⃣Вызов append пытается увеличить bytearray. Пока view активно, изменение размера запрещено: возникает BufferError, обработчик печатает blocked. Байт C не добавляется.
4️⃣Вызов view.release() освобождает представление. Теперь ограничение на изменение размера, связанное с этим view, снято. Сам bytearray при этом остаётся.
5️⃣Второй append успешно добавляет C. Последний print выводит b'ZBC'. Все три строки: b'ZB', blocked, b'ZBC'.
Почему это важно
Представления помогают обрабатывать бинарные пакеты без копирования. Пока такое представление активно, можно заменять байты внутри буфера, но нельзя расширять bytearray. Перед расширением нужно освободить все активные представления этого буфера. | 298 |
| 20 | Matn yo'q... | 306 |
