fa
Feedback

فریب کلاهبرداران را نخورید! تل‌متریو این کانال‌ها را شناسایی و برچسب‌گذاری می‌کند 👉 برای مشاهده برچسب، اشتراک تهیه کنید

Python: задачки и вопросы

Python: задачки и вопросы

رفتن به کانال در Telegram

Вопросы и задачки для подготовки к собеседованиям и прокачки навыков Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/media

نمایش بیشتر
6 876
مشترکین
-124 ساعت
-147 روز
-4930 روز
جذب مشترکین
اکتبر '26
اکتبر '26
+43
در 0 کانال‌ها
سپتامبر '26
+32
در 0 کانال‌ها
Get PRO
اوت '26
+24
در 0 کانال‌ها
Get PRO
ژوئیه '26
+28
در 1 کانال‌ها
Get PRO
ژوئن '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 کانال‌ها
تاریخ
رشد مشترکین
اشارات
کانال‌ها
27 اکتبر0
26 اکتبر+2
25 اکتبر0
24 اکتبر+1
23 اکتبر+2
22 اکتبر+3
21 اکتبر+3
20 اکتبر0
19 اکتبر+1
18 اکتبر0
17 اکتبر+1
16 اکتبر0
15 اکتبر0
14 اکتبر0
13 اکتبر+1
12 اکتبر+8
11 اکتبر+1
10 اکتبر+2
09 اکتبر+1
08 اکتبر+6
07 اکتبر+2
06 اکتبر0
05 اکتبر0
04 اکتبر0
03 اکتبر0
02 اکتبر+1
01 اکتبر+8
پست‌های کانال
2
Два вызова после замены 1️⃣b.name создаёт связанный метод. Он хранит экземпляр b и функцию из класса Bot на момент обращения. 2️⃣tag сохраняет этот метод. Присваивание Bot.name = name заменяет атрибут класса, а сохранённую функцию внутри tag не меняет. 3️⃣Поэтому tag() вызывает прежнюю функцию и возвращает v1. 4️⃣b.name() ищет атрибут заново, уже после замены. Находит новую функцию и возвращает v2. print выводит v1 v2. Почему это важно Если сохранить метод как callback, последующая замена метода класса не обновит этот callback. При необходимости использовать текущую реализацию обращайтесь к методу непосредственно перед вызовом.
190
3
بدون متن...
200
4
Ноль, которого нет 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): здесь они различаются.
224
5
بدون متن...
210
6
Настройка на один вызов 1️⃣partial(print, sep="-") создаёт fmt с заранее заданным именованным аргументом sep. 2️⃣В первом вызове свой sep не передан. print использует дефис и выводит a-b. 3️⃣Во втором вызове sep="|" переопределяет сохранённое значение. print получает один sep и выводит a|b, ошибки нет. 4️⃣Это переопределение действует на конкретный вызов: само сохранённое значение в fmt не меняется. Следующий вызов без sep снова использовал бы дефис. Почему это важно Именованные аргументы partial можно переопределять при вызове. Для обработчиков это удобные настройки по умолчанию. Позиционные аргументы, связанные в partial, работают иначе: новые позиционные аргументы добавляются к ним.
215
7
بدون متن...
207
8
Куда делась запись 1️⃣В исходном словаре число 1 и строка "1" — разные ключи. Обе записи существуют, поэтому первый print выводит 2. 2️⃣При json.dumps числовой ключ преобразуется в строковый. В JSON появляются два одинаковых имени "1", сначала со значением number, затем со значением text. 3️⃣Стандартный json.loads принимает повторяющиеся имена и оставляет последнее значение. Получается словарь с одной парой: '1': 'text'. 4️⃣Последний print выводит число записей и значение строкового ключа: 1 text. Почему это важно Сохранение в JSON и обратное чтение не гарантируют сохранения структуры произвольного Python-словаря. Для идентификаторов выберите один тип ключей заранее и проверяйте коллизии при преобразовании. Если нужно сохранить типы ключей, можно передать записи списком пар с явным описанием типа.
244
9
بدون متن...
258
10
Порядок подготовки вызова 1️⃣Функция mark печатает переданную метку и возвращает ту же строку. Тело send печатает sent. 2️⃣Сначала готовятся позиционные аргументы, в том числе распакованные через *. Выражение [mark("item")] печатает item и даёт один позиционный аргумент. 3️⃣Затем вычисляется именованный аргумент label. Вызов mark("label") печатает label и возвращает его значение. Написанный левее аргумент здесь вычисляется позже. 4️⃣После подготовки аргументов вызывается send. Итоговые строки: item, label, sent. Такой вызов допустим: после именованного аргумента стоит распаковка *, а не обычный позиционный аргумент. Почему это важно Не рассчитывайте на визуальный порядок побочных эффектов в смешанном вызове с *. Если операции должны идти строго по порядку, вычислите их результаты отдельными инструкциями перед вызовом функции.
287
11
بدون متن...
272
12
Два момента применения точности 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.
304
13
بدون متن...
288
14
Поиск и вставка 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 передают целую запись. Похожие параметры этих функций не означают одинаковую обработку искомого объекта.
306
15
بدون متن...
301
16
Что меняют скобки 1️⃣Строка text содержит три имени, разделённые двоеточиями. Оба шаблона находят те же два разделителя. 2️⃣В первом вызове шаблон : не содержит групп. re.split возвращает только части между разделителями: ['api', 'db', 'auth']. 3️⃣Во втором вызове скобки создают захватывающую группу. Её совпадения тоже входят в результат, между соседними частями текста. 4️⃣Поэтому второй список — ['api', ':', 'db', ':', 'auth']. Двоеточия не исчезли: их попросили захватить. Почему это важно Так можно разбить выражение на токены и сохранить операторы или пунктуацию. Если скобки нужны лишь для группировки шаблона, используйте незахватывающую группу (?:...), чтобы разделители не добавлялись в результат.
309
17
بدون متن...
305
18
Что успевает выполниться 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
19
بدون متن...
291
20
Как меняется буфер 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. Перед расширением нужно освободить все активные представления этого буфера.
300