我正在使用使用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”,这是一个回文,它说它是假的。 “回文”不知何故不能正确返回。我做错了什么?
答案 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)))