Python函数返回True或1作为None,同时正确返回False和0

Python函数返回True或1作为None,同时正确返回False和0,python,Python,我有一个程序,通过比较字符串的两端,然后递归地对原始字符串执行子字符串,来执行简单的回文检查。也就是说,我将str[0]与str[-1]进行比较,执行str[1,-1]并重复比较。我在单步执行代码时发现,当我要求函数check_palin返回1时,它不返回任何值。我可以清楚地看到它“执行”return语句,但当我要求它返回1时,它总是不返回任何值。但是,它正确地返回0。返回True/False时会观察到相同的行为。这是我的密码。我做错了什么 def check_palin(s): glo

我有一个程序,通过比较字符串的两端,然后递归地对原始字符串执行子字符串,来执行简单的回文检查。也就是说,我将str[0]与str[-1]进行比较,执行str[1,-1]并重复比较。我在单步执行代码时发现,当我要求函数check_palin返回1时,它不返回任何值。我可以清楚地看到它“执行”return语句,但当我要求它返回1时,它总是不返回任何值。但是,它正确地返回0。返回True/False时会观察到相同的行为。这是我的密码。我做错了什么

def check_palin(s):
    global init
    print("Init is %d" %(init))
    if len(s) <= 1 :
        if not init :
            print("returning 1")
            return True
        else :
            print("Please supply a string of atleast 2 characters! Exiting...\n")
            print("returning 0")
            return False
    else :
        init = 0
        if first_word(s) == last_word(s) :
            check_palin(middle(s))
        else :
            print("returning 0")
            return False


def first_word(s) :
    return s[0]

def last_word(s):
    return s[-1]

def middle(s):
    return s[1:-1]

init  = 1
s = raw_input("Please enter a string")
print(check_palin(s))
if not check_palin(s) :
    print ("String %s IS NOT a palindrome!" %(s))
else :
    print ("String %s IS a palindrome!" %(s))

Output:
Please enter a stringababa
Init is 1
Init is 0
Init is 0
returning 1
None
Init is 0
Init is 0
Init is 0
returning 1
String ababa IS NOT a palindrome!

Process finished with exit code 0

您忘记返回递归的结果

    if first_word(s) == last_word(s) :
        return check_palin(middle(s))

这是如此常见,这个错误应该有一个名称,就像基本的递归错误一样。默认用户否定了函数使用契约功能失调。你的问题哦,小子!这是新手犯的错误,好吧!谢谢!现在让我走吧,羞愧地隐藏自己……在python中,检查s是否是回文的一种更简单的方法是s==s[:-1]。它反转字符串并将其与原始字符串进行比较。我认为它更像是“蟒蛇”。你不必像许多低级语言那样逐个索引地检查。我用它来编写递归函数。但这是一个相当巧妙的把戏!谢谢