Python调用format函数报replacement index 1 out of range错误求助
报错原因
- 第一处语法错误:
format方法的右括号提前闭合,你写的报错行实际只有question[3]被传入format中,剩余的question[4]、question[5]、question[6]是print函数的独立参数,和format无关,format实际只拿到1个位置参数,自然找不到索引为1的参数。 - 第二处逻辑错误:Python的
str.format()占位符默认从0开始计数,你字符串中写的{1}、{2}、{3}、{4}共4个占位符,就算正确传入4个参数,合法索引范围也是0~3,用到索引4本身也会超出范围。
修复方案
直接修复报错行
方案1:修正format括号和占位符索引
print("'{0}', '{1}', '{2}', '{3}'".format(question[3], question[4], question[5], question[6]))
方案2:使用f-string简化写法(Python3.6及以上版本支持,可读性更高)
print(f"'{question[3]}', '{question[4]}', '{question[5]}', '{question[6]}'")
其他隐藏问题修复(否则后续仍会报错)
- 计分逻辑错误:当前
numOfQuestions仅在答错时计数,答对不会累加,计算得分百分比时分母会小于实际题量,甚至出现除零报错,应该把numOfQuestions += 1移到for question in questions循环内的第一层,每遍历一道题就计数一次。 - 数据插入逻辑错误:
insertData("INSERT INTO scores(userID,score,topicID) VALUES(?,?,?);")写法错误,应该直接将SQL语句赋值给变量:
同时你之前执行插入时传的insert_sql = "INSERT INTO scores(userID,score,topicID) VALUES(?,?,?);" cursor.execute(insert_sql, (userID, score, topicID))topic是单道题的字段值,应该传函数入参的topicID才符合表结构逻辑。 - 数据库连接范围错误:
sqlite3的with上下文管理器仅包住了连接创建步骤,后续游标执行、提交操作都在上下文外,连接可能提前被关闭,应该把所有数据库操作都缩进在with sqlite3.connect("Quiz.db") as db:的代码块内。
内容的提问来源于stack exchange,提问作者Daniel Fall
相关产品推荐
相关产品推荐

