Python tests
7.43K subscribers
486 photos
45 links
Тесты и задания python разработчиков

По всем вопросам- @notxxx1

@ai_machinelearning_big_data - машинное обучение

@programming_books_it - бесплатные it книги

@pythonl - 🐍

@ArtificialIntelligencedl - AI

@datascienceiot -ds книги
Download Telegram
🌱 Что выведет код?
Anonymous Quiz
13%
None
72%
'food'
12%
AttributeError
3%
TypeError
Что выведет этот код при запуске на Python 3.10+ (например, 3.11)?


📌 Подсказка: Подумайте о порядке проверок, о том, какие атрибуты попадают в others, и об использовании __match_args__.

Ответ:

Automatic mode
Mode manual, other keys: ['threshold', 'debug']
Low threshold 0
Краткое пояснение:

Для первого объекта (mode="auto", threshold=10) срабатывает первый case Config(mode="auto") → Automatic mode.

Для второго (mode="manual", threshold=5, debug=True) первый не совпадает, второй с threshold<5 не проходит (5 < 5 → False), зато третий case Config(mode=mode, **others) — биндинг mode='manual', остальные ключи (threshold и debug) попадают в others → Mode manual, other keys: ['threshold', 'debug'].

Для третьего (threshold=0) первый и третий не подходят (нет mode), а второй — case Config(threshold=threshold) if threshold<5 — срабатывает (0<5) → Low threshold 0.
⚡️Легкий способ получать свежие обновления и следить за трендами в разработке на вашем языке. Находите свой стек и подписывайтесь:

Python: t.iss.one/pythonl
Linux: t.iss.one/linuxacademiya
Собеседования DS: t.iss.one/machinelearning_interview
Нерйросети t.iss.one/ai_machinelearning_big_data
C++ t.iss.one/cpluspluc
Docker: t.iss.one/DevopsDocker
Хакинг: t.iss.one/linuxkalii
Devops: t.iss.one/DevOPSitsec
Data Science: t.iss.one/data_analysis_ml
Javascript: t.iss.one/javascriptv
C#: t.iss.one/csharp_ci
Java: t.iss.one/javatg
Базы данных: t.iss.one/sqlhub
Python собеседования: t.iss.one/python_job_interview
Мобильная разработка: t.iss.one/mobdevelop
Golang: t.iss.one/Golang_google
React: t.iss.one/react_tg
Rust: t.iss.one/rust_code
ИИ: t.iss.one/vistehno
PHP: t.iss.one/phpshka
Android: t.iss.one/android_its
Frontend: t.iss.one/front
Big Data: t.iss.one/bigdatai
МАТЕМАТИКА: t.iss.one/data_math
Kubernets: t.iss.one/kubernetc
Разработка игр: https://t.iss.one/gamedev
Haskell: t.iss.one/haskell_tg
Физика: t.iss.one/fizmat

💼 Папка с вакансиями: t.iss.one/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.iss.one/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.iss.one/addlist/eEPya-HF6mkxMGIy
Папка ML: https://t.iss.one/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://t.iss.one/addlist/mzMMG3RPZhY2M2Iy

😆ИТ-Мемы: t.iss.one/memes_prog
🇬🇧Английский: t.iss.one/english_forprogrammers
🧠ИИ: t.iss.one/vistehno

🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://t.iss.one/addlist/BkskQciUW_FhNjEy
🔍 Что выведет код?
Anonymous Quiz
72%
'food'
7%
TypeError
12%
AttributeError
9%
None
Каким будет вывод этого кода?

print('abcdefcdghcd'.split('cd', 2))
Anonymous Quiz
17%
['ab', 'efcdghcd']
13%
['abcdef', 'ghcd']
38%
['ab', 'ef', 'ghcd']
25%
Ничто из перечисленного
6%
Узнать ответ
🐍 Хитрая задача на Python с подвохом

📌 Задача:
Ты пишешь функцию track, которая возвращает список всех значений, которые в неё передавали. Пример поведения:


print(track(1)) # [1]
print(track(2)) # [1, 2]
print(track(3)) # [1, 2, 3]


Реализуй эту функцию.

🎯 Подвох:
- Решение работает без глобальных переменных
- Используется поведение изменяемых аргументов по умолчанию
- Это поведение часто становится причиной багов у новичков — но здесь оно работает на нас

---

Ожидаемый результат:


def track(value, cache=[]):
cache.append(value)
return cache

# Проверка:
print(track(1)) # [1]
print(track(2)) # [1, 2]
print(track(3)) # [1, 2, 3]


🧠 Объяснение подвоха:

- Аргумент
cache=[] вычисляется один раз, при первом вызове функции
- Все последующие вызовы используют один и тот же список
- Обычно это считается "ловушкой", но в задачах на замыкание состояния — это полезный трюк

