Top.Mail.Ru
Ответы

Аналог goto в Python

Пишу программу "тест", и нужно делать так чтобы если номер вопроса повторяется(выбирается он через random), то номер вопроса подбирался заново, через while сделать не вариант. Сначала хотел сделать через метку, но вспомнил что код я пишу на Pythone и такого в нем нет. Долго ломал голову, в итоге как-то по-другому сделать не вариант, либо я просто не додумываюсь. Есть ли какие-то варианты заменить goto или сделать программу по другому? Этот кусок кода вышел в 30 строчек и переписывать не хочу, надо было додумывать это сразу. Буду очень признателен за помощь

Только авторизированные пользователи могут оставлять свои ответы
Дата
Популярность
Аватар пользователя
Новичок
9мес

НЕ НАДО выбирать номер вопроса через random. Надо взять массив (в терминах Python - список) с теми номерами вопросов, из которых необходимо выбирать, и перемешать его функцией random.shuffle. А потом последовательно брать из этого массива очередное значение. Это гарантирует и случайный выбор вопросов, и отсутствие повторов вопросов.

Аватар пользователя
Мыслитель
9мес

В Python нет прямого аналога goto, и это не случайно. goto часто приводит к запутанному и сложному коду, который трудно читать и отлаживать.

Однако, в твоем случае вместо goto можно использовать цикл while в комбинации с условным оператором if.

Вот пример:

12345678910111213141516171819202122232425262728
 import random 
 
def ask_question(question, answer): 
  """Задает вопрос и проверяет ответ.""" 
  print(question) 
  user_answer = input("Ответ: ") 
  if user_answer == answer: 
    print("Верно!") 
  else: 
    print("Неверно.") 
 
questions = { 
  1: ("Какой язык программирования самый популярный?", "Python"), 
  2: ("Какая столица Франции?", "Париж"), 
  3: ("Что такое HTML?", "Язык разметки"), 
} 
 
used_questions = set() 
 
while len(used_questions) < len(questions): 
  question_number = random.choice(list(questions.keys())) 
  if question_number not in used_questions: 
    used_questions.add(question_number) 
    ask_question(*questions[question_number]) 
  else: 
    continue 
 
print("Тест завершен!")