为什么我在一个案例中得到这个“IndexError:字符串索引超出范围”而不是另一个案例?

时间:2013-01-25 09:06:30

标签: python

#i couldnt find the difference in the code 
    >>> def match_ends(words):
     # +++your code here+++
     count=0
     for string in words:
      if len(string)>=2 and string[0]==string[-1]:
       count=count+1
     return count

>>> match_ends(['', 'x', 'xy', 'xyx', 'xx'])
2
>>> 
>>> def match_ends(words):
    # +++your code here+++
     count=0
     for string in words:
      if string[0]==string[-1] and len(string)>=2:
       count=count+1
     return count

>>> match_ends(['', 'x', 'xy', 'xyx', 'xx'])

   Traceback (most recent call last):
   File "<pyshell#26>", line 1, in <module>
   match_ends(['', 'x', 'xy', 'xyx', 'xx'])
   File "<pyshell#25>", line 5, in match_ends
   if string[0]==string[-1] and len(string)>=2:
   IndexError: string index out of range

除了第一个函数中的if条件if len(string)>=2 and string[0]==string[-1]:和第二个函数中的if string[0]==string[-1] and len(string)>=2:之外,我找不到代码中的差异

1 个答案:

答案 0 :(得分:5)

在第一个中,首先要检查是否有足够的字符进行测试,在第二个中你没有:

if len(string)>=2 and string[0]==string[-1]:

if string[0]==string[-1] and len(string)>=2:

并传入字符串:

match_ends(['', 'x', 'xy', 'xyx', 'xx'])

空字符串的长度为0,索引0处没有字符:

>>> len('')
0
>>> ''[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range

if布尔表达式从左到右进行求值,string[0]==string[-1]表达式在len(string)>=2测试之前计算,然后对该空字符串失败。

在另一个版本中,首先评估len(string)>=2部分,发现空字符串为False(0不大于或等于2),然后Python不需要查看在and表达式的另一半,根本不存在and表达式将成为True,无论后半部分的计算结果如何。

请参阅python文档中的Boolean expressions

  

表达式x and y首先评估x;如果x为false,则返回其值;否则,将评估y并返回结果值。