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

Как выполнить назначение переменной внутри цикла 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?

4b9b3361

Ответ 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)