and
- это двоичный логический оператор, который работает, сначала проверяя условное значение его левого операнда, а затем проверяя условное значение его правого операнда тогда и только тогда, когда левый операнд имеет значение True. Вы выходите за пределы своего второго кода, потому что вы не проверяете, чтобы узнать, находится ли i
в пределах длины вашей строки s
.
Когда вы делаете что-то вроде:
while i < len(s) and s[i] not in 'aeiou':
Оператор and
будет короткое замыкание и он не будет проверять, чтобы увидеть, если s[i]
не в «AEIOU», если i
сам находится вне диапазона Струна. Таким образом, вы можете избежать доступа к массиву вне пределов границ строки! Если вы измените порядок условий, которые вы проверите, проверьте, находится ли s[i]
в «aeiou», не проверяя сначала, находится ли «i» в диапазоне.
В качестве альтернативы, если вы проверить это следующим образом:
while s[i] not in 'aeiou' and i < len(s):
Если и только тогда, когда первое условие истинно, он будет проверять второе условие i < len(s)
. В Python эти условия оцениваются по порядку, и важно помнить, что как and
, так и or
проверяют условия последовательно слева направо, а также короткие замыкания (если значение истины можно определить из значения истины первого условия, второе вообще не оценивается.)
В 's [i] не в 'aeiou' и i
На самом деле название должно гласить: «Ленькая оценка работает точно, как ожидалось и документирована». – Hyperboreus