Многие знают
iter() только для списков, но у него есть второй режим:
iter(callable, sentinel)
Он вызывает функцию снова и снова, пока она не вернёт
sentinel.Например, читать большой файл кусками без
while True:
with open("video.mp4", "rb") as f:
for chunk in iter(lambda: f.read(8192), b""):
process(chunk)
Что происходит:
•
lambda читает по 8192 байта• когда файл закончится,
read() вернёт b""• цикл сам остановится
Выглядит мелко, но это чистый и питоновский способ убрать вечные:
while True:
chunk = f.read(8192)
if not chunk:
break
Редкая штука, которую приятно знать.