2010-08-26 80 views
3

级别:初级有关退货表达

下面的代码将打印 '假'

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

print function('annb') 

为什么行 “其他:返回X [0] == X [-1]” 打印假? 我确实明白发生了什么,但是我很难将其转换为纯英文......这种行为如何描述?

这是一种常用/常用的“技术”吗?

我试图解决回文运动递归时,第一次遇到这种特殊的语法。看来,为了使递归工作的唯一办法就是用这种速记方法:

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

print isPalindrome('anna') 

感谢 巴巴

回答

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]环绕,这是从“从右到左”的第一个元素。

+0

嗨Blaenk,你的回答现在让我明白了。作为初学者,我必须理解短裤的感觉,谢谢你的帮助! – raoulbia 2010-08-26 23:17:46

1

我觉得你感到困惑的是x[-1]的行为。负数组索引相对于数组的末尾,所以在您的示例中,x[-1] =='b'。这显然不等于x[0] =='a',所以函数返回False。

0

在整个你的函数的功能是: 如果x的长度等于5,返回True 否则,如果字符串的最后一个字符等于第一个返回true, 否则返回False

这种状况别的条件... else返回False最好使用或者只有当所有条件都是False并返回第一个not-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',因为它们是相同的 滴出所比较的第一和最后一个字母和呼叫isPalindrome与“N-N”

看看的“N-N”的长度小于2(1或0),没有它们不 比较“N”与“N ',继续,因为它们是相同的 辍学比较的第一个和最后一个字母,并呼吁isPalindrome与''

看看''的长度是否小于2(1或0),是的。当我们找到回文时,返回True。

这是基于回文逆转与回文相同这一事实的回文测试的替代短期函数。

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