2011-08-31 13 views
8

Sono un principiante di Python e mi è stato chiesto di eseguire alcuni esercizi usando while e for loops. Mi è stato chiesto di creare un ciclo del programma fino a quando l'utente non ha richiesto l'uscita premendo solo <Return>. Finora ho:Esci da loop per utente premendo il tasto ENTER

User = raw_input('Enter <Carriage return> only to exit: ') 
running = 1 
while running == 1: 
    Run my program 
if User == # Not sure what to put here 
    Break 
else 
    running == 1 

ho provato: (come indicato nell 'esercizio)

if User == <Carriage return> 

e anche

if User == <Return> 

ma questo solo si traduce in sintassi non valida. Per favore, potresti consigliarmi su come farlo nel modo più semplice possibile. Grazie

+0

Oh, 'break' dovrebbe essere anche in minuscolo. E hai bisogno di indentare più linee per entrare nel ciclo. –

risposta

2

Utilizzare una dichiarazione di stampa per vedere cosa restituisce raw_input quando si preme enter. Quindi cambia il test per confrontarlo.

+0

l'istruzione print è vuota, quindi ho provato User == '', ma questa riga è evidenziata come sintassi non valida – Candace

+2

Fai questo: 'print repr (User)'. –

+1

raw_input non acquisisce o

0

È necessario sapere come apparirebbe la variabile User quando si preme Invio. Non ti darò la risposta completa, ma un consiglio: spara a un interprete e provalo. Si noti che il valore di stampa è "\ n" per impostazione predefinita (era troppo: o)

+0

Ho provato a utilizzare un'istruzione di stampa per fare ciò e la variabile è vuota, quindi ho provato Utente == '' ma questo risulta nella sintassi non valida come Utente == '\ n' – Candace

+1

Perché dovrebbe stai facendo 'Utente ==" '?" non è valido Sintassi. Ti aiuterò anche un po 'di più (anche se in realtà è così ovvio): 'print repr (raw_input())' e premi invio. – naeg

-2

Se si desidera che l'utente prema Invio, quindi raw_input() restituirà "", quindi confrontare l'utente con "":

User = raw_input('Press enter to exit...') 
running = 1 
while running == 1: 
    Run your program 
if User == "": 
    break 
else 
    running == 1 
+0

Ho tentato di farlo, ma la quinta riga è ancora evidenziata come sintassi non valida – Candace

+0

oops, scusa ho dimenticato ":" –

+0

Hai anche bisogno di un ':' dopo 'else', e' running == 1' è un'espressione booleana non un incarico. – martineau

0
if repr(User) == repr(''): 
    break 
+0

questa riga è ancora evidenziata come sintassi non valida – Candace

+0

che non può essere :). L'ho provato ... – hymloth

4

in realtà, suppongo siete alla ricerca di un codice che viene eseguito un ciclo fino a quando si preme un tasto sulla tastiera. Naturalmente, il programma non dovrebbe aspettare l'utente per tutto il tempo per inserirlo.

  1. Se si utilizza raw_input() in Python 2.7 o input() in Python 3.0, il programma attende per l'utente di premere un tasto.
  2. Se non si desidera che il programma attenda che l'utente preme un tasto ma desidera comunque eseguire il codice, è necessario eseguire una funzione leggermente più complessa in cui è necessario utilizzare la funzione kbhit() nel modulo msvcrt.

In realtà, esiste una ricetta in ActiveState in cui è stato risolto questo problema. Si prega di seguire questo link

Penso che i seguenti collegamenti potrebbero anche aiutare a capire in modo molto migliore.

  1. python cross platform listening for keypresses

  2. How do I get a single keypress at a time

  3. Useful routines from the MS VC++ runtime

Spero che questo vi aiuta a fare il vostro lavoro.

-1

