あなたのソリューションにはいくつかの問題があります。行ごとに分析してみましょう。
global
関数スコープ外の変数を変更するつもりがない場合は、ステートメントは必要ありません。したがって、global
コードから を 2 行削除しました。
li=list(str(n))
: 文字列をリストにキャストする必要はありません。Python の文字列は不変リストと同様のインターフェースを持っているからです。したがって、単純なものli = str(n)
で十分です。
if (len(li)==(1 or 0)):
: 問題ないように見えますが、実際には値を他のいくつかの値と比較する方法が正しくありません。このor
演算子は、左または右のオペランドから最初の「真」の値を返すため、この場合は常に を返します1
。代わりに、in
左オペランドが右オペランドの要素であるかどうかをチェックする演算子を使用できます。右側のオペランドをタプルにすれば(1, 0)
、すべてうまくいきます。さらに、if
ステートメントを括弧で囲む必要はありません。あなたは書くべきです:if len(li) in (1, 0):
elif li[len(li)-1]==li[0]:
これは問題ありませんが、ネガティブ リスト インデックスをサポートしているため、Python ではこれを短く書くことができます。elif li[-1] == li[0]:
ポイント2.のためにリスト(可変シーケンス)を使用しないため、それらを行うことはできませんdel li[0]
。とにかく、リストの最初の要素を削除することは、Python では非常に非効率的です (リスト全体をコピーする必要があります)。まったく同じ理由から、できませんdel li[len(li)-1]
。代わりに、「スプライシング」演算子を使用して、文字列から部分文字列を抽出できます。li = li[1:-1]
if len(li)==0:
は不要な長さです。Python では、空の文字列とリストは、if
. だからあなたは書くことができますif not li:
if len(li)>0:
: が空でない場合は、もう一度確認する必要li
はありません。ポイント 6 で確認しました。したがって、単純なものelse:
で十分です。または、この行を完全に削除し、残りの関数のインデントを解除します。これif
は、6.の本体にreturn
. したがって、 を入力しなかった場合はif
、else
まったく書き込まずに になります。
x=''.join(li)
: 2 で決定したため、文字列を文字列に変換する必要はありません。この行を削除します。
str(x)
str()
: この行は、引数をその場で変更せずに新しい値を返すため、コード内で何も役に立ちませんでした (そのためx = str(x)
、より意味があります)。削除することもできます。
f(x)
: これは、Python で再帰関数を呼び出す有効な方法ですが、その値で何かを行う必要があります。おそらくそれを返しますか?これを次のように変更します: return f(li)
(x
もう変数がないため)。
最終的には次のコードになります。
def f(n):
li = str(n)
if len(li) in (1, 0):
return True
elif li[-1] == li[0]:
li = li[1:-1]
if not li:
return True
return f(li)
else:
return False
必要なものはほとんど揃っていますが、まだ少し改良することができます。行をif not li: return True
見ると、それらが不要であることがわかります。それらを削除するf
と、引数として空の文字列で呼び出され、len(li)
0 に等しくなり、True
とにかく返されます。したがって、次の行を削除します。
def f(n):
li = str(n)
if len(li) in (1, 0):
return True
elif li[-1] == li[0]:
li = li[1:-1]
return f(li)
else:
return False
以上です!成功するプログラマーになる道を頑張ってください!