1
s="(8+(2+4))"
def checker(n):
if len(n) == 0:
    return True
if n[0].isdigit==True:
    if n[1].isdigit==True:
        return False
    else:
        checker(n[1:])
else:
    checker(n[1:])

これは私がこれまでに持っているものです。文字列が次の条件を満たしているかどうかを確認する単純なコード。ただし、チェッカーを実行すると、次のようになります。

True
IndexError: string index out of range

何か助けはありますか?事前に感謝します編集:関数の目的は、文字列に1桁の数字のみが含まれている場合はtrueを生成し、文字列に2桁以上の数字が存在する場合はfalseを生成することです。

4

3 に答える 3

3

の長さnが 0の場合n[0]、文字列が空であるため、パーツでエラーが発生します。return印刷する代わりにステートメントを追加する必要があります。

def checker(n):
    if len(n) < 2:
        return True
    if n[0] in x:

そうしないと、文字列の長さが 1 のときにlen(n) < 2エラーが発生します。n[1]

次に、整数を含むリストに文字を一致させようとしているため、インチェックは常に になりますFalse。リスト項目を文字列に変換するか、より適切に使用してstr.isdigitください。

>>> '1'.isdigit()
True
>>> ')'.isdigit()
False
>>> '12'.isdigit()
True

アップデート:

これにはregexとを使用できます。all

>>> import re
def check(strs):
    nums = re.findall(r'\d+',strs)
    return all(len(c) == 1 for c in nums)
... 
>>> s="(8+(2+4))"
>>> check(s)
True
>>> check("(8+(2+42))")
False

コードの作業バージョン:

s="(8+(2+4))"
def checker(n):
    if not n:           #better than len(n) == 0, empty string returns False in python
        return True
    if n[0].isdigit():  #str.digit is a method and it already returns a boolean value   
        if n[1].isdigit():   
            return False
        else:
            return checker(n[1:])  # use return statement for recursive calls
                                   # otherwise the recursive calls may return None  
    else:
        return checker(n[1:])        

print checker("(8+(2+4))")
print checker("(8+(2+42))")

出力:

True
False
于 2013-07-09T04:49:45.623 に答える
1

return Trueではなく、最初の if ステートメントの後に行う必要がありますprint True。関数はそのステートメントの後も引き続き実行され、入力のサイズが 0 の場合にエラーが発生します。

于 2013-07-09T04:49:03.880 に答える
0

エラーを再現できません。

私はいくつかのことを修正しなければなりませんでした:

  • 私が推測しているインデントは、ページに貼り付けるだけの問題でした
  • .isdigit()関数です。を呼び出す.isdigit==Trueと、関数オブジェクトが True と比較されますが、True になることはありません。に変更.isdigit==Trueしました.isdigit()
  • 戻り値がバブルアップすることを確認しました-これがなければ、再帰は正常に完了しますが、最も外側の関数は「なし」を返すだけです。

それとは別に、いくつかの印刷ステートメントは、これが期待どおりに機能していることを示しています

s="(8+(2+4))"
t="(8+(20+4))"
def checker(n):
  print "checking %s" % n
  if len(n) == 0:
    print "Returning true"
    return True
  if n[0].isdigit():
    if n[1].isdigit():
        print "returning false"
        return False
    else:
        return checker(n[1:])
  else:
    return checker(n[1:])

print checker(s)
print checker(t)

出力:

checking (8+(2+4))
checking 8+(2+4))
checking +(2+4))
checking (2+4))
checking 2+4))
checking +4))
checking 4))
checking ))
checking )
checking 
Returning true
True
checking (8+(20+4))
checking 8+(20+4))
checking +(20+4))
checking (20+4))
checking 20+4))
returning false
False
于 2013-07-09T06:04:48.093 に答える