2
#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 len(string)>=2 and string[0]==string[-1]:最初の関数と if string[0]==string[-1] and len(string)>=2:2 番目の関数の if 条件を除いて、コードの違いを見つけることができませんでした。

4

1 に答える 1

6

最初に、最初にテストするのに十分な文字があるかどうかを確認し、2 番目に確認しません。

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部分が最初に評価され、空の文字列 (0 は 2 以下) であることがわかり、Python は式Falseの残りの半分を見る必要がまったくありません。式が後半の評価になるand可能性はありません。andTrue

Python ドキュメントのブール式を参照してください。

x and yは最初に評価されxます。が false の場合x、その値が返されます。それ以外の場合yは評価され、結果の値が返されます。

于 2013-01-25T09:08:30.847 に答える