def palindrome(w):
    if len(w)==0 or len(w)==1:
        p = 'yes'
        return p
    else:
        if w[0]==w[-1]:
            del w[0]
            del w[-1]
            palindrome(w)
        else:
            p = 'no'
            return p           
s=input()
w=list(s.replace(" ",""))
print(palindrome(w))

当输入不是回文时,代码工作得很好.但当输入是回文时.它返回值NONE而不是YES.为什么会这样呢?

PS:-我是一个初级程序员.我还在学习.所以请你更直截了当地给我解释.

推荐答案

您必须传播您的palindrome(w)呼叫的结果:

return palindrome(w)

如果函数在没有执行return的情况下结束,该函数将自动返回值None.因此,例如,如果您调用palindrome(["a", "b", "a"]),您将计算子调用palindrome(["b"]),然后丢弃其结果,并返回None以换取palindrome(["a", "b", "a"])的值.如果使用return palindrome(w),则值palindrome(["a", "b", "a"])将变为值palindrome(["b"]),这是所需的逻辑.


以下不是错误,而是良好的实践.

可能更好的做法是使函数更通用.与其制作一个只能处理列表的回文函数,为什么不让它可以处理任何序列,包括直接处理字符串呢?但是:

del w[0]
del w[-1]

这在字符串上不起作用,并且会给您一个TypeError:‘Str’对象不支持项删除.不能使用del来删除字符串中的字符:Python字符串是不可变的.您必须创建不包含第一个和最后一个字符的新字符串:

w = w[1:-1]

现在,该功能将同时适用于palindrome([1, 2, 3])palindrome("abc").

最后,对"yes"和"no"使用标准布尔类型会更好.如果您需要向用户显示yesno,请在执行测试的函数之外实现此逻辑,最好是在您需要显示它之前的最后一刻.


最终形式:

def palindrome(w):
    if len(w)==0 or len(w)==1:
        return True
    else:
        if w[0]==w[-1]:
            w = w[1:-1]
            return palindrome(w)
        else:
            return False

s = input()
w = s.replace(" ","")
if palindrome(w):
    print("yes")
else:
    print("no")

Python相关问答推荐

按照行主要蛇扫描顺序对点列表进行排序

如何使用上下文管理器创建类的实例?

使用scipy. optimate.least_squares()用可变数量的参数匹配两条曲线

使用Keras的线性回归参数估计

重新匹配{ }中包含的文本,其中文本可能包含{{var}

如何使用matplotlib在Python中使用规范化数据和原始t测试值创建组合热图?

处理(潜在)不断增长的任务队列的并行/并行方法

为什么抓取的HTML与浏览器判断的元素不同?

改进大型数据集的框架性能

删除marplotlib条形图上的底边

我的字符串搜索算法的平均时间复杂度和最坏时间复杂度是多少?

在Python中计算连续天数

为什么Python内存中的列表大小与文档不匹配?

使用字典或列表的值组合

如何在Python 3.9.6和MacOS Sonoma 14.3.1下安装Pyregion

有没有办法在不先将文件写入内存的情况下做到这一点?

如何在信号的FFT中获得正确的频率幅值

如何设置nan值为numpy数组多条件

使用np.fft.fft2和cv2.dft重现相位谱.为什么结果并不相似呢?

极点替换值大于组内另一个极点数据帧的最大值