您的解决方案存在几个问题。让我逐行分析。
global
如果您不打算更改函数范围之外的变量,则不需要语句。因此,我global
从您的代码中删除了两行 with 。
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
,您会发现它们不是必需的。如果我们删除它们, thenf
将使用空字符串作为参数调用,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
就是这样!祝你在成为一名成功的程序员的路上好运!