Да, это правильное / ожидаемое поведение:
strpos
может возвращать 0
, когда есть совпадение в начале строки false
, когда нет совпадения . Дело в том, что вы не должны использовать ==
для сравнения 0
и false
; вы должны использовать ===
, например:
if(strpos("abcdefghijklmnop","http://www.") === 0) {
}
Или:
if(strpos("abcdefghijklmnop","http://www.") === false) {
}
Для получения дополнительной информации см. Операторы сравнения :
$a == $b
будет TRUE
, если $a
равно $b
. $a === $b
будет TRUE
, если $a
равно $b
], и они одного типа. И, цитируя страницу руководства strpos
:
Это функция может возвращать Boolean
blockquote>FALSE
, но может также возвращать небулевое значение, которое оценивается какFALSE
, например0
или""
. Подробнее читайте в разделе Booleans . Используйте оператор===
для проверки возвращаемого значения этой функции.
Поскольку -1
самостоятельно допустимый индекс. Это могло использовать другое значение, такой как None
, но это не было бы полезно, который -1
может быть в других ситуациях (таким образом str.find()
), и составил бы просто проверку ошибок, которая является точно, для чего исключения.
Добавить к ответу Devin: Это - старые дебаты между специальными возвращаемыми значениями по сравнению с исключениями. Многие гуру программирования предпочитают исключение, потому что на исключении, я добираюсь, чтобы видеть, что целые stacktrace и непосредственный выводят что не так.
Ну, специальное значение должно было бы на самом деле быть None
, потому что-1 допустимый индекс (значение последнего элемента списка).
Можно эмулировать это поведение:
idx = l.index(x) if x in l else None
"Дебаты" значения исключения по сравнению с ошибкой частично о ясности кода. Рассмотрите код с ошибочным значением:
idx = sequence.index(x)
if idx == ERROR:
# do error processing
else:
print '%s occurred at position %s.' % (x, idx)
Обработка ошибок заканчивается наполненная посреди нашего алгоритма, затеняя процесс выполнения программы. С другой стороны:
try:
idx = sequence.index(x)
print '%s occurred at position %s.' % (x, idx)
except IndexError:
# do error processing
В этом случае объем кода является эффективно тем же, но основной алгоритм не повреждается обработкой ошибок.
В Python,-1 допустимый индекс, означая число от конца списка (вместо начала), поэтому если необходимо было сделать
idx = mylist.index(someval)
nextval = mylist[idx+1]
затем Вы получили бы первое значение массива, вместо того, чтобы понять, что была ошибка. Таким образом, можно поймать исключение и соглашение с ним. Если Вы не хотите исключения, то просто проверяют заранее:
if someval in mylist:
idx = mylist.index(someval)
Править: Нет действительно никакой точки в возврате Ни одного, потому что, если Вы собираетесь не протестировать ни на Один, Вы могли бы также протестировать, является ли значение в списке как выше!
Это должно главным образом гарантировать, что ошибки фиксируются как можно скорее. Например, рассмотрите следующее:
l = [1, 2, 3]
x = l.index("foo") #normally, this will raise an error
l[x] #However, if line 2 returned None, it would error here
Вы заметите, что ошибка бросить в l[x]
вместо в x = l.index("foo")
если индекс не должен был возвращать Ни один. В этом примере это не действительно грандиозное предприятие. Но предположите, что третья строка находится в некотором совершенно другом месте в программе миллионлайн. Это может привести к определенному кошмару отладки.
Я соглашаюсь с Devin Jeanpierre и добавил бы, что контакт со специальными значениями может выглядеть хорошим в маленьких случаях в качестве примера, но (с несколькими существенными исключениями, например, NaN в FPUs и Пустым указателем в SQL) он не масштабируется почти также. Единственное время это работает, то, где:
Одна простая идея: -1
совершенно применимо как индекс (как другие отрицательные величины).
Это - семантический аргумент. Если Вы хотите знать индекс элемента, Вы утверждаете, что он уже существует в списке. Если Вы хотите знать, существует ли это, необходимо использовать in
.