CS50 Pset7 numb3rs:代码输出合规但未通过check50求助
CS50 Python 2022 Problem Set7 numb3rs 题目排查
我正在完成CS50 2022年Python课程Problem Set7的numb3rs题目,代码能按要求输出True或False,但无法通过check50检测。check50返回的报错回溯信息如下:
Traceback (most recent call last): File "/tmp/tmp2vk2c_gh/test_correct_ipv4_localhost/testing.py", line 3, in <module> print(validate(input("IPv4 Address: "))) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/tmp/tmp2vk2c_gh/test_correct_ipv4_...
附上我的代码,请求协助排查问题:
import re def main(): # prompting use for IPV4 ip = input("IPv4 Address: ") numbers = get_num(ip) print(validate(numbers)) def get_num(ip): # search for a valid IPV4 sequence in a string m = re.search(r"^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$", ip) if m: # convert each group in a sequence to an int number1 = int(m.group(1)) number2 = int(m.group(2)) number3 = int(m.group(3)) number4 = int(m.group(4)) # return a list of numbers return [number1, number2, number3, number4] # if no match found return None else: return None # validate ip address def validate(numbers): # if there was a match if numbers: for number in numbers: # check if each number in if 0 <= number <= 255: number = number else: return False return True else: return False if __name__ == "__main__": main()
问题原因
核心问题是函数接口不符合题目要求:题目要求validate函数直接接收IP地址字符串作为参数,但你的validate设计为接收数字列表。check50会直接调用validate(input("IPv4 Address: ")),把用户输入的字符串传给validate,此时函数内部遍历字符串的每个字符,遇到.时尝试转int会抛出ValueError,这就是报错的根源。
另外,原正则表达式会匹配带前导零的段(比如012.345.678.901),这类IP在实际场景中不合法,可能也是部分测试用例失败的原因。
修复方案
调整validate函数,让它直接处理IP字符串参数,整合正则匹配和数值校验逻辑:
import re def main(): ip = input("IPv4 Address: ") print(validate(ip)) def validate(ip): # 匹配IPV4格式,避免前导零(仅允许单个0或非零开头的1-3位数字) pattern = r"^(0|([1-9][0-9]{0,2}))\.(0|([1-9][0-9]{0,2}))\.(0|([1-9][0-9]{0,2}))\.(0|([1-9][0-9]{0,2}))$" m = re.fullmatch(pattern, ip) if not m: return False # 提取四段并转换为整数 try: segments = [int(m.group(1)), int(m.group(3)), int(m.group(5)), int(m.group(7))] except ValueError: return False # 校验每段数值范围 for seg in segments: if not (0 <= seg <= 255): return False return True if __name__ == "__main__": main()
修复说明
- 调整
validate参数为IP字符串,直接在函数内完成正则匹配和校验,符合题目要求的接口规范。 - 修改正则表达式,避免匹配带前导零的段,只允许单个
0或者非零开头的1-3位数字。 - 使用
re.fullmatch确保整个字符串完全匹配IP格式,避免部分匹配的无效场景。 - 增加
try-except捕获可能的转换异常,做双重保障。
内容的提问来源于stack exchange,提问作者Balup
相关产品推荐
相关产品推荐

