【问题标题】:For loops concatenated – beginner python exerciseFor 循环连接 - 初学者 python 练习
【发布时间】:2016-12-30 08:06:16
【问题描述】:

大家好,我写信是因为我遇到了一个只能使用 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)

【问题讨论】:

  • '如果它是真实写的':python提供ipaddres。你甚至不必使用正则表达式。包括电池!
  • 你的问题是什么?
  • @hiroprotagonist 最后四部分代码重复了四次,我想只写一次可能使用 for 循环。
  • 如果您可以使用正则表达式 re.match(r"^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$", ip),您可以从中提取组并检查它们是否在 [0 .. 255] 内

标签: python python-3.x if-statement for-loop break


【解决方案1】:

我还要说,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。

【讨论】:

    【解决方案2】:

    好吧,你必须问自己一个正确的问题:“我能做得更好吗?”。请始终这样做。是的,事实上,你可以。处理点之间数字验证的代码本质上是相同的。因此,您应该将字符串拆分为点并使用 for 循环来验证每个组:

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

    【讨论】:

      【解决方案3】:

      怎么样?在点 . 处拆分字符串并检查点之间是否有有效范围内的数字(这也将接受 '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
      

      【讨论】:

        猜你喜欢
        • 2021-02-19
        • 2013-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-05
        • 1970-01-01
        相关资源
        最近更新 更多