Como fazer atribuição de variável dentro de um (expressão) loop while em Python?
-
23-08-2019 - |
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?
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]