Pergunta

Tenho a atribuição de variável, a fim de devolver o valor atribuído e que ao comparar uma cadeia vazia, diretamente no loop while.

Aqui está como eu estou fazendo isso em PHP:

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

O que eu estou tentando fazer é idêntica a esta em termos de funcionalidade:

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

Existe alguma maneira de fazer isso em Python?

Foi útil?

Solução

from functools import partial

for name in iter(partial(raw_input, 'Name:'), ''):
    do_something_with(name)

ou se você quer uma lista:

>>> names = list(iter(partial(raw_input, 'Name: '), ''))
Name: nosklo
Name: Andreas
Name: Aaron
Name: Phil
Name: 
>>> names
['nosklo', 'Andreas', 'Aaron', 'Phil']

Outras dicas

Você pode embrulhar raw_input() para transformá-lo em um gerador:

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

names = wrapper('Name:')

o que significa que estamos de volta para um quadrado, mas com código mais complexo. Então, se você precisa quebrar um método existente, você precisa usar abordagem nosklo 's.

Não, desculpe. É um FAQ, explicou bem aqui:

Em Pydocs , e Fredrik Lundh blogue .

A razão para não permitir que a atribuição em expressões Python é uma comum, difícil de encontrar bug nesses outros idiomas.

Muitas alternativas foram propostas. A maioria são hacks que reduzir a digitação, mas o uso arbitrário ou sintaxe enigmática ou palavras-chave, e falhar o critério simples para propostas de mudança idioma:. Deve intuitivamente sugerem o significado adequado para um leitor humano que ainda não foi introduzido para a construção

Um fenômeno interessante é que os programadores Python mais experientes reconhecem o idioma while True e não parecem estar faltando a atribuição na construção de expressão muito; é apenas recém-chegados que expressam um forte desejo de adicionar isso para a linguagem.

Há uma maneira alternativa de soletração este que parece atraente:

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

Eu sou apenas 7 anos de atraso, mas não há outra solução. Não é a melhor solução que eu posso pensar, mas destaca uma aplicação interessante da exceção StopIteration. Você pode fazer um loop semelhante para pedaço de ler arquivos / soquetes e lidar com Timeouts e outros enfeites bem.

names=[]
try:
    while True:
        f = raw_input()
        if not f:
            raise StopIteration
        else:
            names.append(f)
except StopIteration:
    pass

print names
names = []
for name in iter(lambda: raw_input("Name: "), ''):
    names.append(name)

PEP 572 propõe expressões de atribuição e já foi aceite. Começando com Python 3.8, você será capaz de escrever:

while name := input("Name: "):
    names.append(name)

sintaxe e semântica parte do PEP para mais alguns exemplos:

# Handle a matched regex
if (match := pattern.search(data)) is not None:
    # Do something with match

# A loop that can't be trivially rewritten using 2-arg iter()
while chunk := file.read(8192):
   process(chunk)

# Reuse a value that's expensive to compute
[y := f(x), y**2, y**3]

# Share a subexpression between a comprehension filter clause and its output
filtered_data = [y for x in data if (y := f(x)) is not None]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top