Как выполнить назначение переменной внутри цикла while (expression) в Python?
У меня есть назначение переменной, чтобы вернуть назначенное значение и сравнить это с пустой строкой, непосредственно в цикле while.
Вот как я это делаю в PHP:
while((name = raw_input("Name: ")) != ''):
names.append(name)
То, что я пытаюсь сделать, идентично этому в функциональности:
names = []
while(True):
name = raw_input("Name: ")
if (name == ''):
break
names.append(name)
Есть ли способ сделать это в Python?
Ответы
Ответ 1
from functools import partial
for name in iter(partial(raw_input, 'Name:'), ''):
do_something_with(name)
или если вам нужен список:
>>> names = list(iter(partial(raw_input, 'Name: '), ''))
Name: nosklo
Name: Andreas
Name: Aaron
Name: Phil
Name:
>>> names
['nosklo', 'Andreas', 'Aaron', 'Phil']
Ответ 2
Вы можете обернуть raw_input()
, чтобы превратить его в генератор:
def wrapper(s):
while True:
result = raw_input(s)
if result = '': break
yield result
names = wrapper('Name:')
что означает, что мы вернулись к квадрату, но с более сложным кодом. Поэтому, если вам нужно обернуть существующий метод, вам нужно использовать nosklo.
Ответ 3
Нет, извините. Это FAQ, хорошо объясненный здесь:
В Pydocs и блог Фредрика Лунда.
Причина не допускать назначение в выражениях Python является обычной, труднодоступной ошибкой на других языках.
Было предложено много альтернатив. Большинство из них - это хаки, которые сохраняют некоторую типизацию, но используют произвольный или критический синтаксис или ключевые слова и не дают простой критерий для предложений о смене языка: он должен интуитивно предполагать правильный смысл для читателя, который еще не был введен в конструкцию.
Интересным явлением является то, что большинство опытных программистов на Python распознают идиому while True
и, похоже, не упускают назначение в конструкции выражения; его единственные новички, которые выражают сильное желание добавить это к языку.
Theres альтернативный способ написания этого, который кажется привлекательным:
line = f.readline() while line:
... # do something with line...
line = f.readline()
Ответ 4
Мне только 7 лет поздно, но есть другое решение. Это не лучшее решение, о котором я могу думать, но он подчеркивает интересное использование исключения StopIteration. Вы можете сделать аналогичный цикл для чтения файлов/сокетов chunk и обрабатывать таймауты и что-то красиво.
names=[]
try:
while True:
f = raw_input()
if not f:
raise StopIteration
else:
names.append(f)
except StopIteration:
pass
print names
Ответ 5
names = []
for name in iter(lambda: raw_input("Name: "), ''):
names.append(name)