Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: user541686Ответов: 11

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

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

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

Итак, я попытался:

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

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

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

Редактировать

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

  • Хотя это хороший вопрос, и я думаю, что решение for line in data хорошо подходит для этой конкретной проблемы, я не думаю, что с идиомой while True: ... break что-то не так. Не бойтесь этого. :-) Kirk Strauser 09.07.2011
  • Эти ответы предоставляют альтернативы присваиванию в условном выражении цикла while, но на самом деле не отвечают на вопрос: есть ли способ выполнить присваивание в цикле while? Я сталкиваюсь с той же проблемой, пытаясь сделать while (character = string[i]): я знаю, что цикл for - лучший способ перебирать строку, но мое условие на самом деле гораздо сложнее, чем это, и я хочу сделать это присваивание правой частью или внутри условного оператора. 09.09.2013
  • @KirkStrauser Проблема с конструкцией разрыва заключается в том, что она использует четыре строки для выражения чего-либо, что другие языки могут сделать всего одной строкой. Однако правильно делает. Ни один из ответов, данных до сих пор, не предоставил лучшего решения общего назначения. Они либо работают только с итераторами, либо дублируют присваивание, что хуже трех лишних строчек кода для версии с разрывом. kasperd 21.11.2014

pythonwhile-loopvariable-assignment

Ответы

Ответ 1 · рейтинг 28 · Ned Batchelder

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

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

Ответ 2 · рейтинг 77 · Xavier Guihot

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

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

Ответ 3 · рейтинг 40 · Niklas Claesson

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

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

Ответ 4 · рейтинг 20 · dfb

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

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

Ответ 5 · рейтинг 6 · Kirk Strauser

Нравиться,

for line in data:
    # ...

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

Ответ 6 · рейтинг 5 · Rich L

Начиная с Python 3.8 (который реализует PEP-572) этот код теперь действителен. :

while line := data.readline():
   # do something with line

Ответ 7 · рейтинг 4 · shelhamer

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

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

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

Ответ 8 · рейтинг 2 · brandon

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

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

Ответ 9 · рейтинг 2 · TorelTwiddler

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

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

Ответ 10 · рейтинг 2 · rafalotufo

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

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

Ответ 11 · рейтинг 2 · Mr. Deathless

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы