2017-09-22 9 views
-2

は、なぜ私がこの関数でエラー「範囲外のインデックス」を取得しない場合:インデックスelse文ののpython3

def encode(x): 
    diff_char = x[0] 
    max_ind = len(x) 
    i = 1 
    while i < max_ind and diff_char == x[i]: 
     i += 1 
    return str(i) + diff_char + encode(x[i:]) 

、なぜ私はこのような場合-else文を入れて行くことができますか?

def encode(x): 
    if not x: 
     return "" 
    else: 
     diff_char = x[0] 
     max_ind = len(x) 
     i = 1 
     while i < max_ind and diff_char == x[i]: 
      i += 1 
     return str(i) + diff_char + encode(x[i:]) 
+1

'x [0]'は 'x 'が空のときに範囲外をトリガーします。そのためです。 –

+1

'x 'が空のときに' x [0] 'は何をすると思いますか? – ShadowRanger

+0

xの最初の長さが0でない、つまりlen(x)!= 0の場合はチェックしないでください。 – Sanchit

答えて

2

文字列が空の場合、すなわちx = ''、その後、0が失敗するインデックスへのアクセス:

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

文字列はインデックス0

で何の最初の文字を持っていないので、これは単純です真実度がxであることを最初に確認することで、xが空の文字列である場合を明示的に処理します。だから、その場合は関数から戻り、x[0]は最初の文字の読み込みを試みません。

+0

Thanx mate。 xが決して空にならないことがわかったらどうなりますか?とにかく私はそれをチェックすべきですか? – Juanloz

+0

@Juanlozユーザーの入力や何らかの理由であなたが期待しているものではない場合、なぜあなたのプログラムが爆発するのを防ぐためにチェックしないのですか? –

+0

@Juanlozまた...ここでは再帰を避ける必要があります。非空の入力でも同様に問題が発生する可能性があります。 'encode( 'abc' * 1000)'例えば –

0

str(i) + diff_char + encode(x[i:])この場合、値 "i"はリストxの長さと等しく、再帰的に関数を呼び出すことになります。この場合、xの長さが2の場合、私は2こことx [2:]はあなたに空白のリストを与え、encode関数を呼び出すとx [0]にアクセスしますがxは空のリストです。