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

Условие присваивания в Python While Loop

В C можно сделать

while( (i=a) != b ) { }

но в Python, похоже, нельзя.

while (i = sys.stdin.read(1)) != "\n":

генерирует

    while (i = sys.stdin.read(1)) != "\n":
         ^
SyntaxError: invalid syntax

(^ должен быть на =)

Есть ли способ обхода?

4b9b3361

Ответ 1

Используйте break:

while True:
    i = sys.stdin.read(1)
    if i == "\n":
       break
    # etc...

Ответ 2

Вы можете выполнить это, используя встроенную функцию iter(), используя метод вызова с двумя аргументами:

import functools
for i in iter(fuctools.partial(sys.stdin.read, 1), '\n'):
    ...

Документация для этого:

iter(o[, sentinel])
...
Если задан второй аргумент, дозорный, то o должен быть вызываемым объектом. Созданный в этом случае итератор будет называть o без аргументов для каждого вызова его next(); если возвращаемое значение равно дозорному, StopIteration будет поднят, в противном случае значение будет возвращено.

Одним из полезных приложений второй формы iter() является чтение строк файла до тех пор, пока не будет достигнута определенная линия. В следующем примере читается файл, пока метод readline() не возвращает пустую строку:

with open('mydata.txt') as fp:
    for line in iter(fp.readline, ''):
        process_line(line)

Ответ 3

Версия без functools:

for i in iter(lambda: sys.stdin.read(1), '\n'):

Ответ 4

Лично мне нравятся ответы imm и Marks с помощью break, но вы также можете сделать:

a = None
def set_a(x):
    global a
    a = x
    return a

while set_a(sys.stdin.read(1)) != '\n':
    print('yo')

хотя я бы не рекомендовал его.

Ответ 5

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

while (i := sys.stdin.read(1)) != '\n':
  do_smthg(i)

Это:

  • Назначает sys.stdin.read(1) переменной i
  • Сравнивает i с \n
  • Если условие подтверждено, вводится тело while в котором i могу быть использован