Ответ 1
Используйте break:
while True:
i = sys.stdin.read(1)
if i == "\n":
break
# etc...
В C можно сделать
while( (i=a) != b ) { }
но в Python, похоже, нельзя.
while (i = sys.stdin.read(1)) != "\n":
генерирует
while (i = sys.stdin.read(1)) != "\n":
^
SyntaxError: invalid syntax
(^
должен быть на =
)
Есть ли способ обхода?
Используйте break:
while True:
i = sys.stdin.read(1)
if i == "\n":
break
# etc...
Вы можете выполнить это, используя встроенную функцию 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)
Версия без functools
:
for i in iter(lambda: sys.stdin.read(1), '\n'):
Лично мне нравятся ответы 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')
хотя я бы не рекомендовал его.
Начиная с 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
могу быть использован