Python生成器实现偶数位反转密码功能报错求助
Python生成器函数
reverse_number的问题排查与修正 需求回顾
编写生成器函数reverse_number(number),实现以下功能:
- 提取输入数字的偶数位数字(指数字本身为偶数)并反转,输出格式为
Your new password is: [结果] - 若输入满足任一条件,输出
Invalid input:- 数字少于2位
- 数字为负数
- 数字全为0
- 必须使用
yield实现生成器,禁止用return返回结果
测试报错提示:
Fail 1 :: The values in the generator object returned by the 'reverse_number' method are not correct. Check the name and logic of the function
原代码问题分析
原代码存在几个核心问题:
- 合法性判断重复且不完整
- 主逻辑仅判断
number <10,未覆盖负数场景;生成器内部重复判断合法性,导致逻辑冗余且冲突 - 处理负数时,
str(number)会包含负号,遍历反转时转换int(digit)会抛出ValueError
- 主逻辑仅判断
- 生成器职责混淆
- 生成器同时返回错误信息和有效结果,导致
''.join()处理后结果格式不一致,违背生成器专注产出有效数据的设计逻辑
- 生成器同时返回错误信息和有效结果,导致
- 全0判断场景覆盖不足
- 输入为
0时虽能被拦截,但逻辑可以更简洁统一
- 输入为
修正后的代码
def reverse_number(number): # 仅处理合法数字,生成反转后的偶数位字符 for digit in reversed(str(abs(number))): num_digit = int(digit) if num_digit % 2 == 0: yield digit number = int(input("Please enter the number: ")) # 统一合法性判断 is_invalid = False if number < 0: is_invalid = True elif abs(number) < 10: is_invalid = True elif all(char == '0' for char in str(abs(number))): is_invalid = True if is_invalid: print("Invalid input") else: result = ''.join(reverse_number(number)) print(f"Your new password is: {result}")
修正说明
- 统一合法性判断到主逻辑
- 集中处理所有非法场景(负数、少于2位、全0),避免生成器处理错误输入
- 生成器专注业务逻辑
- 通过
abs(number)获取数字的绝对值字符串,规避负号干扰;遍历反转后的字符,仅yield符合要求的偶数位数字字符
- 通过
- 避免类型转换错误
- 提前处理负数,确保生成器遍历的字符串仅包含数字字符,转换
int(digit)时不会报错
- 提前处理负数,确保生成器遍历的字符串仅包含数字字符,转换
- 逻辑简洁性优化
- 全0判断通过
all(char == '0' for char in str(abs(number)))实现,覆盖所有全0输入场景(如0、0000等)
- 全0判断通过
测试验证
- 输入
1234:输出Your new password is: 42(符合示例要求) - 输入
0:输出Invalid input(符合示例要求) - 输入
-123:输出Invalid input(负数拦截) - 输入
1000:输出Your new password is: 000(正确提取反转后的偶数位)
内容的提问来源于stack exchange,提问作者Harsh Sharma
相关产品推荐
相关产品推荐

