核心概念
join() 是 Python 字符串对象的一个方法,它的作用是:将一个可迭代对象(如列表、元组等)中的所有字符串元素,用指定的字符串(分隔符)连接成一个单一的字符串。

语法格式
separator.join(iterable)
separator: 你想用来连接各个元素的分隔符字符串,它可以是空字符串 、单个字符(如 )、多字符(如" --> ")等。iterable: 一个可迭代对象,且其中的所有元素都必须是字符串类型,如果包含非字符串元素(如数字、列表等),Python 会抛出TypeError。
使用示例
基本用法:用逗号和空格连接列表
这是最常见的用法,比如将一个列表转换成 CSV 格式的字符串。
fruits = ['apple', 'banana', 'cherry'] # 使用逗号和空格作为分隔符 result = ", ".join(fruits) print(result) # 输出: apple, banana, cherry
使用空字符串连接(无分隔符)
如果你想将列表中的所有字符串直接拼接在一起,可以使用空字符串作为分隔符。
parts = ['hello', 'world', 'python'] result = "".join(parts) print(result) # 输出: helloworldpython
使用其他字符作为分隔符
分隔符可以是任意字符串,这给了你很大的灵活性。
words = ['Python', 'is', 'awesome']
# 使用空格连接
result_space = " ".join(words)
print(f"用空格连接: {result_space}")
# 输出: 用空格连接: Python is awesome
# 使用 " --> " 连接
result_arrow = " --> ".join(words)
print(f"用箭头连接: {result_arrow}")
# 输出: 用箭头连接: Python --> is --> awesome
# 使用换行符连接
result_newline = "\n".join(words)
print(f"用换行符连接:\n{result_newline}")
# 输出:
# 用换行符连接:
# Python
# is
# awesome
连接元组
join() 同样适用于元组,因为元组也是可迭代对象。

coordinates = (10, 20, 30) result = ", ".join(coordinates) # 这会报错!
错误示范:上面的代码会抛出 TypeError: sequence item 0: expected str instance, int found,因为元组中的元素是整数,而不是字符串。
正确做法:在连接前,必须将所有元素转换为字符串类型,通常使用列表推导式或 map() 函数。
coordinates = (10, 20, 30) # 使用列表推导式 result1 = ", ".join([str(c) for c in coordinates]) print(result1) # 输出: 10, 20, 30 # 使用 map() 函数 result2 = ", ".join(map(str, coordinates)) print(result2) # 输出: 10, 20, 30
连接字符串(将字符串视为字符列表)
当 join 的对象是一个字符串时,它会将该字符串的每个字符作为独立的元素,然后用分隔符连接起来。
text = "python" result = "-".join(text) print(result) # 输出: p-y-t-h-o-n
join() vs. 其他连接方式的比较
理解 join() 的优势,最好的方法就是和传统方法比较。

假设我们要连接一个包含 1000 个字符串的列表:
my_list = ["hello"] * 1000
方法 1:使用 或 循环(不推荐)
这是初学者最常用的方法,但在循环中频繁使用 来连接字符串是非常低效的。
原因:在 Python 中,字符串是不可变的,每次使用 连接两个字符串时,Python 都会创建一个全新的字符串来存储结果,并复制旧字符串的内容,在一个包含 N 个元素的循环中,这种操作会导致大约 N² 次的内存分配和复制,性能会急剧下降。
# 错误且低效的方式
result = ""
for s in my_list:
result += s # 每次循环都创建一个新字符串
# print(result)
方法 2:使用 str.join()(推荐)
这是 Python 中最高效、最地道的字符串连接方式。
原因:join() 方法会先计算最终字符串的总长度,然后一次性分配足够的内存空间,再将所有元素按顺序复制到这个新空间中,整个过程只需要一次内存分配,时间复杂度是线性的 O(N),性能远超循环 。
# 高效且推荐的方式 result = "".join(my_list) # print(result)
方法 3:使用 f-string (Python 3.6+)
对于少量字符串,f-string 非常直观和易读。
a = "hello"
b = "world"
c = "python"
result = f"{a}{b}{c}"
print(result)
# 输出: helloworldpython
但如果用于连接一个列表,语法会有些奇怪,可读性不如 join。
my_list = ['hello', 'world', 'python']
# 这种写法比较笨拙
result = f"{''.join(my_list)}"
print(result)
# 输出: helloworldpython
当连接一个可迭代对象(列表、元组等)时,join() 是首选。
总结与最佳实践
| 特性 | str.join() |
/ 循环 | f-string |
|---|---|---|---|
| 性能 | 极高 (线性时间) | 极低 (平方时间,不推荐) | 高 (少量字符串) |
| 适用场景 | 连接一个列表、元组等可迭代对象 | 连接少量、已知数量的字符串 | 格式化少量字符串,或构建动态模板 |
| 可读性 | 非常好,意图明确 | 对于少量连接可读,循环中连接则混乱 | 非常好,直观 |
| 灵活性 | 分隔符可自定义 | 无分隔符概念 | 分隔符需手动写在模板中 |
核心结论:
- 永远不要在循环中使用 来连接字符串列表。 这是性能上的大忌。
- 当你有一个字符串列表(或任何字符串可迭代对象)需要连接时,请使用
str.join()。 这是 Pythonic 的写法,也是最高效的方式。 - 当你只是需要拼接两三个已知的字符串时,使用 或
f-string都可以,f-string通常更灵活。
记住这个口诀:列表连接用 join,少量拼接用 或 f-string。
