Python – join:为什么是string.join(list)而不是list.join(string)?

这一直困扰着我。看起来这会更好:

my_list = ["Hello", "world"]
print my_list.join("-")
# Produce: "Hello-world"

比这个:

my_list = ["Hello", "world"]
print "-".join(my_list)
# Produce: "Hello-world"

是否有这样的具体原因?


这是因为任何可迭代都可以连接,而不仅仅是列表,但结果和“连接”总是字符串。

例如:

import urllib2
print '\n############\n'.join(
    urllib2.urlopen('http://data.stackexchange.com/users/7095'))

这是在String方法中讨论的……最后在Python-Dev achive中的线程,并被Guido接受。该线程始于1999年6月,并str.join包含在2000年9月发布的Python 1.6中(并支持Unicode)。Python 2.0(str包括支持的方法join)于2000年10月发布。

  • 这个帖子中提出了四个选项:
    • str.join(seq)
    • seq.join(str)
    • seq.reduce(str)
    • join 作为内置功能
  • Guido不仅支持lists,tuples,还支持所有序列/迭代。
  • seq.reduce(str) 新来者很难。
  • seq.join(str) 引入了从序列到str / unicode的意外依赖。
  • join()作为内置函数,仅支持特定数据类型。因此使用内置命名空间并不好。如果join()支持许多数据类型,那么创建优化的实现将很困难,如果使用该__add__方法实现,那么它是O(n²)。
  • sep不应省略分隔符字符串()。显式优于隐式。

此主题中没有其他原因。

这里有一些额外的想法(我自己和我的朋友):

  • Unicode支持即将到来,但它不是最终的。那时UTF-8最有可能取代UCS2 / 4。要计算UTF-8字符串的总缓冲区长度,需要知道字符编码规则。
  • 那时,Python已经决定了一个公共序列接口规则,用户可以创建一个类似序列(可迭代)的类。但是Python不支持在2.2之前扩展内置类型。那时很难提供基本的可迭代类(在另一条评论中提到)。

Guido的决定记录在历史邮件中,决定str.join(seq)

有趣,但看起来确实对!巴里,去吧… – 
Guido van Rossum


242

因为该join()方法是在字符串类中,而不是列表类?

我同意它看起来很有趣。

请参阅http://www.faqs.org/docs/diveintopython/odbchelper_join.html

历史记录。当我第一次学习Python时,我希望join是一个列表的方法,它将分隔符作为参数。很多人都有同样的感觉,加入方法背后有一个故事。在Python 1.6之前,字符串没有所有这些有用的方法。有一个单独的字符串模块,其中包含所有字符串函数; 每个函数都将一个字符串作为其第一个参数。这些函数被认为足够重要,可以放在字符串本身,这对于lower,upper和split等函数有意义。但许多硬核Python程序员反对新的连接方法,认为它应该是列表的方法,或者它根本不应该移动,而只是保留旧的字符串模块的一部分(仍然有很多有用的东西在它)。

— Mark Pilgrim,潜入Python

添加评论

友情链接:蝴蝶教程