关于返回表达式

3 投票
3 回答
4460 浏览
提问于 2025-04-16 03:22

级别:初学者

下面的代码会打印出'False'

def function(x):
    if len(x) == 5: return True
    else: return x[0] == x[-1]

print function('annb')

为什么这一行“else: return x[0] == x[-1]”会打印出False呢?我明白发生了什么,但很难用简单的语言表达出来……这种行为怎么描述比较好呢?

这是一个常见的“技巧”吗?

我第一次遇到这种写法是在尝试用递归解决一个回文的问题。似乎让递归正常工作唯一的方法就是使用这种简化的写法:

def isPalindrome(s):
 if len(s) <= 1: return True
 else: return s[0] == s[-1] and isPalindrome(s[1:-1])

print isPalindrome('anna')

谢谢

Baba

3 个回答

0

总体来说,你的函数的功能是:如果字符串x的长度等于5,就返回True;如果字符串的最后一个字符和第一个字符相同,也返回True;否则返回False。

这种条件判断的方式,像“否则返回False”,用“或”语句来表达会更好,因为“或”语句只有在所有条件都为假时才返回假,并且会返回第一个不为假的结果。另一种选择是使用任何一个可以对序列进行相同操作的函数。这里是对原始if语句所有分支的替代测试:

def function(x):
    if len(x) == 5: return True
    else: return x[0] == x[-1]

def funcor(x):
    return (len(x)==5) or (x[0] == x[-1])

def funcany(x):
    return any((len(x)==5, x[0] == x[-1]))

def funcverbal(sequence):
    ## sequence[0] is the first element of zero based indexed sequence
    ## endswith is string specific function so sequence must be string
    ## if it's length is not 5
    return len(sequence)==5 or sequence.endswith(sequence[0])

## function is normal data type in Python, so we can pass it in as variable
def test(func):
    print('Testing %s function' % func)
    for value in ('12345','annb','ansa','23424242',('1','2','1'), 123, '131'):
        try:
            print ("%r -> %r" % (value,func(value)))
        except:
            print ("Failed to call function with " + repr(value))

    print(10 * '-'+'Finished testing '+str(func) + 10 * '-')

for thisfunction in (function, funcor, funcany, funcverbal):
    test(thisfunction)

(在这个网站上,函数的高亮显示是错误的,应该是蓝色的保留字)

在isPalindrome函数的情况下,长度的条件并不是随便的,而是为了识别基本情况,以便停止递归。以'anna'为例,回文函数的操作是:

检查'anna'的长度是否小于2(即1或0),不,它们不是;

比较'a'和'a',继续,因为它们是相同的;

去掉比较的第一个和最后一个字母,然后用'nn'调用isPalindrome。

检查'nn'的长度是否小于2(即1或0),不,它们不是;

比较'n'和'n',继续,因为它们是相同的;

去掉比较的第一个和最后一个字母,然后用''调用isPalindrome。

检查''的长度是否小于2(即1或0),是的。返回True,因为我们找到了回文。

这里有一个更简短的回文测试函数,基于回文反转后与原回文相同的事实。

def isPalindrome(s):
    return s==s[::-1]
1

我觉得你可能对 x[-1] 的用法有些困惑。负数的数组索引是从数组的末尾开始算的,所以在你的例子中,x[-1] 代表的是数组最后一个元素,也就是 'b'。这显然和 x[0] 代表的第一个元素 'a' 不一样,所以这个函数返回了 False。

6

抱歉,我不太确定你想表达的意思,不过可以这样理解:

return (x[0] == x[-1])

如果你只考虑括号里面的内容,你会发现那个“语句”其实是一个布尔值,对吧?这就是为什么你也可以这样做:

if x[0] == x[-1]

所以,简单来说,这里返回的是一个布尔值,用来判断 x[0] 是否等于 [-1]。

你也可以更明确地把这个语句扩展成这样:

if x[0] == x[-1]: # if this is true
    return True # then return true
else:
    return False

但正如你所看到的,条件和你想返回的值其实是一样的,所以大家通常就用简写的方式来写,如你看到的那样:

return x[0] == x[-1]

如果我误解了你的问题,真是抱歉。

编辑:如果你指的是负索引(x[-1]),在 Python 中,负索引基本上是“环绕”的,也就是说,x[0] 是从左到右的第一个元素,而 x[-1] 则是从右到左的第一个元素。

撰写回答