This media is not supported in your browser
VIEW IN TELEGRAM
🔥 Коварная ловушка с замыканиями в Python
Многие хитрые баги в Python появляются из-за того, что разработчики неверно понимают область видимости переменных в замыканиях.
Частая ошибка - внутри цикла создавать функции-лямбды, которые «помнят» одно и то же финальное значение переменной, а не значение на каждой итерации. В итоге весь список функций ведёт себя одинаково. Чтобы избежать ловушки, фиксируйте значение через аргумент по умолчанию или используйте functools.partial.
Многие хитрые баги в Python появляются из-за того, что разработчики неверно понимают область видимости переменных в замыканиях.
Частая ошибка - внутри цикла создавать функции-лямбды, которые «помнят» одно и то же финальное значение переменной, а не значение на каждой итерации. В итоге весь список функций ведёт себя одинаково. Чтобы избежать ловушки, фиксируйте значение через аргумент по умолчанию или используйте functools.partial.
funcs = []
for i in range(5):
# Ошибка - все функции запомнят i=4
funcs.append(lambda: i)
print([f() for f in funcs]) # [4,4,4,4,4]
funcs_safe = []
for i in range(5):
# Правильно - захватываем текущее значение
funcs_safe.append(lambda i=i: i)
print([f() for f in funcs_safe]) # [0,1,2,3,4]
❤6👍3
Вот 16 авторских обучающих IT каналов по самым востребованным областям программирования:
Выбирай своё направление:
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
🕔 Как сделать задержку в Python разными способами
В Python есть несколько способов сделать задержку, и каждый подходит под разные задачи.
Обычная пауза - через time.sleep().
Неблокирующая задержка - через asyncio.sleep() в асинхронном коде.
Точная задержка в цикле — через time.perf_counter().
Выбирайте под свой сценарий.
import time
В Python есть несколько способов сделать задержку, и каждый подходит под разные задачи.
Обычная пауза - через time.sleep().
Неблокирующая задержка - через asyncio.sleep() в асинхронном коде.
Точная задержка в цикле — через time.perf_counter().
Выбирайте под свой сценарий.
import time
print("Старт")
time.sleep(2) # простая задержка
print("Пауза 2 секунды завершена")
#2 вариант
import asyncio
async def main():
print("Асинхронный старт")
await asyncio.sleep(1.5) # не блокирует поток
print("Прошла асинхронная задержка 1.5 сек")
asyncio.run(main())
#3 вариант
import time
start = time.perf_counter()
while time.perf_counter() - start < 1: # точная контрольная задержка ~1 сек
pass
print("Прошла точная задержка без sleep")
❤3