0

これが機能する理由:

s = 'xyz'
i = 0     
while i < len(s) and s[i] not in 'aeiou':
        print(s[i])
        i += 1
x
y
z

...しかし、これはそうではありませんか?

s = 'xyz'
i = 0 
while s[i] not in 'aeiou' and i < len(s):
    print(s[i])
    i += 1
x
y
z
Traceback (most recent call last):
  File "<pyshell#135>", line 1, in <module>
    while s[i] not in 'aeiou' and i <= len(s):
IndexError: string index out of range

私は混乱しています、私はここで何が欠けていますか?

4

5 に答える 5

3

評価します

s[i] not in 'aeiou' and i < len(s)

最初 s[i]に評価されます。i = 3これはIndexError.

于 2013-09-26T05:54:36.553 に答える
1

and最初に左側のオペランドの条件値をチェックし、次に左側のオペランドが True と評価された場合にのみ、右側のオペランドの条件値をチェックすることによって動作する二項ブール演算子です。iがstring の長さの範囲内にあるかどうかを最初に確認していないため、2 番目のコードでは範囲外になりますs

次のようなことをすると:

while i < len(s) and s[i] not in 'aeiou':

and演算子は短絡し、それ自体が文字列の範囲外にある場合、「aeiou」にないかどうかを確認しませんs[i]iしたがって、文字列に対する範囲外の配列アクセスから安全です! 条件の順序を反転すると、s[i]最初に「i」が範囲内にあるかどうかを確認せずに、「aeiou」にあるかどうかを確認します。

または、次のようにチェックすると:

while s[i] not in 'aeiou' and i < len(s):

最初の条件が true と評価された場合にのみ、2 番目の条件がチェックされますi < len(s)andPython では、これらの条件は順番に評価されます。 と の両方が条件を左から右に順番にorチェックし、それらも短絡することを覚えておくことが重要です (最初の条件の真の値から真の値を決定できる場合、2 番目の条件はそうではありません)。一概に評価されません。)

于 2013-09-26T05:56:24.247 に答える
0

ここ

while s[i] not in 'aeiou' and i < len(s):

が範囲内にあるかどうかを確認するs[i] 前にアクセスしています。i

于 2013-09-26T05:54:53.640 に答える
0

条件は順番に評価されます。条件の順序を逆にすると、別のコードが実行されます。この特定の例では、文字列内の存在しないインデックスにアクセスすると例外が発生します。最初の False に遭遇したときに条件が「短絡」するため、他の結果では決して起こりません。

于 2013-09-26T05:54:53.680 に答える
0

2番目のケースでは、

i のインデックスのチェックは、s[i] にアクセスした後に行われます

したがって、i = 3 であっても、

最初に s[3] にアクセスしようとし、次に i > 2 であることを確認します。

于 2013-09-26T05:54:53.467 に答える