⚡️Легкий способ получать свежие обновления и следить за трендами в разработке на вашем языке. Находите свой стек и подписывайтесь:
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
  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
    30%
    True
      
    29%
    False
      
    11%
    Syntax error для метода issuperset()
      
    19%
    Ошибка, метода issuperset() не существует
      
    11%
    Посмотреть ответ
      
    Каким будет вывод этого кода?
  Anonymous Quiz
    43%
    {'apple', 'peach', 'watermelon', 'melon', 'pomelo'}
      
    27%
    {'apple', 'peach', 'watermelon', 'melon', 'pomelo', 'watermelon'}
      
    22%
    Ошибка: оператор + не используется со множествами
      
    3%
    Ошибка: в обоих множествах присутствует "watermelon" (дубликат значения)
      
    4%
    Узнать ответ
      
    Каким будет вывод этого кода?
print('abcdefcdghcd'.split('cd', 2))
  print('abcdefcdghcd'.split('cd', 2))
Anonymous Quiz
    16%
    ['ab', 'efcdghcd']
      
    15%
    ['abcdef', 'ghcd']
      
    39%
    ['ab', 'ef', 'ghcd']
      
    24%
    Ничто из перечисленного
      
    7%
    Узнать ответ
      
    🐍 Хитрая задача на 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 = []Каким будет вывод этого кода?
  Anonymous Quiz
    26%
    integers:...1234...1234  ...001234
      
    14%
    integers…1234…1234…123400
      
    11%
    integers:… 1234…1234…001234
      
    20%
    integers:…1234…1234…001234
      
    30%
    Посмотреть ответ
      
    Какой из следующих методов НЕ является методом перегрузки операций в Python?
  Anonymous Quiz
    17%
    __add__
      
    11%
    __sub__
      
    16%
    __mul__
      
    57%
    __combine__
      
    Что выведет код?
  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
    6%
    DB
      
    2%
    DC
      
    64%
    DBC
      
    8%
    DBBC
      
    3%
    DBCC
      
    2%
    DCBC
      
    14%
    Посмотреть результаты
      
    Anonymous Quiz
    16%
    modify()
      
    8%
    append()
      
    9%
    extend()
      
    68%
    update()
      
    🧠 Хитрая Python-задача: «Генератор, который взламывает итераторы»  
Уровень: 💥 продвинутый (Python 3.12+)
Представьте, что у вас есть ленивый генератор, перебирающий огромный набор данных. Нужно «клонировать» итератор — создать копию, продолжающую работу с того же места, хотя обычные генераторы так не умеют.
🎯 Цель
Напишите
● Принимает любую функцию-генератор или итерируемый объект
● Возвращает объект с методом
● Позволяет параллельно вызывать
💡 Ограничения
● Нельзя полностью буферизовать всю последовательность
● Память O(k), где k — число активных клонов
● Только стандартная библиотека; асинхронность не требуется
🔍 Идея решения
● Храним значения в collections.deque по мере чтения из исходного итератора
● Для каждого клона ведём текущий индекс в буфере
● После сдвига всех клонов дальше минимальной позиции — удаляем хвост буфера
✅ Скелет реализации
📌 Пример использования
Попробуйте улучшить решение:
● Добавьте защиту от «зомби-клонов»
● Реализуйте __length_hint__()
● Или сделайте асинхронную версию acloneable() на базе async for
  Уровень: 💥 продвинутый (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-задача: что выведет этот код и почему?
🔍 Варианты:
• a)
• b)
• c) Ошибка исполнения
• d)
💡 Разбор:
Аргумент   — изменяемый объект, созданный один раз при компиляции функции, а не каждый раз при вызове. Поэтому:
- Первый вызов:  → добавили   →    
- Второй вызов: та же , теперь   → добавили   →    
- Третий: тот же список → 
✅ Правильный ответ: b) `[1]`, `[1, 2]`, `[1, 2, 3]`
🧠 Вывод: никогда не используй изменяемые значения (`list`,, `set`) в аргументах по умолчанию. Это одна из самых частых ловушек в 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🛠️ Правильный способ:
def append_to_list(value, my_list=None):
if my_list is None:
my_list = []
my_list.append(value)
return my_list
📌 Теперь каждый вызов будет работать с новым списком.
Forwarded from Python/ django
🐍 Python-задача: что выведет этот код с вложенными генераторами?
🔍 Варианты:
• a)
• b)
• c)
• d)
💡 Разбор:
- `gen = (x for x in range(3))` — генератор 0, 1, 2  
- `wrap(gen)` — создаёт **новый генератор**, который берёт значения из `gen` и умножает на 2
Но генераторы **исчерпаемы**: после первого полного прохода `list(gen)` → `gen` становится пустым
Значит:
- `list(gen)` → `[0, 1, 2]`
- `gen2 = wrap(gen)` теперь ссылается на **пустой** `gen`
- `list(gen2)` → `[]`
✅ **Правильный ответ: b) `[0, 1, 2]`, `[]`**
🧠 **Вывод:** если оборачиваешь генератор — не "прожигай" его до передачи дальше. Генераторы нельзя перезапустить или "перемотать".
🛠️ Совет: если данные нужны повторно — сохрани их в список:
``` python
data = list(gen)
```
или используй   для разветвления итератора.
 @pythonl
  
gen = (x for x in range(3))
def wrap(g):
return (x * 2 for x in g)
gen2 = wrap(gen)
print(list(gen))
print(list(gen2))
🔍 Варианты:
• a)
[0, 1, 2], [0, 2, 4]  • b)
[0, 1, 2], []  • c)
[], [0, 2, 4]  • d)
[0, 1, 2], Ошибка💡 Разбор:
- `wrap(gen)` — создаёт **новый генератор**, который берёт значения из `gen` и умножает на 2
Но генераторы **исчерпаемы**: после первого полного прохода `list(gen)` → `gen` становится пустым
Значит:
- `list(gen)` → `[0, 1, 2]`
- `gen2 = wrap(gen)` теперь ссылается на **пустой** `gen`
- `list(gen2)` → `[]`
✅ **Правильный ответ: b) `[0, 1, 2]`, `[]`**
🧠 **Вывод:** если оборачиваешь генератор — не "прожигай" его до передачи дальше. Генераторы нельзя перезапустить или "перемотать".
🛠️ Совет: если данные нужны повторно — сохрани их в список:
```
data = list(gen)
```
itertools.tee