⚠️ Не путай: если внутри функции ты напишешь
cache = [], то всё сломается — потому что создастся новый список каждый раз
Какой из следующих методов НЕ является методом перегрузки операций в Python?
Anonymous Quiz
18%
__add__
10%
__sub__
17%
__mul__
56%
__combine__
Что вернет random.seed(3)?
Anonymous Quiz
18%
True
32%
None
10%
1
19%
3
22%
Узнать ответ
Что выведет код?
class B:
def __init__(self) :
print ('В', end='')
super().__init__()
class C:
def __init__(self):
print('C', end='')
super().__init__ ()
class D(B, C):
def __init__(self):
print('D', end='')
B.__init__(self)
C.__init__(self)
X = D()
Выберите правильный вариант
Anonymous Quiz
5%
DB
3%
DC
67%
DBC
6%
DBBC
3%
DBCC
1%
DCBC
15%
Посмотреть результаты
🤔 Какой метод используется для обновления нескольких ключей и значений в словаре?
Anonymous Quiz
17%
modify()
9%
append()
7%
extend()
67%
update()
🧠 Хитрая Python-задача: «Генератор, который взламывает итераторы»
Уровень: 💥 продвинутый (Python 3.12+)

Представьте, что у вас есть ленивый генератор, перебирающий огромный набор данных. Нужно «клонировать» итератор — создать копию, продолжающую работу с того же места, хотя обычные генераторы так не умеют.

🎯 Цель
Напишите cloneable(generator), которая:

● Принимает любую функцию-генератор или итерируемый объект
● Возвращает объект с методом clone(), создающим независимую копию текущего состояния
● Позволяет параллельно вызывать next() у оригинала и всех клонов


gen = cloneable(range(100))
it1 = gen.clone()
it2 = gen.clone()

next(it1) # 0
next(it1) # 1
next(it2) # 0 ← независимая позиция


💡 Ограничения
● Нельзя полностью буферизовать всю последовательность
● Память O(k), где k — число активных клонов
● Только стандартная библиотека; асинхронность не требуется

🔍 Идея решения
● Храним значения в collections.deque по мере чтения из исходного итератора
● Для каждого клона ведём текущий индекс в буфере
● После сдвига всех клонов дальше минимальной позиции — удаляем хвост буфера

Скелет реализации

from collections import deque

class CloneableIterator:
def __init__(self, iterable):
self._source = iter(iterable)
self._buffer = deque()
self._positions = []

def clone(self):
pos = 0
self._positions.append(pos)
idx = len(self._positions) - 1

def _iter():
nonlocal pos
while True:
if pos < len(self._buffer):
yield self._buffer[pos]
else:
try:
val = next(self._source)
except StopIteration:
return
self._buffer.append(val)
yield val
pos += 1
self._positions[idx] = pos
self._shrink()

return _iter()

def _shrink(self):
if not self._positions:
return
min_pos = min(self._positions)
for _ in range(min_pos):
self._buffer.popleft()
self._positions = [p - min_pos for p in self._positions]

def cloneable(iterable):
return CloneableIterator(iterable)


📌 Пример использования


gen = cloneable(i**2 for i in range(5))
a = gen.clone()
b = gen.clone()

print(next(a)) # 0
print(next(a)) # 1
print(next(b)) # 0
print(next(b)) # 1
print(next(b)) # 4


Попробуйте улучшить решение:
● Добавьте защиту от «зомби-клонов»
● Реализуйте __length_hint__()
● Или сделайте асинхронную версию acloneable() на базе async for
🐍 Python-задача: что выведет этот код и почему?


def append_to_list(value, my_list=[]):
my_list.append(value)
return my_list

print(append_to_list(1))
print(append_to_list(2))
print(append_to_list(3))


🔍 Варианты:
• a) [1], [2], [3]
• b) [1], [1, 2], [1, 2, 3]
• c) Ошибка исполнения
• d) [1], [2], [3] — но в разных объектах

💡 Разбор:

Аргумент my_list=[]изменяемый объект, созданный один раз при компиляции функции, а не каждый раз при вызове. Поэтому:

- Первый вызов:
my_list = [] → добавили 1[1]
- Второй вызов: та же
my_list, теперь [1] → добавили 2[1, 2]
- Третий: тот же список →
[1, 2, 3]

Правильный ответ: b) `[1]`, `[1, 2]`, `[1, 2, 3]`

🧠 Вывод: никогда не используй изменяемые значения (`list`,
dict, `set`) в аргументах по умолчанию. Это одна из самых частых ловушек в Python.

🛠️ Правильный способ:



def append_to_list(value, my_list=None):
if my_list is None:
my_list = []
my_list.append(value)
return my_list


📌 Теперь каждый вызов будет работать с новым списком.