Python循环次数异常:含break仍多次循环的问题解决
问题分析
你的代码出现多次减分的核心原因是逻辑匹配错误:你想要统计密码中完整的3字母QWERTY序列(比如"qwe"),但代码却在检查密码的2字符子串(比如"qw")是否属于某个3字母QWERTY序列的一部分。这会导致同一个3字母序列被拆成两个2字符子串,每个子串匹配时都会触发一次减5,最终减分次数远多于实际的3字母序列数量。
另外,内层循环的范围没有限制,遍历到了密码的最后一个字符,而实际上检查3字符子串时,起始位置最多只能到passlen - 3(否则子串长度不足3,无法匹配3字母序列)。
修正后的代码
# 假设qwerty是包含所有QWERTY连续3字母序列的列表 qwerty = ["qwe", "wer", "ert", "rty", "tyu", "yui", "uio", "iop", "asd", "sdf", "dfg", "fgh", "ghj", "hjk", "jkl", "zxc", "xcv", "cvb", "vbn", "bnm"] password = "qwert" # 示例密码 score = 50 passlen = len(password) # 遍历所有可能的3字符子串起始位置 for char in range(passlen - 2): current_3char = password[char:char+3] if current_3char in qwerty: score -= 5 print(score, "subtracting 5")
关键调整点
- 匹配完整3字符序列:把
password[char:char+2]改为password[char:char+3],直接检查密码中的3字符子串是否属于QWERTY序列列表,确保每个完整的3字母序列只触发一次减分。 - 缩小循环范围:内层循环改为
range(passlen - 2),避免遍历到无法形成3字符子串的位置,提升效率同时避免无效检查。 - 简化逻辑:去掉外层的
for sequence in qwerty循环,直接通过current_3char in qwerty判断,既简洁又避免重复匹配。
示例测试
如果密码是"qwert",里面包含"qwe"和"wer"两个3字母QWERTY序列,修正后的代码会输出:
45 subtracting 5 40 subtracting 5
正好对应预期的2次减分,和3字母序列数量一致。
内容的提问来源于stack exchange,提问作者Jake.h
相关产品推荐
相关产品推荐

