Есть несколько проблем с вашим решением. Позвольте мне проанализировать их построчно.
Вам не нужны global
операторы, если вы не собираетесь изменять переменные вне области действия функции. Таким образом, я удалил две строки с global
из вашего кода.
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 пустые строки и списки преобразуются в False, если проверено 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
И это все! Удачи на пути к тому, чтобы стать успешным программистом!