Python: задачки и вопросы
الذهاب إلى القناة على Telegram
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/media
إظهار المزيد7 067
المشتركون
-424 ساعات
-127 أيام
-5430 أيام
جاري تحميل البيانات...
القنوات المماثلة
سحابة العلامات
الإشارات الواردة والصادرة
---
---
---
---
---
---
جذب المشتركين
يوليو '26
يوليو '26
+12
في 0 قنوات
يونيو '26
+48
في 0 قنوات
Get PRO
مايو '26
+58
في 1 قنوات
Get PRO
أبريل '26
+33
في 0 قنوات
Get PRO
مارس '26
+29
في 1 قنوات
Get PRO
فبراير '26
+32
في 1 قنوات
Get PRO
يناير '26
+39
في 0 قنوات
Get PRO
ديسمبر '25
+44
في 0 قنوات
Get PRO
نوفمبر '25
+102
في 3 قنوات
Get PRO
أكتوبر '25
+61
في 0 قنوات
Get PRO
سبتمبر '25
+56
في 1 قنوات
Get PRO
أغسطس '25
+65
في 3 قنوات
Get PRO
يوليو '25
+58
في 0 قنوات
Get PRO
يونيو '25
+56
في 0 قنوات
Get PRO
مايو '25
+52
في 0 قنوات
Get PRO
أبريل '25
+89
في 0 قنوات
Get PRO
مارس '25
+77
في 1 قنوات
Get PRO
فبراير '25
+108
في 3 قنوات
Get PRO
يناير '25
+115
في 2 قنوات
Get PRO
ديسمبر '24
+94
في 1 قنوات
Get PRO
نوفمبر '24
+81
في 1 قنوات
Get PRO
أكتوبر '24
+78
في 0 قنوات
Get PRO
سبتمبر '24
+82
في 0 قنوات
Get PRO
أغسطس '24
+75
في 0 قنوات
Get PRO
يوليو '24
+73
في 0 قنوات
Get PRO
يونيو '24
+82
في 0 قنوات
Get PRO
مايو '24
+163
في 2 قنوات
Get PRO
أبريل '24
+158
في 0 قنوات
Get PRO
مارس '24
+117
في 0 قنوات
Get PRO
فبراير '24
+117
في 0 قنوات
Get PRO
يناير '24
+143
في 1 قنوات
Get PRO
ديسمبر '23
+140
في 0 قنوات
Get PRO
نوفمبر '23
+120
في 0 قنوات
Get PRO
أكتوبر '23
+94
في 0 قنوات
Get PRO
سبتمبر '23
+95
في 0 قنوات
Get PRO
أغسطس '23
+145
في 0 قنوات
Get PRO
يوليو '23
+312
في 0 قنوات
Get PRO
يونيو '23
+90
في 0 قنوات
Get PRO
مايو '23
+140
في 0 قنوات
Get PRO
أبريل '23
+258
في 0 قنوات
Get PRO
مارس '23
+217
في 0 قنوات
Get PRO
فبراير '23
+307
في 0 قنوات
Get PRO
يناير '23
+222
في 0 قنوات
Get PRO
ديسمبر '22
+327
في 0 قنوات
Get PRO
نوفمبر '22
+256
في 0 قنوات
Get PRO
أكتوبر '22
+286
في 0 قنوات
Get PRO
سبتمبر '22
+294
في 0 قنوات
Get PRO
أغسطس '22
+652
في 0 قنوات
Get PRO
يوليو '22
+410
في 0 قنوات
Get PRO
يونيو '22
+246
في 0 قنوات
Get PRO
مايو '22
+360
في 0 قنوات
Get PRO
أبريل '22
+266
في 0 قنوات
Get PRO
مارس '22
+204
في 0 قنوات
Get PRO
فبراير '22
+340
في 0 قنوات
Get PRO
يناير '22
+2 183
في 0 قنوات
Get PRO
ديسمبر '21
+2 522
في 0 قنوات
Get PRO
نوفمبر '21
+1 808
في 0 قنوات
Get PRO
أكتوبر '21
+1 036
في 0 قنوات
| التاريخ | نمو المشتركين | الإشارات | القنوات | |
| 14 يوليو | +1 | |||
| 13 يوليو | 0 | |||
| 12 يوليو | +1 | |||
| 11 يوليو | 0 | |||
| 10 يوليو | +1 | |||
| 09 يوليو | +1 | |||
| 08 يوليو | +1 | |||
| 07 يوليو | +3 | |||
| 06 يوليو | 0 | |||
| 05 يوليو | 0 | |||
| 04 يوليو | +1 | |||
| 03 يوليو | +3 | |||
| 02 يوليو | 0 | |||
| 01 يوليو | 0 |
منشورات القناة
Развёрнутое пояснение:
1. Создаётся словарь d с ключами 'a' и 'b'.
2. Запускается цикл for key in d. Python создаёт итератор словаря, который фиксирует его текущий размер.
3. На первой итерации key равно 'a'. Выполняется d['a_copy'] = 1, и размер словаря увеличивается.
4. Когда цикл пытается перейти к следующей итерации, итератор обнаруживает изменение размера и выбрасывает RuntimeError: dictionary changed size during iteration.
5. Программа завершается с этой ошибкой, print(d) не выполняется.
Почему это важно: при обработке конфигов, метрик или логов часто хочется на ходу добавлять производные ключи в тот же словарь, но это приводит к падению. Правильный путь — собирать изменения в отдельную структуру, а затем обновлять оригинал.
| 2 | لا يوجد نص... | 203 |
| 3 | Развёрнутое пояснение:
1. fix(fn) вызывает fn один раз и сохраняет результат в v.
2. fix возвращает lambda, которая всегда отдаёт это же значение v.
3. buf указывает на lambda, а значит все вызовы buf() возвращают один и тот же список.
4. test_a получает этот список, добавляет в него 'a' и печатает ['a'].
5. test_b получает уже изменённый тот же список, добавляет 'b' и печатает ['a', 'b'].
Почему это важно
В pytest фикстура со scope='module' или scope='session' создаёт один объект на все тесты модуля или сессии. Если фикстура отдаёт изменяемый объект — список, словарь, множество, — мутации в одном тесте протекают в другие. На проде это выглядит как flaky-тесты: локально всё зелёное, в CI падает из-за другого порядка, или тесты проходят только по отдельности. Это ложно-зелёный сигнал, который подрывает доверие к регрессии. Причина обычно в неверном scope фикстуры. Правильный подход: scope='function' для изолированных данных, а общие ресурсы делать неизменяемыми или копировать перед использованием.
💻 На практике такие кейсы разбирают в курсе Практикума PRO «Автоматизатор тестирования на Python»: поймёте фикстуры, их scope, изоляцию состояния между тестами и уровни покрытия.
Реклама. Рекламодатель: АНО ДПО "Образовательные технологии Яндекса" ИНН 7704282033, erid: 2W5zFGUXzho | 324 |
| 4 | لا يوجد نص... | 292 |
| 5 | Развёрнутое пояснение:
1. Определяется класс Key с методом __eq__, который сравнивает атрибут val.
2. В Python класс, определяющий __eq__, но не определяющий __hash__, автоматически получает __hash__ = None.
3. При выполнении строки cache = {Key(1): 'hit'} Python пытается вычислить хеш ключа, чтобы разместить его в словаре.
4. Поскольку Key.__hash__ равен None, объект считается нехешируемым, и создание словаря падает с TypeError: unhashable type: 'Key'.
5. Вызов cache.get(Key(1)) не выполняется, потому что программа прерывается раньше.
Почему это важно: кастомные ключи для кэшей, конфигураций или агрегаций часто требуют своего сравнения. Если забыть реализовать __hash__, весь механизм ломается ещё на этапе создания dict или set. В dataclasses это решается через frozen=True для автоматического __hash__, а в собственных классах — явным определением __hash__. | 362 |
| 6 | Развёрнутое пояснение:
1. Первый вызов `load_users('a')` не находит ключ в кэше, выполняет `return []`, сохраняет созданный список в кэше и сразу добавляет в него `'u1'` через `.append`. Теперь в кэше лежит список `['u1']`.
2. Второй вызов `load_users('a')` попадает в кэш и возвращает тот же самый объект-список, а не новый. `.append('u2')` изменяет этот же объект, и он становится `['u1', 'u2']`.
3. Вызов `print(load_users('a'))` снова получает тот же объект из кэша и печатает `['u1', 'u2']`.
Почему это важно: кэширование изменяемых объектов — распространённая ловушка при оптимизации репозиториев, загрузчиков конфигурации и API-клиентов. Если возвращаемый объект мутируется, кэш превращается в разделяемое изменяемое состояние, и разные вызовы начинают влиять друг на друга, что приводит к трудноуловимым багам в продакшене. | 351 |
| 7 | لا يوجد نص... | 357 |
| 8 | لا يوجد نص... | 403 |
| 9 | По шагам:
1. Когда Python встречает class A(metaclass=Meta), он не сразу выполняет тело класса. Сначала он спрашивает у метакласса: «в каком словаре хранить имена этого класса?» — и вызывает Meta.__prepare__.
2. Обычно __prepare__ возвращает пустой словарь, но здесь он возвращает {'x': 10}. То есть тело класса начинает выполняться в пространстве имён, где имя x уже существует и равно 10.
3. Выполняется строка result = x + 5. Python ищет x в текущем пространстве имён, находит 10 и записывает result = 15.
4. Следующей выполняется строка x = 1 — она перезаписывает ключ x в том же словаре. Но result уже вычислен, задним числом он не пересчитывается.
5. В итоге у класса A два атрибута: result = 15 и x = 1. Поэтому print(A.result) выводит 15.
Почему это важно
__prepare__ — редкий хук, но он показывает главное: тело класса — это обычный код, выполняющийся в словаре, которым можно управлять. Именно на этой механике работают Django-модели: вы пишете class Movie(models.Model) с обычными атрибутами, а метакласс превращает их в поля таблицы, валидацию и запросы к базе. Понимание таких вещей — разница между «использую фреймворк» и «понимаю, что он делает». Если хотите прокачаться именно во втором, посмотрите курс Middle Python от Практикума PRO: за 6 месяцев вы глубоко разберёте Django и его ORM, асинхронность на FastAPI, микросервисную архитектуру и соберёте бэкенд из 10+ сервисов.
Реклама. Рекламодатель: АНО ДПО "Образовательные технологии Яндекса" ИНН 7704282033, erid: 2W5zFJM1sK7 | 486 |
| 10 | لا يوجد نص... | 430 |
| 11 | Развёрнутое пояснение:
В сигнатуре функции f параметры a и b стоят до /, поэтому их можно передать только позиционно. Параметр d стоит после *, поэтому его можно передать только по имени. Параметр c находится между / и *, поэтому допускает оба варианта. Корректен вызов с позиционными a, b и именованными c, d. | 528 |
| 12 | لا يوجد نص... | 530 |
| 13 | Привет! Весь июль мы будем вести этот канал в партнёрстве с Яндекс Практикумом PRO.
Драматически ничего не меняется: мы продолжим выкладывать задачки и решения — даже более системно и регулярно, чем последние пару месяцев. А ещё расскажем про большой мидловый курс по Python.
Для нас это новый формат соседства двух брендов — надеемся, будет полезно. А пока, всем отличных выходных 🌴 | 770 |
| 14 | Развёрнутое пояснение:
Код удаляет ключ 'a', после чего порядок становится ['b']. Затем 'a' вставляется заново, а не восстанавливается на старом месте, поэтому итоговый порядок — ['b', 'a']. Это поведение гарантировано с Python 3.7. | 977 |
| 15 | لا يوجد نص... | 900 |
| 16 | لا يوجد نص... | 807 |
| 17 | لا يوجد نص... | 766 |
| 18 | لا يوجد نص... | 794 |
| 19 | لا يوجد نص... | 878 |
| 20 | لا يوجد نص... | 846 |
