在函数中传递参数+返回 - 为什么这不起作用?

时间:2012-12-30 15:55:15

标签: python python-3.x

我正在使用使用for-loops构建的Palindrome检测器(这是我参加的课程的要求)。

我几乎已经完成了它,但是我在返回参数并在最终函数中使用它时遇到了麻烦。代码如下所示:

  #-*- 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 个答案:

答案 0 :(得分: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

当您找到第一个不匹配的角色时,您可以提前退出。

您不需要在if语句中测试== True,只需执行:

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

答案 1 :(得分:3)

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

ordnaText(text)

这将调用ordnaText函数,输入的文本作为参数;然后它将结果抛弃。

testPalindrom(ordnaText(text))

现在,这会使用testPalindrom方法的结果调用ordnaText函数;然后再把它扔掉了。由于您已经调用了ordnaText方法,因此最好先存储结果,这样您就可以传递结果。

showResult(testPalindrom)

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

text = input("Inser text here: ")
text = ordnaText(text)
testResult = testPalindrom(text)
showResult(testResult)

答案 2 :(得分: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)

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

答案 3 :(得分:0)

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

通过

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

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

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

showResult(testPalindrom(ordnaText(text)))