这一直让我困惑。看起来这样会更好:
["Hello", "world"].join("-")
除此之外:
"-".join(["Hello", "world"])
有什么具体的原因吗?
这一直让我困惑。看起来这样会更好:
["Hello", "world"].join("-")
除此之外:
"-".join(["Hello", "world"])
有什么具体的原因吗?
当前回答
因为join()方法在字符串类中,而不是列表类中。
看见http://www.faqs.org/docs/diveintopython/odbchelper_join.html:
历史记录。当我第一次学习Python,我希望join是一个方法一个列表分隔符作为参数。许多人们也有同感联接方法背后的故事。先前的对于Python 1.6,字符串没有全部这些有用的方法。有一个包含的单独字符串模块所有字符串函数;每个函数将字符串作为第一个字符串论点这些功能被视为足够重要的字符串本身,这是有意义的对于下部、上部和分裂但许多硬核Python程序员反对新加入方法,认为它应该是方法,或者它根本不应该动,只是呆着旧字符串模块的一部分(仍然有很多有用的东西)。我只使用新的联接方法,但你也会看到代码如果真的困扰你,你可以使用旧的string.join函数相反---Mark Pilgrim,深入Python
其他回答
将其视为拆分的自然正交操作。
我明白为什么它适用于任何可迭代的东西,所以不能简单地在列表中实现。
为了可读性,我希望在语言中看到它,但我认为这实际上是不可行的-如果可迭代性是一个接口,那么它可以添加到接口中,但这只是一个约定,因此没有中心方法将它添加到可迭代的一组东西中。
主要是因为someString.jjoin()的结果是字符串。
序列(列表或元组等)不会出现在结果中,只是一个字符串。因为结果是一个字符串,所以它作为字符串的方法是有意义的。
我100%同意你的观点。如果我们把这里的所有答案和评论归结为“历史原因”。
str.join不仅令人困惑或不好看,在现实世界的代码中也是不切实际的。它击败了可读的函数或方法链接,因为分隔符很少(曾经?)是以前计算的结果。根据我的经验,它总是一个恒定的硬编码值,如“,”。
我使用tools.functools清理代码-允许从一个方向读取代码:
>>> from toolz.functoolz import curry, pipe
>>> join = curry(str.join)
>>>
>>> a = ["one", "two", "three"]
>>> pipe(
... a,
... join("; ")
>>> )
'one; two; three'
管道中还有其他几个函数。其结果是,它可以很容易地从一个方向读取,从开始到结束都是一系列功能。库里地图帮助很大。
变量my_list和“-”都是对象。具体来说,它们分别是类列表和str的实例。join函数属于str类。因此,使用语法“-”.join(my_list)是因为对象“-”将my_list作为输入。
这在String方法中讨论过。。。最后一个线程,并被Guido接受。该线程始于1999年6月,str.join包含在2000年9月发布的Python 1.6中(支持Unicode)。Python 2.0(支持str方法,包括join)于2000年10月发布。
本主题提出了四个选项:str.join(seq)顺序连接(str)顺序减少(str)作为内置函数连接Guido希望不仅支持列表和元组,而且支持所有序列/可迭代项。seq.reduce(str)对于新手来说很难。join(str)引入了从序列到str/unicode的意外依赖关系。join()作为独立的内置函数将只支持特定的数据类型。因此,使用内置命名空间是不好的。如果join()支持许多数据类型,那么创建一个优化的实现将是困难的:如果使用__add__方法实现,那么它将是O(n²)。分隔符字符串(sep)不应省略。显式优于隐式。
以下是一些额外的想法(我自己和我朋友的):
Unicode支持即将到来,但还不是最终的。当时UTF-8最有可能取代UCS-2/-4。要计算UTF-8字符串的总缓冲区长度,该方法需要知道字符编码。当时,Python已经决定了一个通用的序列接口规则,用户可以在其中创建一个类似序列的(可迭代的)类。但Python直到2.2才支持扩展内置类型。当时很难提供基本的可迭代类(这在另一条评论中提到)。
Guido的决定记录在历史邮件中,决定str.join(seq):
有趣,但看起来确实没错!巴里,去吧。。。吉多·范罗苏姆