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最後に no)。おそらく、関数の別の定義がありますか?

>>> 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

最初の一致しない文字を見つけたら、早期に終了できます。

== Trueif ステートメントでテストする必要はありません。

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))

これで、メソッドtestPalindromからの結果で関数が呼び出されます。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 (オブジェクト) に渡します。

したがって、この3行の代わりに行う必要があります

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