Подтвердить что ты не робот

Назначить переменную в условном цикле в Python?

Я просто наткнулся на этот фрагмент кода

while 1:
    line = data.readline()
    if not line:
        break
    #...

и подумал, что должен быть лучший способ сделать это, чем использовать бесконечный цикл с break.

Итак, я попробовал:

while line = data.readline():
    #...

и, очевидно, получил ошибку.

Есть ли способ избежать использования break в этой ситуации?

Edit:

В идеале вы бы хотели не говорить readline дважды... IMHO, повторение даже хуже, чем просто break, особенно если выражение сложное.

4b9b3361

Ответ 1

Если вы не делаете ничего интересного с данными, например, прочитав больше строк позже, всегда:

for line in data:
    ... do stuff ...

Ответ 2

Попробуйте это, работает для файлов, открытых с помощью open('filename')

for line in iter(data.readline, b''):

Ответ 3

Это не намного лучше, но я так обычно это делаю. Python не возвращает значение при присваивании переменной, как другие языки (например, Java).

line = data.readline()
while line:
    # ... do stuff ... 
    line = data.readline()

Ответ 4

Начиная с Python 3.8 и введением выражений присваивания (PEP 572) (оператор :=), теперь можно захватить значение условия (data.readline()) цикла while как переменную (line) для его повторного использования в теле цикла:

while line := data.readline():
  do_smthg(line)

Ответ 5

Как

for line in data:
    # ...

? Это сильно зависит от семантики семантики семантики объекта data. Если data - объект file, это сработает.

Ответ 6

for line in data:
    ... process line somehow....

Будет выполнять итерацию по каждой строке в file, вместо использования while. Это гораздо более распространенная идиома для задания чтения файла в моем опыте (в Python).

Фактически, data не обязательно должен быть файлом, а просто содержать итератор.

Ответ 7

Вы можете сделать:

line = 1
while line:
    line = data.readline()

Ответ 8

Если data - это файл, как указано в других ответах, использование for line in file будет работать нормально. Если данные не являются файлом и объектом случайного чтения данных, тогда вы должны реализовать его как итератор, реализуя методы __iter__ и next.

Метод next должен прочитать, проверьте, есть ли больше данных, а если нет, поднимите StopIteration. Если вы это сделаете, вы можете продолжить использование идиомы for line in data.

Ответ 9

В соответствии с FAQ из документации Python, итерируя по вводу с конструкцией for или запуская бесконечный цикл while True и используя оператор break для его прекращения, являются предпочтительными и идиоматическими способами итерации.

Ответ 10

Если data имеет функцию, которая возвращает итератор вместо readline (скажем data.iterate), вы можете просто сделать:

for line in data.iterate():
    #...