我正在学习while循环。
为了练习,我创建了一个简单的while循环,在函数中使用If语句来检查一个单词是否是回文,由于某种原因,即使这个单词不是回文,它也会不断返回True。
我期望print函数在最后一行的输出为False:
from collections import deque
word = "tacrocat"
def check_palindrome(word):
d = deque(word)
while len(d) > 1:
if d.pop() == d.popleft():
return True
return False
print(check_palindrome(word))
注意:当我将if语句求值改为“!=",将if语句内部的return语句改为False,并将while循环中的return语句改为True时,它似乎能准确地检测回文--但我不知道为什么。
3条答案
按热度按时间k97glaaz1#
如果程序是这样编写的:
因为第一个字符('t ')和最后一个字符('t ')相等时,它将进入if条件并返回True。当在函数中执行return语句时,控制从函数中出来。换句话说,只要执行return True语句,控制就返回print语句,而不执行while循环的剩余迭代,并且由于我们返回了True,因此True将作为输出打印。
让我们分析第二个程序:
我们将弹出if condition中的第一个元素和最后一个元素,并检查它们是否相等。由于't'和't'相等,因此if condition将不执行,while循环将继续。
由于'a'和'a'相等,if条件将不执行,while循环将继续。第一个和最后一个元素都弹出(pop和popleft)
由于'c'和'c'相等,if条件将不执行,while循环将继续。第一个和最后一个元素都弹出(pop和popleft)
由于'r'和'o'不相等,if条件将执行,return False语句将执行。因此,函数check_palindrome将终止,返回值为False,因此我们得到的输出为False。
第二个程序是正确的,因为要检查一个单词是否是回文,我们需要检查所有的字母是否满足条件。只检查一个单词的第一个和最后一个字符,如果它们相等,并不意味着其余的字母相同。我们也需要检查它们。
vsaztqbk2#
一旦找到
return True
,它将退出函数。在第一次迭代中,它将比较
t
与t
并退出函数。你的情况是第一个字母就出来了。
相反,你可以按照@Goodies在评论中所说的去做。
krcsximq3#
发生这种情况是因为如果中心两边的任何一个字符相等,它将返回
True
。这可能会让人困惑,但基本上它会检查是否镜像了 * 任何 * 个字母,而不是 * 所有 * 个字母,因为return True
提前退出。这意味着,实际上,您的函数并不总是返回
True
,例如像“word”这样的单词将返回false。为了解决这个问题,我们可以在找到一个匹配时返回
True
,否则返回False
,而在任何不匹配时返回False
,否则返回True
,如下所示(见上面@Goodies的注解):其(正确地)输出: