python
  • syntax
  • while-loop
  • expression
  • 2009-02-12 3 views 12 likes 
    12

    У меня есть назначение переменной, чтобы вернуть назначенное значение и сравнить это с пустой строкой, непосредственно в цикле while.Как выполнить назначение переменной внутри цикла while (expression) в Python?

    Вот как я это делаю в PHP:

    while((name = raw_input("Name: ")) != ''): 
        names.append(name) 
    

    То, что я пытаюсь сделать, это идентично этой функциональности:

    names = [] 
    while(True): 
        name = raw_input("Name: ") 
        if (name == ''): 
         break 
        names.append(name) 
    

    Есть ли способ сделать это в Python?

    ответ

    14
    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'] 
    
    +0

    +1 для лучшего решения для упаковки существующего метода. –

    +0

    Не ответ; Я все еще не знаю: привязываете ли вы переменную в 'while' в Python? – Kaz

    9

    Нет, извините. Это FAQ, который здесь хорошо объясняется:

    В Pydocs и Fredrik Lundh's blog.

    Причина, по которой не допускается назначение в выражениях Python, является обычной, труднодоступной ошибкой на этих других языках.

    Было предложено много альтернатив. Большинство из них - это хаки, которые сохраняют некоторую типизацию, но используют произвольный или критический синтаксис или ключевые слова и не дают простейшего критерия для предложений о смене языка: он должен интуитивно предполагать правильный смысл для человека, который еще не был введен в конструкцию.

    Интересным явлением является то, что большинство опытных программистов на Python распознают идиому while True и, похоже, не так сильно теряют назначение в конструкции выражения; только новички выражают сильное желание добавить это к языку.

    Там это альтернативный способ правописания этого, что кажется привлекательным:

    line = f.readline() while line: 
        ... # do something with line... 
        line = f.readline() 
    
    +0

    ссылку, кажется, сломана –

    +0

    Добавлено обновление ссылки. Благодаря! –

    +0

    Ссылка мертва. – Makkes

    12

    Вы можете обернуть raw_input(), чтобы превратить его в генератор:

    def wrapper(s): 
        while True: 
         result = raw_input(s) 
         if result = '': break 
         yield result 
    
    names = wrapper('Name:') 
    

    , что означает, что мы вернулись к один, но с более сложным кодом. Поэтому, если вам нужно обернуть существующий метод, вам нужно использовать подход nosklo.

    +0

    +1: Ударьте меня за секунды. Однако добавьте определение «raw_input как генератор» в свой ответ. –

    +0

    Прохладный спасибо! Первый раз, используя переполнение стека btw, никогда не знал, что это было потрясающе, идеальный ответ за считанные минуты :) –

    +0

    Можете ли вы подробно описать, как «превратить raw_input в генератор» очень путинским способом? – physicsmichael

    1

    Я всего 7 лет поздно, но есть еще одно решение. Это не лучшее решение, о котором я могу думать, но это подчеркивает интересное использование исключения StopIteration. Вы можете сделать аналогичный цикл для чтения файлов/сокетов chunk и обрабатывать таймауты и что-то красиво.

    names=[] 
    try: 
        while True: 
         f = raw_input() 
         if not f: 
          raise StopIteration 
         else: 
          names.append(f) 
    except StopIteration: 
        pass 
    
    print names 
    
    1
    names = [] 
    for name in iter(lambda: raw_input("Name: "), ''): 
        names.append(name) 
    
    Смежные вопросы