¿Cómo se hace la asignación de variables dentro de un bucle while (expresión) en Python?

StackOverflow https://stackoverflow.com/questions/542212

Pregunta

Tengo la asignación de variables con el fin de devolver el valor asignado y que para comparar una cadena vacía, situado en el bucle while.

Aquí está cómo lo estoy haciendo en PHP:

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

Lo que estoy tratando de hacer es idéntica a esta funcionalidad:

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

¿Hay alguna manera de hacer esto en Python?

¿Fue útil?

Solución

from functools import partial

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

o si desea una lista:

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

Otros consejos

Usted puede envolver raw_input() para convertirlo en un generador:

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

names = wrapper('Name:')

lo que significa que estamos de vuelta al punto de partida, pero con un código más complejo. Así que si usted necesita para envolver un método existente, es necesario utilizar nosklo enfoque 's.

No, lo siento. Es un FAQ, explicado bien aquí:

En Pydocs , y Fredrik Lundh el blog .

  

La razón para no permitir la asignación de expresiones Python es un campo común, difíciles de encontrar error en los otros idiomas.

     Se han propuesto

Muchas alternativas. La mayoría son hacks que ahorrar un poco de mecanografía, pero utilizan la sintaxis o palabras clave arbitraria o críptica, y no pasan el criterio simple para las propuestas de cambio de idioma:. Se debe sugerir intuitivamente el significado propio a un lector humano que aún no se ha introducido para la construcción

     

Un fenómeno interesante es que la mayoría de los programadores de Python experimentados reconocen el idioma while True y no parecen estar perdiendo la asignación en construcción de expresión mucho más; es sólo recién llegados que expresan un fuerte deseo de añadir esto a la lengua.

     

Hay una forma alternativa de ortografía esto que parece atractiva:

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

Estoy sólo 7 años de retraso, pero no hay otra solución. No es la mejor solución que se me ocurre, pero pone de relieve un uso interesante de la excepción StopIteration. Usted puede hacer un bucle similar para la lectura de archivos / trozo órbitas y manejar los tiempos de espera y otras cosas muy bien.

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 propone Expresiones Asignación y ya ha sido aceptado. A partir de Python 3.8, usted será capaz de escribir:

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

Sintaxis y semántica parte de la PEP para algunos ejemplos más:

# 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top