不返回预期结果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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章