我在Python str.endswith()中发现了一个错误吗?

时间:2013-08-09 00:04:47

标签: python string

根据Python documentation

  

str.endswith(suffix [,start [,end]])

     

如果字符串以指定的后缀结束,则返回True,否则返回False。后缀也可以是要查找的后缀元组。通过可选的启动,从该位置开始测试。随意结束,在该位置停止比较。

     

在版本2.5中更改:接受元组作为后缀。

以下代码应返回True,但它在Python 2.7.3中返回False

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

似乎str.endswith()忽略了第四个元组之外的任何内容:

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

我发现了一个错误,或者我遗失了什么?

3 个答案:

答案 0 :(得分:10)

  

或者我错过了什么?

你的元组中的';'后面缺少逗号:

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

因此,;?会连接在一起。因此,对于这种情况,以;?结尾的字符串将返回True

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

添加逗号后,它会按预期工作:

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

答案 1 :(得分:0)

如果你把元组写为

>>> tuple_example = ('.', ',', ':', '-', ';' '?', '!')
然后元组将成为

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

这就是为什么返回False

答案 2 :(得分: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一起使用)是它首先在C中有用并随后在Python中使用的原因。