Назначение во время цикла в Python? - PullRequest
54 голосов
/ 09 июля 2011

Я только что наткнулся на этот кусок кода

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

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

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

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

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

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

Edit:

В идеале, вы бы не хотели произносить readline дважды ... ИМХО, повторение даже хуже, чем просто break, особенно если это утверждение сложное.

Ответы [ 10 ]

39 голосов
/ 18 октября 2012

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

for line in iter(data.readline, b''):
25 голосов
/ 09 июля 2011

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

for line in data:
    ... do stuff ...
16 голосов
/ 09 июля 2011

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

line = data.readline()
while line:
    # ... do stuff ... 
    line = data.readline()
6 голосов
/ 09 июля 2011

Как,

for line in data:
    # ...

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

4 голосов
/ 09 июля 2011
for line in data:
    ... process line somehow....

Итерация по каждой строке в file вместо использования while.В моем опыте (на Python) это гораздо более распространенная идиома для задачи чтения файла.

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

2 голосов
/ 25 августа 2013

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

2 голосов
/ 09 июля 2011

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

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

2 голосов
/ 09 июля 2011

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

line = 1
while line:
    line = data.readline()
1 голос
/ 27 апреля 2019

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

while line := data.readline():
  do_smthg(line)
1 голос
/ 09 июля 2011

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

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