3

str.partition我以三种方式在我的代码中使用 Python :

before, __, after = string.partition(sep)
before = string.partition(sep)[0]
after = string.partition(sep)[2]

虽然我str.partition经常使用,但我一直想知道为什么它会返回分隔符。第一行肯定会受益于它返回分隔符,在我看来,第三行也会变得更直观。

虽然我承认可以用

"".join(string.partition(sep))

我没有看到任何用例。

那么,在返回的元组中包含分隔符的基本原理是什么?

4

2 回答 2

4

根据文档str.partition相关str.rpartition的是:

2.5 版中的新功能。

查看该版本的新增功能为这些方法提供了一些基本原理,这些方法“简化了常见用例”

find(S)()方法通常用于获取索引,然后使用该索引对字符串进行切片并获取分隔符之前和之后的片段。partition(sep)()将此模式压缩为单个方法调用,该方法调用返回一个 3 元组,其中包含分隔符之前的子字符串、分隔符本身和分隔符之后的子字符串。


查看最初在开发函数时提供的一些示例,例如替换:

i = host.find(':')
if i >= 0:
    port = host[i+1:]
    ...

和:

_, sep, port = host.partition(':')
if sep:
    ...

包含sep在输出中可以很容易地检查它是否在字符串中找到。有各种示例仅使用三个返回值中的两个,但它们不需要的值各不相同!

于 2015-05-24T12:21:21.053 回答
4

在 jonrsharpe 的带领下,我找到了 Raymond Hettinger 的这封邮件。它解释了基本原理并展示了许多用例。中间值可以用作布尔标志,他们甚至接近称它为“found”而不是“sep”。在他的许多示例中,几乎所有中间值都没有被忽略,它确实被用作布尔标志(有时也被进一步使用)。“旧模式”是调用find、检查< 0>= 0,然后有条件地提取部分。新partition功能很好地取代了这种模式。一个典型的例子:

老的:

i = p.find('=')
if i >= 0:
    name = p[:i]
    value = p[i+1:]
    (use name and value)

新的:

name, found, value = p.partition('=')
if found:
    (use name and value)
于 2015-05-24T13:06:52.430 回答