2016-11-09 2 views
1

Есть ли эффективный способ вырваться из вложенного цикла, если пользователь просто предоставляет ввод в определенное время, которое они хотят разбить (например, нажать клавишу)? У меня есть условные операторы в самих циклах, которые я могу использовать для разбиения циклов, но если, например, я просто хочу остановить циклы в любое время, но все же хочу, чтобы остальная часть кода запускалась, есть ли простой способ сделать это ? Для выяснения мотивации, я хотел бы сделать что-то вроде:Нарушение вложенных циклов с пользовательским вводом

for x in xrange(1000): 
    for y in xrange(1000): 
     for z in xrange(1000): 
      print x,y,z #function of loop 
      if (user_has_pressed_key) == True: #a user input that 
               #can come at any time 
               #but there should NOT be 
               #a prompt needed for each iteration to run 
       break 
     else: 
      continue 
     break 
    else: 
     continue 
    break 

Я рассматривал возможность использования необработанного ввода, но не хотел бы петлю ждать каждую итерацию для пользователя, поскольку там будут много итераций. Кажется, что есть proposed solutions when using different packages, но даже они, похоже, только для Windows. Я запускаю этот код на нескольких компьютерах, поэтому идеально хотел бы, чтобы он работал на разных ОС.

+0

Возможно, вы захотите ознакомиться с стандартной библиотекой 'signal' для асинхронных событий. – AChampion

+1

, пожалуйста, предоставьте минимальный рабочий пример – user2682863

ответ

4

Вы можете выйти из вложенных циклов, если пользователь выдает нажатие клавиши CTRL + C, так как он бросает KeyboardInterrupt исключения:

try: 
    for x in xrange(1000): 
     for y in xrange(1000): 
      for z in xrange(1000): 
       print x,y,z #function of loop 

except KeyboardInterrupt: 
    print("Stopped nested loops") 
+0

Это, по сути, то, что я искал. Но из любопытства, есть ли способ реализовать подобный метод без инструкции try/except? – Mathews24

0

Если вы хотите, чтобы петля сломать когда любого нажата клавиша пользователем, то вы можете попробовать этот импорт:

from msvcrt import getch 
while True: 
    key = getch() 
    if (key is not None): 
     break