2011-10-15 11 views
19

En C, se puede hacerCondición Asignación en Python ciclo Mientras

while((i=a) != b) { } 

pero en Python, al parecer, no se puede.

while (i = sys.stdin.read(1)) != "\n": 

genera

while (i = sys.stdin.read(1)) != "\n": 
     ^
SyntaxError: invalid syntax 

(el ^ debería estar en el =)

¿Hay alguna solución?

+3

'sys.stdin.readline()' –

+0

oh que es incómodo .. ¿Cómo se compara 'readline()' con 'raw_input()'? – tekknolagi

+1

@tekknolagi Probablemente no recibió su comentario. Es una buena idea hacer ping a una persona agregando '@ name' al texto del comentario. – ovgolovin

Respuesta

17

Uso ruptura:

while True: 
    i = sys.stdin.read(1) 
    if i == "\n": 
     break 
    # etc... 
+0

¡gracias!funciona :) – tekknolagi

+18

Infinito while loop con un descanso? De Verdad? Se quema ... –

+2

@FalconMomot Esto me parece un patrón perfectamente razonable. ¿Qué importa dónde se rompe el lazo? O bien la condición de terminación ocurrirá o no ocurrirá. Si 'i ==" \ n "' no ocurre dentro del bucle (causando un corte), tampoco habría sucedido en el argumento de la condición while-loop. – vastlysuperiorman

3

Personalmente me gusta imm de Marks y respuestas utilizando break, pero también se puede hacer:

a = None 
def set_a(x): 
    global a 
    a = x 
    return a 

while set_a(sys.stdin.read(1)) != '\n': 
    print('yo') 

aunque yo no lo recomendaría.

7

Esto se puede hacer utilizando la función incorporada de iter() utilizando el método de llamada de dos argumentos:

import functools 
for i in iter(fuctools.partial(sys.stdin.read, 1), '\n'): 
    ... 

Documentación para esto:

iter(o[, sentinel])
...
Si el segundo argumento, centinela, se da, entonces o debe ser un ob llamable ject. El iterador creado en este caso llamará al o sin argumentos para cada llamada a su método next(); si el valor devuelto es igual a centinela, se generará StopIteration; de lo contrario, se devolverá el valor.

Una aplicación útil de la segunda forma de iter() es leer líneas de un archivo hasta que se llegue a cierta línea. El siguiente ejemplo lee un archivo hasta que el método readline() devuelve una cadena vacía:

with open('mydata.txt') as fp: 
    for line in iter(fp.readline, ''): 
     process_line(line) 
4

Una versión sin functools:

for i in iter(lambda: sys.stdin.read(1), '\n'): 
Cuestiones relacionadas