0

我正在使用使用 for 循环构建的回文检测器(这是我参加的课程的要求)。

我几乎完全完成了它,但我无法返回一个参数并在最终函数中使用它。代码如下所示:

  #-*- coding: utf-8 -*-
def main(): 
    intro()
    text = (input("Inser text here: "))
    ordnaText(text)
    testPalindrom(ordnaText(text))
    showResult(testPalindrom)


def intro():
    print ("Hej! Detta är ett program som testar ifall en text är ett palindrom eller inte.")

def ordnaText (text):
    nytext = ("")
    fixedText = text.lower()
    for i in fixedText:
        if i.isalnum():
            nytext = (nytext + i)
    return nytext

def testPalindrome(nytext):
    palindrome = True
    for i in range (0, len(nytext)):
        if (nytext[i]) != (nytext[len(nytext)-i-1]):
            palindrome = False
    return palindrome

def showResult(palindrome):
    if palindrome == True:
        print ("Yes, this is a palindrome")
    else:
        print ("No, this is not a palindrome.)
main()

除了最后一部分外,一切正常:如果我输入回文“lol”,则表示它是错误的。“回文”不知何故无法正确返回。我究竟做错了什么?

4

4 回答 4

4

对于短字符串,要测试回文,只需将其与相反的比较:

def testPalindrome(nytext):
    return nytext == nytext[::-1]

您的版本testPalindrome工作正常,但您的方法本身调用testPalindrom(ordnaText(text))e最后没有),所以也许您对该函数有另一个定义?

>>> def testPalindrome(nytext):
...     palindrome = True
...     for i in range (0, len(nytext)):
...         if (nytext[i]) != (nytext[len(nytext)-i-1]):
...             palindrome = False
...     return palindrome
... 
>>> testPalindrome('lol')
True

您实际上并没有将函数的结果showResult传递给; 您改为传递函数。使用变量:

result = testPalindrome(ordnaText(text))
showResult(result)

您可以稍微简化一下:

def testPalindrome(nytext):
    for i in range (0, len(nytext)):
        if (nytext[i]) != (nytext[len(nytext)-i-1]):
            return False
    return True

当您发现第一个不匹配的字符时,您可以提前退出。

您不需要== True在 if 语句中进行测试,只需执行以下操作:

def showResult(palindrome):
    if palindrome:
        print ("Yes, this is a palindrome")
    else:
        print ("No, this is not a palindrome.)
于 2012-12-30T15:57:49.090 回答
3

您的问题主要在于您的主要功能:

ordnaText(text)

ordnaText这会以输入的文本作为参数调用该函数;然后它把结果扔掉。

testPalindrom(ordnaText(text))

现在 thistestPalindrom用方法的结果调用函数ordnaText;然后它又把结果扔掉了。由于您已经调用了该ordnaText方法,因此之前存储结果也是一个好主意,这样您就可以传递它的结果。

showResult(testPalindrom)

最后,showResult函数作为参数调用函数。此时,没有任何内容引用输入的文本,您只需传递函数本身。所以你想要在这里做的是在这里传递testPalindrom函数的结果:

text = input("Inser text here: ")
text = ordnaText(text)
testResult = testPalindrom(text)
showResult(testResult)
于 2012-12-30T16:03:48.427 回答
1

试试这个(更简洁的代码,相同的逻辑):

def testPalindrome(str) :
    for i in range(int(len(str)/2)) :
        if str[i] != str[len(str)-i-1] :
             return False

    return True

此外,您不会对返回的结果做任何事情:

    testPalindrom(ordnaText(text)) #This returns the result, but there is no variable that accepts it


    showResult(testPalindrom)

你可以这样做:

showResult(testPalindrom(ordnaText(text))) #This will print the returned result

或者 :

    result = testPalindrom(ordnaText(text))

    showResult(result)

建议:您可以使这段代码更短更整洁。

于 2012-12-30T16:03:42.170 回答
0

您必须将 testPalindrom 的结果传递给 showResult

通过做

ordnaText(text)
testPalindrom(ordnaText(text))
showResult(testPalindrom)

您将函数本身传递给不等于 True 的 showResult (这是一个对象)

所以你应该做而不是这三行

showResult(testPalindrom(ordnaText(text)))
于 2012-12-30T16:04:01.737 回答