Ecco una soluzione (simile all'originale) che funziona:

User = raw_input('Enter <Carriage return> only to exit: ') 
while True: 
    #Run my program 
    print 'In the loop, User=%r' % (User,) 

    # Check if the user asked to terminate the loop. 
    if User == '': 
     break 

    # Give the user another chance to exit. 
    User = raw_input('Enter <Carriage return> only to exit: ') 

Nota che il codice nella domanda iniziale ha diversi problemi:

  1. Il if/else è al di fuori del ciclo while, quindi il ciclo funzionerà per sempre.
  2. Il else manca due punti.
  3. Nella clausola else, c'è un doppio-uguale invece che uguale. Questo non esegue un compito, è un'espressione di paragone inutile.
  4. Non ha bisogno della variabile di esecuzione, poiché la clausola if esegue uno break.
13

Mi sono imbattuto in questa pagina mentre (nessun gioco di parole) cercavo qualcos'altro. Ecco quello che io uso:

while True: 
    i = input("Enter text (or Enter to quit): ") 
    if not i: 
     break 
    print("Your input:", i) 
print("While loop has exited") 
+1

Semplice, efficace e pitonico. – 2rs2ts

+0

Genera 'SyntaxError: EOF inatteso durante l'analisi 'in Python 2. L'uso di' raw_input' può essere corretto, ma non l'ho provato. –

10

La cosa esatta che si desidera;)

https://stackoverflow.com/a/22391379/3394391

import sys, select, os 

i = 0 
while True: 
    os.system('cls' if os.name == 'nt' else 'clear') 
    print "I'm doing stuff. Press Enter to stop me!" 
    print i 
    if sys.stdin in select.select([sys.stdin], [], [], 0)[0]: 
     line = raw_input() 
     break 
    i += 1 
+0

Questa è una risposta eccellente. Ecco (credo) la fonte originale, che ha ulteriori informazioni sullo stdin non bloccante: https://repolinux.wordpress.com/2012/10/09/non-blocking-read-from-stdin-in-python/ – Blairg23

0

una soluzione molto semplice sarebbe, e vedo che hai detto che si vorrebbe per vedere la soluzione più semplice possibile. Una richiesta di all'utente di continuare dopo arrestare un ciclo Ecc

raw_input("Press<enter> to continue") 
0
user_input=input("ENTER SOME POSITIVE INTEGER : ") 
if((not user_input) or (int(user_input)<=0)):  
    print("ENTER SOME POSITIVE INTEGER GREATER THAN ZERO") #print some info 
    import sys  #import 
    sys.exit(0)  #exit program 
''' 
#(not user_input) checks if user has pressed enter key without entering 
# number. 
#(int(user_input)<=0) checks if user has entered any number less than or 
#equal to zero. 
''' 
+1

È necessario fornire alcune discussioni che spieghino in che modo la risposta risponde alla domanda. – Phil

0

Ecco la risposta migliore e più semplice. Utilizza try e tranne le chiamate.

x = randint(1,9) 
guess = -1 

print "Guess the number below 10:" 
while guess != x: 
    try: 
     guess = int(raw_input("Guess: ")) 

     if guess < x: 
      print "Guess higher." 
     elif guess > x: 
      print "Guess lower." 
     else: 
      print "Correct." 
    except: 
     print "You did not put any number." 
0

Sei quasi arrivato. il modo più semplice per farlo è cercare una variabile vuota, che è ciò che si ottiene premendo Invio su una richiesta di input. Il mio codice qui sotto è di 3,5

running = 1 
while running == 1: 

    user = input(str('Enter <Carriage return> only to exit: ')) 

    if user == '': 
     running = 0 
    else: 
     print('You had one job...') 
0

Le seguenti opere sono: Il

i = '0' 
while len(i) != 0: 
    i = list(map(int, input(),split())) 
+0

Spiega il tuo codice e che altro non porta altre risposte. – Nic3500

0

Questo funziona per Python 3.5 utilizzando threading parallelo. Si potrebbe facilmente adattare questo per essere sensibili solo a un tasto specifico.

import time 
import threading 


# set global variable flag 
flag = 1 

def normal(): 
    global flag 
    while flag==1: 
     print('normal stuff') 
     time.sleep(2) 
     if flag==False: 
      print('The while loop is now closing') 

def get_input(): 
    global flag 
    keystrk=input('Press a key \n') 
    # thread doesn't continue until key is pressed 
    print('You pressed: ', keystrk) 
    flag=False 
    print('flag is now:', flag) 

n=threading.Thread(target=normal) 
i=threading.Thread(target=get_input) 
n.start() 
i.start() 
+0

Alcuni pignoli molto piccoli: 'flag = 1' ->' flag = True'. 'while flag == 1' ->' while flag'. 'if flag == False:' -> 'se non flag:'. E devi solo dichiarare il 'global' se vuoi scrivere su una variabile, così puoi rimuovere' global flag' da 'normal()'. – user136036

Problemi correlati