python-3.x 为什么函数内部的While循环总是返回True?

bvjveswy  于 2023-02-01  发布在  Python
关注(0)|答案(3)|浏览(208)

我正在学习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时,它似乎能准确地检测回文--但我不知道为什么。

k97glaaz

k97glaaz1#

如果程序是这样编写的:

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))
    • 迭代-1时:**

因为第一个字符('t ')和最后一个字符('t ')相等时,它将进入if条件并返回True。当在函数中执行return语句时,控制从函数中出来。换句话说,只要执行return True语句,控制就返回print语句,而不执行while循环的剩余迭代,并且由于我们返回了True,因此True将作为输出打印。
让我们分析第二个程序:

from collections import deque

word = "tacrocat"

def check_palindrome(word):
    d = deque(word)
    while len(d) > 1:
        if d.pop() != d.popleft():
            return False
    return True

print(check_palindrome(word))
    • 迭代-1时:**
Current deque: [t,a,c,r,o,c,a,t]

我们将弹出if condition中的第一个元素和最后一个元素,并检查它们是否相等。由于't'和't'相等,因此if condition将不执行,while循环将继续。

    • 迭代-2时:**
Current deque: [a,c,r,o,c,a]

由于'a'和'a'相等,if条件将不执行,while循环将继续。第一个和最后一个元素都弹出(pop和popleft)

    • 在迭代-3时:**
Current deque: [c,r,o,c]

由于'c'和'c'相等,if条件将不执行,while循环将继续。第一个和最后一个元素都弹出(pop和popleft)

    • 迭代-4时:**
Current deque: [r,o]

由于'r'和'o'不相等,if条件将执行,return False语句将执行。因此,函数check_palindrome将终止,返回值为False,因此我们得到的输出为False。
第二个程序是正确的,因为要检查一个单词是否是回文,我们需要检查所有的字母是否满足条件。只检查一个单词的第一个和最后一个字符,如果它们相等,并不意味着其余的字母相同。我们也需要检查它们。

vsaztqbk

vsaztqbk2#

一旦找到return True,它将退出函数。
在第一次迭代中,它将比较tt并退出函数。
你的情况是第一个字母就出来了。
相反,你可以按照@Goodies在评论中所说的去做。

from collections import deque

word = "tacrocat"

def check_palindrome(word):
    d = deque(word)
    while len(d) > 1:
        if d.pop() != d.popleft():
            return False
    return True
print(check_palindrome(word))
krcsximq

krcsximq3#

发生这种情况是因为如果中心两边的任何一个字符相等,它将返回True。这可能会让人困惑,但基本上它会检查是否镜像了 * 任何 * 个字母,而不是 * 所有 * 个字母,因为return True提前退出。
这意味着,实际上,您的函数并不总是返回True,例如像“word”这样的单词将返回false。
为了解决这个问题,我们可以在找到一个匹配时返回True,否则返回False,而在任何不匹配时返回False,否则返回True,如下所示(见上面@Goodies的注解):

from collections import deque

word = "tacrocat"

def check_palindrome(word):
    d = deque(word)
    while len(d) > 1:
        if d.pop() != d.popleft():
            return False
    return True

print(check_palindrome(word))

其(正确地)输出:

False

相关问题