4

有人可以向我解释为什么在 python 中当我们想加入我们编写的字符串时:

'delim'.join(list)

当我们想分割一个字符串时,我们写:

str.split('delim')

来自java,其中之一似乎是倒退的,因为在java中我们写:

//split:
str.split('delim');
//join
list.join('delim');

编辑:
你是对的。join 需要一个列表。(虽然它不会改变问题)

有人可以向我解释这个 API 背后的基本原理吗?

4

3 回答 3

4

只有在加入某种可迭代对象时加入才有意义。但是,由于可迭代对象不一定包含所有字符串,因此将join作为方法放在可迭代对象上是没有意义的。(你期望结果[1,"baz",my_custom_object,my_list].join("foo")是什么?)唯一的另一个地方是作为一个字符串方法,并理解迭代中的所有内容都将是一个字符串。此外,将join其作为字符串方法允许它与任何可迭代的对象一起使用——元组、列表、生成器、支持迭代甚至字符串的自定义对象。

另请注意,您可以完全自由地以与加入字符串相同的方式拆分字符串:

list_of_strings='this, is , a, string, separated, by , commas.'.split(',')

当然,这里的实用程序并不那么容易看到。

于 2012-07-13T17:05:54.000 回答
2

http://docs.python.org/faq/design.html#why-is-join-a-string-method-instead-of-a-list-or-tuple-method

从来源:

join() 是一个字符串方法,因为在使用它时,您告诉分隔符字符串遍历字符串序列并将其自身插入到相邻元素之间。此方法可以与任何遵守序列对象规则的参数一起使用,包括您可能定义的任何新类。

因为这是一个字符串方法,它可以用于 Unicode 字符串以及纯 ASCII 字符串。如果 join() 是序列类型的方法,那么序列类型必须根据分隔符的类型决定返回哪种类型的字符串。

于 2012-07-13T17:09:39.113 回答
1

这样您就不必为您创建的每个序列类型重新实现连接操作。Python 使用协议而不是类型作为它的主要行为模式,因此即使不是从现有的序列类派生,每个序列也可以预期行为相同。

于 2012-07-13T17:07:17.123 回答