Python: завершить проверку итерации в списке, прежде чем двигаться дальше?

Поэтому у меня есть это, чтобы получить вход от пользователя (только что узнал Python, используя 2.7, потому что мне сказали):

def get_move_order(): global move_order move_order=[q for q in raw_input("Enter your move order: ")] print "Checking the validity of your move..." check_correct_moves_only() 

И у меня есть это, чтобы убедиться, что в списке хостов есть только буквы:

 def check_correct_moves_only(): moves = ['A','D','S','C','H'] if all(move_order) in moves: return start() else: print "That's not a proper move!" return get_move_order() 

Проблема в том, что по какой-то причине это действительно не работает. Первоначально я имел это как-то вроде этого:

 def check_correct_moves_only(): moves = ['A','D','S','C','H'] for q in move_order: if q not in moves: print "That's not a proper move!" return get_move_order() else: return start() 

Но это приведет к возврату ввода чего-то вроде AAAAAAR как правильное шесть раз (в этом случае, печатав «Игрок 1 готов!» Шесть раз и «Это не правильный ход!» Один раз. Я хочу, чтобы он проверил все семь (подумайте об повороте основанной на игре, но семь заказов, заданных сразу каждому игроку) для этой ошибки, прежде чем переходить к моим другим проверкам, которые находятся в start (), но я не могу заставить все функции работать / возможно, я использую это неправильно? Я тоже пытался использовать любой, но это не сработало.

я бы предложил вам следующее:

 def get_move_order(): # Asks for a move order until a valid list of moves was entered while True: move_order = [q for q in raw_input("Enter your move order: ")] print "Checking the validity of your move..." if check_correct_moves_only(move_order): break # breaks out of the while loop else: print "That's not a proper move!" # valid move has been entered. Start the game. start(move_order) def check_correct_moves_only(move_order): moves = ['A', 'D', 'S', 'C', 'H'] for q in move_order: if q not in moves: return False return True 

Вы написали check_correct_moves_only рекурсивным способом, что нежелательно для вашей проблемы. Вы также должны использовать global переменные только тогда, когда они вам действительно нужны. Использование параметров более читаемо в большинстве случаев. Если вам нужно использовать некоторую информацию в разных методах, которые называются отдельно, вы также можете написать class .

 def check_correct_moves_only(): moves = ['A','D','S','C','H'] for char in move_order: # if any of the moves are invalid it returns false if char not in moves or len(move_order)<7: # i understand the move must have 7 letters? print ("That's not a proper move!") return False #if all moves are correct it returns true return True def get_move_order(): global move_order # converted input to capitals because your moves list is in caps move_order=[q for q in raw_input("Enter your move order: ")].upper() print ("Checking the validity of your move...") # repeats process if function returns false if check_correct_moves_only() == False: get_move_order() # calls start function if function returns true else: start() 

это не очень питонический способ сделать это, вы даже не должны использовать больше одной функции, но это работает, и это довольно легко следовать.