You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

修复说明

  1. 调整validate参数为IP字符串,直接在函数内完成正则匹配和校验,符合题目要求的接口规范。
  2. 修改正则表达式,避免匹配带前导零的段,只允许单个0或者非零开头的1-3位数字。
  3. 使用re.fullmatch确保整个字符串完全匹配IP格式,避免部分匹配的无效场景。
  4. 增加try-except捕获可能的转换异常,做双重保障。

内容的提问来源于stack exchange,提问作者Balup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:21:48