没有返回预期的结果python

时间:2017-04-11 22:20:33

标签: python python-3.x if-statement logic

def isPhoneNumber(text):
   if len(text) != 12:
      return False
   for i in range(0, 3):
      if not text[i].isdecimal():
         return False
   if text[3] != '-' or text[3] != '':
         return False
   for i in range(4, 7):
      if not text[i].isdecimal():
        return False
    if text[7] != '-':
       return False
   for i in range(8, 12):
        if not text[i].isdecimal():
           return False
   return True

print('444-444-4444 is a phone number: ')
print(isPhoneNumber('473-927-2847'))
print('Moshi moshi is a phone number:')
print(isPhoneNumber('Moshi moshi'))
print('8478473948 is a phone number:')
print(isPhoneNumber('847847-3948'))

他们现在都归零了。怎么会?为什么第三个'if'语句没有返回正确的值?它应该对第一个函数调用和第三个函数调用都返回true。我该如何让这个工作?检查数字0到7之间的非空格以及检查连字符,如果未找到,则返回false。

3 个答案:

答案 0 :(得分:2)

text[3]始终评估某些内容,因此表达式text[3] != ''始终评估为True

因此,第三个if语句始终运行return False语句。

删除该部分(制作if语句if text[3] != '-':)可使您的程序在第一个测试用例中正常工作。

此外,您似乎正在尝试使破折号可选 - 这将打破您的硬编码索引以完成其余功能,因此您需要一个if块。类似的东西:

def isPhoneNumber(text):
   for i in range(0, 3):
      if not text[i].isdecimal():
         return False
   if text[3] == '-':
      for i in range(4, 7):
         if not text[i].isdecimal():
            return False
      for i in range(8, 12):
        if not text[i].isdecimal():
           return False
      return True
   elif text[3].isdecimal():
      for i in range(4, 6):
         if not text[i].isdecimal():
            return False
      for i in range(7, 11):
        if not text[i].isdecimal():
           return False
      return True
   else:
      return False

一般说明:对于此用例,请查看使用regular expressions,这将允许您指定电话号码的格式,而无需所有此字符串索引。

正则表达式\d{3}-?\d{3}-\d{3}适用于此情况。

答案 1 :(得分:2)

if text[3] != '-' or text[3] != '':

其中一个条件必须为True,因此无论输入如何,您都会返回 False 。我想你需要一个,以及第二个条件中的一个字符(在你提供的任何输入下都是True)。

答案 2 :(得分:1)

在我看来,您正在寻找的解决方案比提议的解决方案更为通用。当然,如果这看起来太长,只需看看我的解决方案,然后根据需要回顾,但我希望能提供帮助。

所以,有一些问题:

首先,正如我所理解的那样(希望我是对的,否则其他答案是完美的)看起来你想接受一些基本的字符串类别:

  1. 完全带连字符的电话号码,例如'444-444-4444'
  2. 非联网电话号码,例如'4444444444'
  3. 上述示例中包含'444-4747635''847847-3948'混合连字符的电话号码。
  4. 不幸的是,只有完全连字符的变种有12个字符。

    因此,行if len(text) != 12:将立即导致具有混合连字符或无连字符的潜在电话号码 拒绝。

    相反,与您的风格保持一致,请尝试if len(text) < 10 or len(text) > 12:。这消除了所有太长或太长的字符串 太短了。

    另一个问题,如其他答案中所述,源于您始终True检查:if text[3] != '-' or text[3] != ''。第二 表达式text[3] != ''将始终具有值True,意思是 函数只能返回False

    也许这种方法的基本原理包括相信检查特定索引处的字符是''可以允许人们对字符串的其余部分进行处理,就像字符是一个索引一样,也许感觉像检查没有其他不需要的字符。这些都是我非常投机的想法,但无论哪种方式,它们似乎都是合理的,但却无法发挥作用。

    为了以类似于原始版本的方式进行,使用变量迭代字符串可能比使用文字更有用,因为我们可以通过哪种方式调查哪些索引。一个变量,称为i,可以指向您在字符串中的位置,而另一个变量(j)可以指向您需要停止进行其他检查的位置。

    我包含了一个完全(我认为)灵活的功能版本,主要使用您考虑的相同方法和风格。我相信这个版本允许没有连字符存在的情况,以及仅缺少第二个时的情况,我不相信上述APerson的解决方案(可能是正确的)。

    如果你确实想要更灵活的版本,这里有一个可能的实现:

    def isPhoneNumber(text):
       i = 0
       j = 0
       if len(text) < 10 or len(text) > 12:
          return False
       while i < 3:
          if not text[i].isdecimal():
             return False
          i += 1
       if text[i] == '-':
          i += 1
       j = i + 3
       while i < j:
          if not text[i].isdecimal():
             return False
          i += 1
       if text[i] == '-':
          i += 1
       j = len(text)          # or j = i + 4 for consistency
       while i < j:
          if not text[i].isdecimal():
             return False
          i += 1
       return True
    

    当然,正如APerson所提到的,regular expressions是解决这种模式匹配问题的一种更简洁的方法。 (他们会通过诸如括号或空格之类的东西处理更通用的电话号码空间变得微不足道。)

    如果APerson对电话号码空间的解释是正确的,那么 答案应该是首选。但是,如果我是正确的,那么正则表达式 \d{3}-?\d{3}-?\d{3}是正确的。