2011-10-15 17 views
19

In C, si può fareAssegnazione Condizione in Python Mentre Loop

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

ma in Python, a quanto pare, non si può.

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

genera

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

(la ^ dovrebbe essere sul =)

C'è una soluzione?

+3

'sys.stdin.readline()' –

+0

oh che imbarazzante .. come funziona 'readline()' confronta con 'raw_input()'? – tekknolagi

+1

@tekknolagi Probabilmente non ha ricevuto il tuo commento. È una buona idea eseguire il ping di una persona aggiungendo '@ name' al testo del commento. – ovgolovin

risposta

17

Uso pausa:

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

grazie!funziona :) – tekknolagi

+18

Infinito mentre il ciclo si interrompe? Veramente? Brucia ... –

+2

@FalconMomot Questo mi sembra un modello perfettamente ragionevole. Che importa dove il ciclo è rotto? O la condizione di chiusura accadrà, o non lo farà. Se 'i ==" \ n "' non accade all'interno del ciclo (causando un'interruzione), non sarebbe accaduto neanche nell'argomento delle condizioni del ciclo while. – vastlysuperiorman

3

Personalmente mi piace imm di risposte e Marks utilizzano break, ma si potrebbe anche fare:

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

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

anche se io non lo consiglio.

7

È possibile ottenere questo risultato usando la funzione built-in iter() utilizzando il metodo di chiamata con due argomenti:

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

Documentazione per questo:

iter(o[, sentinel])
...
Se il secondo argomento, sentinella, è data, quindi o deve essere un oggetto chiamabile Ject. L'iteratore creato in questo caso chiamerà o senza argomenti per ogni chiamata al suo metodo next(); se il valore restituito è uguale a sentinella, verrà aumentato il numero StopIteration, altrimenti verrà restituito il valore.

Un'utile applicazione del secondo modulo di iter() consiste nel leggere le righe di un file finché non viene raggiunta una determinata linea. L'esempio seguente legge un file fino a quando il metodo readline() restituisce una stringa vuota:

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

Una versione senza functools:

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