Python新手求优化简易加法口算测试代码运行效率的方法
Python代码优化及单列表存储题目答案解决方案
你之前在for循环里手动修改i的值不生效,是因为Python的for循环是迭代range()生成的固定序列,每次循环都会自动从序列中取下一个值覆盖i,你在循环体内修改的i不会影响下一次循环的取值,所以靠这种方式跳过索引的方案行不通。
你当前的代码逻辑比较简单,本身运行效率没有明显瓶颈,主要是写法可以更简洁规范,同时也能实现你把题目和答案存在同一个列表的需求,优化思路如下:
- 去掉不必要的全局变量,改用函数返回值传递题目、答题计数等数据,避免全局变量被意外修改引发的问题
- 题目和答案可以成对存在同一个列表的元组中,每个元素格式为
(题目字符串, 正确答案整数),遍历的时候直接拆包取值,完全不需要手动处理索引偏移 - 得分计算直接传入正确题数和总题数即可,不需要依赖全局变量取值
优化后的代码如下:
import random import string import time nums = string.digits # 生成指定数量的题目,返回包含题目和答案对的列表 def generate_questions(count=10): questions = [] for _ in range(count): num0 = random.choice(nums) num1 = random.choice(nums) q_str = f"{num0}+{num1}" correct_ans = int(num0) + int(num1) questions.append((q_str, correct_ans)) return questions # 主答题逻辑,返回正确题数 def main(questions): counter = 0 for q_str, correct_ans in questions: user_ans = int(input(f'What is {q_str}?\n>>')) if user_ans == correct_ans: print('Correct!') counter += 1 else: print('Wrong!') return counter # 计算得分 def calculate_score(correct_count, total_count): return f"You got {correct_count / total_count * 100}%" if __name__ == '__main__': questions = generate_questions(10) correct_count = main(questions) time.sleep(0.5) print('Please wait while we calculate your score.') time.sleep(1) print(calculate_score(correct_count, len(questions)))
改动后所有数据都通过函数参数和返回值传递,没有全局变量风险,同时实现了单列表存储题目和答案的需求,逻辑更清晰,维护起来也更方便。
内容的提问来源于stack exchange,提问作者Shaun Murphy
相关产品推荐
相关产品推荐

