Python 3.x卢恩符文编码程序重复输出异常问题求助
Python 3.x Younger Futhark卢恩符文编码重复输出异常修复
问题复现信息
- 运行环境:Python 3.x,未在Python 2.x等早期版本验证同类问题
- 已实现代码:预置
a/b/c/rune_req全局变量、Younger Futhark编码函数Younger_Encode()、编码路由函数Rune_Nav_En()、主交互循环,解码功能未开发完成已省略 - 执行流程:启动程序后选择Encode编码模式→输入
types查看可用符文列表→选择Younger Futhark Runes→输入待编码文本This Test Worked,以上步骤无报错 - 异常现象:输入待编码文本后,控制台重复输出同一段经卢恩字符替换的文本,经核对该文本是str内置
lower方法的字符串表示经替换后的结果,重复数十次后程序才输出All Done!结束,初步判断异常位于Younger_Encode()函数内部
根因定位
异常完全由两个低级写法错误共同触发,和Python版本无关:
- 方法调用漏写括号:写转小写逻辑时误写为
input_str.lower而非input_str.lower()。不带括号时Python不会执行转小写逻辑,只会返回绑定在字符串对象上的方法本身,将这个方法对象转为字符串就会得到<built-in method lower of str object at 0x*>格式的固定文本,也就是你观察到的“lower方法字符串表示被替换”的来源。 - 打印逻辑嵌套位置错误:将结果打印语句写在了遍历卢恩映射表的循环内部。Younger Futhark映射表共20+个字符映射条目,循环总迭代次数刚好匹配“重复数十次”的现象;当所有字符替换完成后,剩余的循环迭代不会再修改字符串内容,就会反复输出同一段替换结果,直到整个循环执行完毕才会走到后续输出
All Done!的逻辑。
典型错误代码片段参考,对照你的代码排查即可:
# 错误示例 def Younger_Encode(input_text): rune_map = {'f':'ᚠ','u':'ᚢ','th':'ᚦ','a':'ᚨ','r':'ᚱ',...} # 20+个映射项 # 错误1:lower没加括号,拿到的是方法对象不是小写字符串 process_text = str(input_text.lower) for old_char, rune in rune_map.items(): process_text = process_text.replace(old_char, rune) # 错误2:打印写在循环里,每遍历一个映射项就打印一次 print(process_text) return process_text
修复方案
- 修正所有字符串方法调用,
lower()/upper()这类需要执行的方法必须带括号,禁止直接传递方法引用参与字符串处理。 - 将结果打印逻辑移出映射表遍历循环,等所有替换、拼接逻辑执行完成,拿到最终编码字符串后再执行一次打印即可。
- 注意Younger Futhark存在
th这类双字符合集,遍历替换时优先匹配双字符,避免拆成两个单字符映射出错。
修复后的核心逻辑参考:
def Younger_Encode(input_text: str) -> str: # Younger Futhark 映射表,双字符key放前面优先匹配 rune_map = { 'th': 'ᚦ', 'ŋ': 'ᛜ', 'f': 'ᚠ', 'u': 'ᚢ', 'a': 'ᚨ', 'r': 'ᚱ', 'k': 'ᚲ', 'g': 'ᚷ', 'w': 'ᚹ', 'h': 'ᚺ', 'n': 'ᚾ', 'i': 'ᛁ', 'j': 'ᛃ', 'p': 'ᛈ', 'z': 'ᛇ', 's': 'ᛋ', 't': 'ᛏ', 'b': 'ᛒ', 'e': 'ᛖ', 'm': 'ᛗ', 'l': 'ᛚ', 'o': 'ᛟ', 'd': 'ᛞ' } # 正确调用lower()拿到小写字符串 process_str = input_text.lower() res = [] idx = 0 str_len = len(process_str) while idx < str_len: # 优先匹配双字符 if idx + 2 <= str_len and process_str[idx:idx+2] in rune_map: res.append(rune_map[process_str[idx:idx+2]]) idx += 2 continue # 匹配单字符 res.append(rune_map.get(process_str[idx], process_str[idx])) idx += 1 encoded_res = ''.join(res) # 仅在最终处理完成后打印一次 print(encoded_res) return encoded_res
内容的提问来源于stack exchange,提问作者RuneFanatic4628
相关产品推荐
相关产品推荐

