【问题标题】:error checking with using while in python在 python 中使用 while 进行错误检查
【发布时间】:2019-03-11 05:55:35
【问题描述】:
while True:
    self.soil_type = input("Please choose soil type - alkaline, neutral, acidic: ")
    print('-'*30)
    print('')
    if self.soil_type != "alkaline" and "neutral" and "acidic":
        print("***NOT A VALID SOIL TYPE***")
        continue
    else:
        False

我想使用 while 循环进行错误检查。 如果我键入的不是碱性、中性、酸性,则打印“不是有效的土壤类型”并继续输入命令。如果我输入了一种正确的土壤类型,请退出循环并转到下一步。

但它没有用。即使我输入正确(例如“酸性”),它也显示“不是有效的土壤类型”。我错过了什么? :)

【问题讨论】:

  • 把你的条件改成这个if self.soil_type != "alkaline" and self.soil_type != "neutral" and self.soil_type != "acidic"
  • 如果我们已经回答了您的问题,您能否接受以下详细信息:stackoverflow.com/help/someone-answers

标签: python python-3.x


【解决方案1】:
while True:
    self.soil_type = input("Please choose soil type - alkaline, neutral, acidic: ")
    print('-'*30)
    print('')
    if not(self.soil_type == "alkaline" or self.soil_type == "neutral" or self.soil_type == "acidic"):
        print("***NOT A VALID SOIL TYPE***")
        continue
    else:
        break

尝试使用这个.....它应该可以工作!

【讨论】:

    【解决方案2】:

    您使用的 if 条件错误。

    应该是这样的 -

    while True:
        self.soil_type = input("Please choose soil type - alkaline, neutral, acidic: ")
        print('-'*30)
        print('')
        if (self.soil_type != "alkaline") and (self.soil_type != "neutral") and (self.soil_type != "acidic"):
            print("***NOT A VALID SOIL TYPE***")
            continue
        else:
            False
    

    原因是因为你说的像-

    if <condition> and "neutral" and "acidic":
         ...
    

    由于“中性”和“酸性”只是真值,如果它不是碱性,则第一个条件为真。这使得整个条件为真,它只是打印 -

    ***NOT A VALID SOIL TYPE***
    

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      如果您检查if something,您的代码将更具可读性,而不是检查if not something

      while True:
          self.soil_type = input("Please choose soil type - alkaline, neutral, acidic: ")
          print('-'*30)
          print('')
          if self.soil_type == "alkaline" or self.soil_type == "neutral" or self.soil_type == "acidic":
            print("**VALID**")
            print self.soil_type
            break
          else:
            print("***NOT A VALID SOIL TYPE***")
      

      提醒(布尔代数):

      规则可以用英文表示为:

      • 析取的否定是否定的合取;和
      • 连词的否定是否定的析取;或

      • 两组并集的补集与它们的补集的交集相同;和

      • 两组交集的补集与它们的补集的并集相同。

      not (A or B) = not A and not B; 
      and
      not (A and B) = not A or not B
      

      https://en.wikipedia.org/wiki/De_Morgan%27s_laws

      【讨论】:

        【解决方案4】:

        正如其他人已经说过的,“if”语句在语法上是不正确的。此外,在 if 语句本身中列出一组有效的土壤会降低代码的可读性,也不太容易理解和维护。以下是解决此问题的建议:

        while True:
            valid_types = ('alkaline','neutral','acidic')
            self.soil_type = input("Please choose soil type - alkaline, neutral, acidic: ")
            print('-'*30)
            print('')
            if self.soil_type not in valid_types:
                print("***NOT A VALID SOIL TYPE***")
                continue
            else:
                False
        

        虽然我认为有效土壤类型列表不太可能发生变化,但鉴于您在此处提供的值,这仍然可以更清楚地说明这些值的来源。

        此外,为了清楚起见,您可以切换 if 语句,这样您就可以检查它是否 isnot /em>。这对大多数人来说更自然,再次使代码更具可读性和可维护性:

        while True:
            valid_types = ('alkaline','neutral','acidic')
            self.soil_type = input("Please choose soil type - alkaline, neutral, acidic: ")
            print('-'*30)
            print('')
            if self.soil_type in valid_types:
                False
            else:
                print("***NOT A VALID SOIL TYPE***")
                continue
        

        要获得额外奖励,请编辑 input 并添加一点 join 等,以便在此处也使用 valid_types 变量。

        【讨论】:

          猜你喜欢
          • 2016-08-09
          • 2013-08-01
          • 1970-01-01
          • 2011-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-04
          相关资源
          最近更新 更多