For 循环连接 – 初学者 python 练习

For loops concatenated – beginner python exercise

大家好,我正在写这篇文章,因为我被困在一个练习中,我应该只使用 for 循环和 if/else 语句。我找到了一种方法,但实际上我将同一个代码块迭代了四次,我真的在寻找一种方法来自动化它。 我知道这可能不是解决练习的最佳方法,但现在我不是在寻找最有效的方法(我已经找到了练习的解决方案),我问你如何使用 for 进行迭代代码块

该练习告诉我创建一个程序,从键盘获取 IP 地址并验证它是否可以解释为有效的 IP 地址。 IP 地址由 4 个数字组成,数字之间用句号隔开。每个号码不能超过 3 位数。 (示例:127.0.0.1) 重要的 这个挑战旨在练习 for 循环和 if/else 语句,因此虽然它可能是真正使用正则表达式编写的,但我们不希望您在这里使用它们,即使您知道它们是什么。

这是我做的:

# ipAddress = input("please enter an ipAddress: ")
ipAddress = "192.168.7.7"  #test ip address


# check if number of dots is 3
numberOfDot = 0
for char in ipAddress:
    if char == '.':
        numberOfDot += 1
totNumbOfDot = numberOfDot  # output of this section is totNumberOfDot, to be checked at the end
if totNumbOfDot != 3:
    print("You inserted a wrong ip address")


# first number check            # THIS IS THE BLOCK OF CODE I WANT TO 
number1 = ''                    # ITERATE WITH FOR IF POSSIBLE
for char in ipAddress:
    if char in "0123456789":
        number1 += char
    if char == '.':
        break
if 1 <= len(number1) <= 3:
    print("First number:   OK")
else:
    print("First number:   Fail")
digitN1 = len(number1) + 1
print(number1)


# second number check
numberMinus2 = ipAddress[digitN1:]
number2 = ''
for char in numberMinus2:
    if char in "0123456789":
        number2 += char
    if char == '.':
        break
if 1 <= len(number2) <= 3:
    print("Second number:  OK")
else:
    print("Second number: Fail")
digitN2 = len(number2) + digitN1 +1
print(number2)


# third number check
numberMinus3 = ipAddress[digitN2:]
number3 = ''
for char in numberMinus3:
    if char in "0123456789":
        number3 += char
    if char == '.':
        break
if 1 <= len(number3) <= 3:
    print("Third number:   OK")
else:
    print("Third number:   Fail")
digitN3 = len(number3) + digitN2 + 1
print(number3)


# fourth number check
numberMinus4 = ipAddress[digitN3:]
number4 = ''
for char in numberMinus4:
    if char in "0123456789":
        number4 += char
    if char == '.':
        break
if 0 < len(number4) <= 3:
    print("Fourth number:  OK")
else:
    print("Fourth number:  Fail")
digitN4 = len(number4) + digitN3 + 1
print(number4)

好吧,你必须问自己正确的问题:"can I do better?"。请总是那样做。是的,事实上,你可以。处理点之间数字验证的代码本质上是相同的。所以你应该在点上拆分字符串并使用 for 循环来验证每个组:

for str in ipAddress.split("."):
    your validation here

怎么样?在点 . 处拆分字符串并检查点之间是否有有效范围内的数字(也接受 '255.255.255.255'

def valid(ipaddress):
    # we need 3 dots; otherwise this is no ipaddress.
    if not ipaddress.count('.') == 3:
        return False

    # check what is before, between and after the dots
    for byte in ipaddress.split('.'):
        # if byte can not be interpreted as an integer -> no good!
        try:
            i = int(byte)
        except ValueError:
            return False
        # now check if byte is in the valid range
        if i < 0:
            return False
        if i > 255:
            return False

    return True


print(valid(ipaddress='192.168.7.7'))  # -> True
print(valid(ipaddress='.168.7.7'))     # -> False
print(valid(ipaddress='721.168.7.7'))  # -> False

我还要说,split() 是可行的方法。您的问题是是否有一种方法可以使用您的逻辑并且仍然不必重复代码 4 次。为此,您可以这样做:

numberOfDot=0
number=""
for char in ip+'.':
    if char=='.':
        numberOfDot+=1
        if len(number) in [1,2,3]:
            print("number %d OK"%numberOfDot)

        else:
            print("number %d not OK"%numberOfDot)
        print(number)
        number=""
    elif char in '1234567890':
        number+=char
    else:
        print("character not valid")
if numberOfDot!=4:
    print("you inserted a wrong ip")

正如我所说,我还建议使用 split() - 这只是为了尝试提供更接近您的问题的答案。另请注意,此代码(与您的代码相同)会将包含字母的 ip 地址标记为 OK,而不仅仅是数字。