В C можно сделать
while( (i=a) != b ) { }
, но в Python, похоже, нельзя.
while (i = sys.stdin.read(1)) != "\n":
генерирует
while (i = sys.stdin.read(1)) != "\n": ^ SyntaxError: invalid syntax
(^ должен быть на =)
^
=
Есть ли обходной путь?
Использовать перерыв:
while True: i = sys.stdin.read(1) if i == "\n": break # etc...
Вы можете сделать это, используя встроенную функцию iter(), используя метод вызова с двумя аргументами:
iter()
import functools for i in iter(fuctools.partial(sys.stdin.read, 1), '\n'): ...
Документация для этого:
iter(o[, sentinel]) ... Если задан второй аргумент sentinel , тогда o должен быть вызываемым объектом.Созданный в этом случае итератор будет вызывать o без аргументов для каждого вызова его метода next();если возвращаемое значение равно sentinel , * будет увеличено StopIteration, в противном случае будет возвращено значение. Одно полезное применение второй формы iter() - читать строки файла, пока не будет достигнута определенная строка.В следующем примере файл читается до тех пор, пока метод readline() не возвратит пустую строку:
iter(o[, sentinel]) ... Если задан второй аргумент sentinel , тогда o должен быть вызываемым объектом.Созданный в этом случае итератор будет вызывать o без аргументов для каждого вызова его метода next();если возвращаемое значение равно sentinel , * будет увеличено StopIteration, в противном случае будет возвращено значение.
iter(o[, sentinel])
next()
StopIteration
Одно полезное применение второй формы iter() - читать строки файла, пока не будет достигнута определенная строка.В следующем примере файл читается до тех пор, пока метод readline() не возвратит пустую строку:
readline()
with open('mydata.txt') as fp: for line in iter(fp.readline, ''): process_line(line)
Версия без functools:
functools
for i in iter(lambda: sys.stdin.read(1), '\n'):
Начиная с Python 3.8 и введением выражений присваивания (PEP 572) (оператор :=), теперь можно захватывать значение выражения (здесь sys.stdin.read(1)) как переменную по порядку использовать его в теле while:
Python 3.8
:=
sys.stdin.read(1)
while
while (i := sys.stdin.read(1)) != '\n': do_smthg(i)
Это:
i
\n
Лично мне нравятся ответы imm и Marks с использованием break, но вы также можете сделать:
break
a = None def set_a(x): global a a = x return a while set_a(sys.stdin.read(1)) != '\n': print('yo')
, хотя я бы не рекомендовал это.