不返回预期结果python [重复]

Posted

技术标签:

【中文标题】不返回预期结果python [重复]【英文标题】:Not returning expected result python [duplicate] 【发布时间】:2017-09-07 12:04:38 【问题描述】:
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'))

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

【问题讨论】:

缩进似乎关闭了...错误的空间? 【参考方案1】:
if text[3] != '-' or text[3] != '':

这两个条件之一必须为真,因此无论输入如何,您都会返回 False。我想你想要一个 and ,以及第二个条件中的一个字符(在你给出的任何输入下都是 True )。

【讨论】:

但即使我添加 or not text[3].isdecimal return False 它仍然没有返回预期值。 @user3567030 试试我的答案,我添加了一些代码使其适用于第三个测试用例【参考方案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,它可以让您指定电话号码的格式,而无需所有这些字符串索引。

正则表达式 \d3-?\d3-\d3 在这种情况下有效。

【讨论】:

好吧,没错,我现在明白了。【参考方案3】:

在我看来,您正在寻找的解决方案可能比提议的解决方案更通用。当然,如果这看起来太长,只需查看我的解决方案底部并根据需要返回,但我希望对您有所帮助。

所以,有几个问题:

首先,据我了解(希望我是对的,否则其他答案是完美的)看起来您想要接受一些基本的字符串类别:

    完全连字符的电话号码,例如'444-444-4444' 非连字符电话号码,例如'4444444444' 上面示例中带有混合连字符的电话号码,例如 '444-4747635''847847-3948'

很遗憾,只有完全连字符的品种有 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 对电话号码空格的解释是正确的,那 答案应该是首选。但是,如果我是对的,那么正则表达式 \d3-?\d3-?\d3 是正确的。

【讨论】:

以上是关于不返回预期结果python [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用“限制”查询不返回结果[重复]

Python-在while循环期间将列表附加到列表-结果与预期不符[重复]

数据框不返回完整结果Python [重复]

PDO 不返回任何结果,而 MySQL 命令行返回预期结果

子查询不返回预期结果

将逻辑运算符与 If 语句一起使用不会输出预期的结果 [重复]