Ответ 1
Если вы не делаете ничего интересного с данными, например, прочитав больше строк позже, всегда:
for line in data:
... do stuff ...
Я просто наткнулся на этот фрагмент кода
while 1:
line = data.readline()
if not line:
break
#...
и подумал, что должен быть лучший способ сделать это, чем использовать бесконечный цикл с break
.
Итак, я попробовал:
while line = data.readline():
#...
и, очевидно, получил ошибку.
Есть ли способ избежать использования break
в этой ситуации?
В идеале вы бы хотели не говорить readline
дважды... IMHO, повторение даже хуже, чем просто break
, особенно если выражение сложное.
Если вы не делаете ничего интересного с данными, например, прочитав больше строк позже, всегда:
for line in data:
... do stuff ...
Попробуйте это, работает для файлов, открытых с помощью open('filename')
for line in iter(data.readline, b''):
Это не намного лучше, но я так обычно это делаю. Python не возвращает значение при присваивании переменной, как другие языки (например, Java).
line = data.readline()
while line:
# ... do stuff ...
line = data.readline()
Начиная с Python 3.8
и введением выражений присваивания (PEP 572) (оператор :=
), теперь можно захватить значение условия (data.readline()
) цикла while как переменную (line
) для его повторного использования в теле цикла:
while line := data.readline():
do_smthg(line)
Как
for line in data:
# ...
? Это сильно зависит от семантики семантики семантики объекта data
. Если data
- объект file
, это сработает.
for line in data:
... process line somehow....
Будет выполнять итерацию по каждой строке в file
, вместо использования while
. Это гораздо более распространенная идиома для задания чтения файла в моем опыте (в Python).
Фактически, data
не обязательно должен быть файлом, а просто содержать итератор.
Вы можете сделать:
line = 1
while line:
line = data.readline()
Если data
- это файл, как указано в других ответах, использование for line in file
будет работать нормально. Если данные не являются файлом и объектом случайного чтения данных, тогда вы должны реализовать его как итератор, реализуя методы __iter__
и next
.
Метод next
должен прочитать, проверьте, есть ли больше данных, а если нет, поднимите StopIteration
. Если вы это сделаете, вы можете продолжить использование идиомы for line in data
.
В соответствии с FAQ из документации Python, итерируя по вводу с конструкцией for
или запуская бесконечный цикл while True
и используя оператор break
для его прекращения, являются предпочтительными и идиоматическими способами итерации.
Если data
имеет функцию, которая возвращает итератор вместо readline
(скажем data.iterate
), вы можете просто сделать:
for line in data.iterate():
#...