PYTHON_JOB_INTERVIEW Telegram 1224
🎯 Разбор задания с подвохом (Python, собес)

Задание
> Сформируйте список функций callbacks, где каждая функция при вызове печатает свой индекс.
> Затем вызовите их по очереди (или из потоков/таймеров) — ожидаемый вывод: 0 1 2.

Наивное решение (почти все так пишут)

callbacks = [lambda: print(i) for i in range(3)]

for f in callbacks:
f()


Что выведет?
2 2 2 — и это не баг интерпретатора.

В чём подвох

- Замыкание поздно связывает имя i: лямбды не «копируют» значение, а смотрят на переменную i, когда вы их вызываете.
- К моменту вызова цикл уже закончился, i == 2, значит все три лямбды печатают 2.

Правильные варианты

Привязать значение через параметр по умолчанию (часто лучший баланс читаемости)


callbacks = [lambda i=i: print(i) for i in range(3)]
for f in callbacks:
f() # 0 1 2

Заводим фабрику функций (прямо подчёркивает намерение)


def make_printer(i):
def _f():
print(i)
return _f

callbacks = [make_printer(i) for i in range(3)]
for f in callbacks:
f() # 0 1 2

functools.partial — когда нужно просто «прикрутить аргументы»


from functools import partial

callbacks = [partial(print, i) for i in range(3)]
for f in callbacks:
f() # 0 1 2

А если таймеры/потоки?


import threading

for i in range(3):
# ПЛОХО: замкнёт одно и то же i
# threading.Timer(1, lambda: print(i)).start()

# ХОРОШО: привяжем значение сразу
threading.Timer(1, lambda i=i: print(i)).start()


Мини-чеклист для собеса

- Лямбды/внутренние функции в цикле → проверь, не упираешься ли в late binding.

- Если нужна «заморозка» значения, используй параметр по умолчанию, фабрику или partial.

Не путай с другой классикой: изменяемые значения по умолчанию (например, def f(x, acc=[])), это другая ловушка.

Вывод

В Python замыкания захватывают имена, а не значения.

Привязывай нужное значение в момент создания функции — и подвох исчезнет.
👍95🔥5



tgoop.com/python_job_interview/1224
Create:
Last Update:

🎯 Разбор задания с подвохом (Python, собес)

Задание
> Сформируйте список функций callbacks, где каждая функция при вызове печатает свой индекс.
> Затем вызовите их по очереди (или из потоков/таймеров) — ожидаемый вывод: 0 1 2.

Наивное решение (почти все так пишут)


callbacks = [lambda: print(i) for i in range(3)]

for f in callbacks:
f()


Что выведет?
2 2 2 — и это не баг интерпретатора.

В чём подвох

- Замыкание поздно связывает имя i: лямбды не «копируют» значение, а смотрят на переменную i, когда вы их вызываете.
- К моменту вызова цикл уже закончился, i == 2, значит все три лямбды печатают 2.

Правильные варианты

Привязать значение через параметр по умолчанию (часто лучший баланс читаемости)


callbacks = [lambda i=i: print(i) for i in range(3)]
for f in callbacks:
f() # 0 1 2

Заводим фабрику функций (прямо подчёркивает намерение)


def make_printer(i):
def _f():
print(i)
return _f

callbacks = [make_printer(i) for i in range(3)]
for f in callbacks:
f() # 0 1 2

functools.partial — когда нужно просто «прикрутить аргументы»


from functools import partial

callbacks = [partial(print, i) for i in range(3)]
for f in callbacks:
f() # 0 1 2

А если таймеры/потоки?


import threading

for i in range(3):
# ПЛОХО: замкнёт одно и то же i
# threading.Timer(1, lambda: print(i)).start()

# ХОРОШО: привяжем значение сразу
threading.Timer(1, lambda i=i: print(i)).start()


Мини-чеклист для собеса

- Лямбды/внутренние функции в цикле → проверь, не упираешься ли в late binding.

- Если нужна «заморозка» значения, используй параметр по умолчанию, фабрику или partial.

Не путай с другой классикой: изменяемые значения по умолчанию (например, def f(x, acc=[])), это другая ловушка.

Вывод

В Python замыкания захватывают имена, а не значения.

Привязывай нужное значение в момент создания функции — и подвох исчезнет.

BY Python вопросы с собеседований


Share with your friend now:
tgoop.com/python_job_interview/1224

View MORE
Open in Telegram


Telegram News

Date: |

Unlimited number of subscribers per channel Step-by-step tutorial on desktop: Some Telegram Channels content management tips fire bomb molotov November 18 Dylan Hollingsworth yau ma tei Just at this time, Bitcoin and the broader crypto market have dropped to new 2022 lows. The Bitcoin price has tanked 10 percent dropping to $20,000. On the other hand, the altcoin space is witnessing even more brutal correction. Bitcoin has dropped nearly 60 percent year-to-date and more than 70 percent since its all-time high in November 2021.
from us


Telegram Python вопросы с собеседований
FROM American