Задача там была в том, чтобы склепать примитивный тренажёр для первоклассника, с решением арифметических примеров на время..
Вопроса 2:
1) Насколько ̶к̶о̶д̶ ̶г̶о̶в̶н̶о̶ удачная реализация?
2) Можно ли ещё сократить часто повторяющиеся строки кода, особенно в main()?
Собсно код:
from time import time from random import randint def multiply(num_of_exam, corr_answ_count=0): while num_of_exam > 0: x, y = get_operands(mult=True) if get_user_answer(x, y, "*") == str(x * y): print('Верно!') corr_answ_count += 1 else: print(f'Ответ неверный! Правильный ответ:', x * y) num_of_exam -= 1 continue return corr_answ_count def add(num_of_exam, corr_answ_count=0): while num_of_exam > 0: x, y = get_operands() if get_user_answer(x, y, "+") == str(x + y): print('Верно!') corr_answ_count += 1 else: print(f'Ответ неверный! Правильный ответ:', x + y) num_of_exam -= 1 continue return corr_answ_count def subtract(num_of_exam, corr_answ_count=0): while num_of_exam > 0: x, y = get_operands(sub=True) if get_user_answer(x, y, "-") == str(x - y): print('Верно!') corr_answ_count += 1 else: print(f'Ответ неверный! Правильный ответ:', x - y) num_of_exam -= 1 continue return corr_answ_count def divide(num_of_exam, corr_answ_count=0): while num_of_exam > 0: x, y = get_operands(div=True) if get_user_answer(x, y, "/") == str(x // y): print('Верно!') corr_answ_count += 1 else: print(f'Ответ неверный! Правильный ответ:', x // y) num_of_exam -= 1 continue return corr_answ_count def exam_to_solve(): while True: try: examples = int(input('Сколько примеров будем решать? ')) return examples except ValueError: print('Нужно ввести целое число!') continue def get_sign(): vvod = input('С каким знаком будут примеры? +, -, / или *? ') return vvod def get_operands(sub=False, div=False, mult=False): if mult: num_1 = randint(2, 10) num_2 = randint(2, 10) return num_1, num_2 elif div: num_1 = randint(2, 10) num_2 = num_1 * randint(1, 10) return num_2, num_1 elif sub: num_1 = randint(1, 99) num_2 = randint(1, 99) while num_2 >= num_1: num_2 = randint(1, 99) return num_1, num_2 else: num_1 = randint(0, 99) num_2 = randint(0, 99) return num_1, num_2 def get_user_answer(x, y, operator): user_answer = input(f'Сколько будет {x} {operator} {y}?\n') return user_answer def main(amount): oper = get_sign() if oper == '+': print('Время пошло!') start = time() correct_answer = add(amount) print('Затраченное время:', round(time() - start, 2), f'\nПравильных ответов: {correct_answer} из {amount}') elif oper == '-': print('Время пошло!') start = time() correct_answer = subtract(amount) print('Затраченное время:', round(time() - start, 2), f'\nПравильных ответов: {correct_answer} из {amount}') elif oper == '/': print('Время пошло!') start = time() correct_answer = divide(amount) print('Затраченное время:', round(time() - start, 2), f'\nПравильных ответов: {correct_answer} из {amount}') elif oper == '*': print('Время пошло!') start = time() correct_answer = multiply(amount) print('Затраченное время:', round(time() - start, 2), f'\nПравильных ответов: {correct_answer} из {amount}') else: print('Некорректный ввод. Повторите.') return main(amount) print('Завершение программы..') if __name__ == '__main__': print('Калькуляция на время!') count = exam_to_solve() main(count)