为什么我的新split数组元素被视为非int值?

时间:2017-09-11 18:11:17

标签: python arrays python-3.x int digits

我的问题是关于Python3处理某些数组元素的方式。

这是我的代码:

def isIPv4(inputStr):

    inputStr.split('.') #splits input into array elements (no periods)
    val = []

    for i in inputStr:
        if not i.isdigit():       #if the element is not a digit (valid to convert to INT).
            return False
        if int(i) >=0 and int(i)<=255:    #element value between 0 and 255.
            val.append(i)
        else:
            return False
        return len(val) == 4              #array has 4 elements ^^

如果输入是IPv4地址,代码应该让我知道,这意味着0到255之间的数字,以句点分隔。返回True或False。

输入有效:

inputStr: "1.1.1.1a"
inputStr: "0..1.0"

对于两者,我的代码正确返回False。

不起作用的输入:

inputStr: "172.16.254.1"
inputStr: "0.254.255.0"

对于这些,我的代码也返回False,而它应该返回True。

正如您所看到的,该程序可以正确处理点分隔值的分割,但是,即使&#39; 1a&#39;被正确地抛弃为非int,&#39; 0&#39;还有&#39; 172&#39;被抛弃了。

我意识到&#39; 0&#39; 0和&#39; 172&#39;两者都是字符串,所以我应该知道Python3模块如何处理这些数据?

1 个答案:

答案 0 :(得分:1)

inputStr.split('.')返回一个列表。你完全忽略了这个清单。 inputStr本身是一个不可变的字符串,不会改变

所以inputStr保留原始字符串,并且您正在测试每个个别字符是否为数字。对.个字符失败。

您需要存储str.split()调用的结果并对其进行测试:

def isIPv4(inputStr):
    parts = inputStr.split('.')

    for part in parts:
        if not part.isdigit():
            return False
        if not (0 <= int(part) <= 255):
            return False
    return len(parts) == 4

请注意,您不必构建新的vals列表;只测试分割结果是否合适。