0

根据Python 文档

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

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

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

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

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

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

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

我是否发现了一个错误,或者我错过了什么?

4

3 回答 3

10

还是我错过了什么?

您在';'元组中缺少逗号:

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

因此,;?被串联。因此,以结尾的字符串;?True在这种情况下返回:

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

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

>>> "hello;".endswith(('.', ',', ':', '-', ';', '?', '!'))
True
于 2013-08-09T00:06:12.677 回答
0

如果你把元组写成

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

那么元组将变为

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

所以这就是为什么返回 False

于 2013-08-09T00:15:08.240 回答
0

已经指出相邻的字符串文字是连接的,但我想添加一些额外的信息和上下文。

这是与 C 共享(并借用)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 中被引入。

于 2013-08-09T04:25:10.920 回答