2013-08-09 5 views
0

Согласно Python documentation:Я нашел ошибку в str.endswith() Python?

str.endswith (суффикс [, начало [, конец]])

Возвращает True, если строка заканчивается указанным суффиксом, в противном случае возвращает значение False. суффикс также может быть кортежем суффиксов для поиска. С дополнительным запуском начните тестирование с этой позиции. Withoptional end, прекратите сравнивать в этом положении.

Изменено в версии 2.5: Принимать кортежи как суффикс.

Следующий код должен возвращать True, но он возвращает False в Python 2.7.3:

"hello-".endswith(('.', ',', ':', ';', '-' '?', '!')) 

кажется str.endswith() игнорирует все дальше вперед кортеж элемента:

>>> "hello-".endswith(('.', ',', ':', '-', ';' '?', '!')) 
>>> True 
>>> "hello;".endswith(('.', ',', ':', '-', ';' '?', '!')) 
>>> False 

Have I нашел ошибку, или я что-то упустил?

+5

Объяснение повторной конкатенации неявных строк! – user2357112

+0

@ user2357112: да, это была опасность, когда мы добавили его на C, и он все еще кусает людей даже на этих более новых языках. :-) – torek

ответ

10

или я что-то упускаю?

Вы пропускаете запятую после ';' в вашем наборе:

>>> "hello;".endswith(('.', ',', ':', '-', ';' '?', '!')) 
             # ^
             # comma missing 
False 

В связи с этим, ; и ? сцепляются. Таким образом, строка заканчивается ;? вернется True для этого случая:

>>> "hello;?".endswith(('.', ',', ':', '-', ';' '?', '!')) 
True 

После добавления запятой, она будет работать, как ожидалось:

>>> "hello;".endswith(('.', ',', ':', '-', ';', '?', '!')) 
True 
+1

D'oh! Не могу поверить, что я пропустил это! Почему он не бросает синтаксическую ошибку? –

+2

@SeanW .. Строковые литералы, сидящие рядом друг с другом, объединены. –

+0

Я только что узнал что-то новое. Благодаря! –

0

Если вы пишете кортеж, как

>>> tuple_example = ('.', ',', ':', '-', ';' '?', '!') 

, то кортеж станет

>>> tuple_example 
('.', ',', ':', '-', ';?', '!') 
         ^
        # concatenate together 

Так вот почему return False

0

Уже указано, что смежные строковые литералы конкатенированы, но я хотел добавить немного дополнительной информации и контекста.

Это функция, которая используется совместно с (и заимствована из) C.

Кроме того, это не действует, как оператор конкатенации как «+», и обрабатывают идентично тому, как если бы они были в буквальном смысле присоединились вместе в источнике без каких-либо дополнительных накладных расходов.

Например:

>>> 'a' 'b' * 2 
'abab' 

ли это полезная функция или раздражающий дизайн действительно зависит от точки зрения, но это не позволит разбивая строковые литералы между несколькими линиями инкапсулируя литералы в скобках.

>>> print("I don't want to type this whole string" 
      "literal all on one line.") 
I don't want to type this whole stringliteral all on one line. 

Этот тип использования (наряду с используемым с #defines) Поэтому было бы полезно в С, в первую очередь, а затем был доставлен вперед в Python.

+0

Спасибо за подробное объяснение! –

Смежные вопросы