Python str join方法:拼接字符串

目录

描述

语法

举例

1. 元素序列是列表

2. 元素序列是元组

3. 元素序列是集合

4. 元素序列是字典

5. 元素序列是字符串

注意事项

1. 要连接的字符串序列(参数)必须是字符串

2. 字符串连接符可省略

3. 当可迭代序列是集合时,拼接结果是无序的

4. 当可迭代序列是字典时,拼接结果是键的拼接

join方法和‘+’性能比较


描述

str.join()方法是Python的字符串方法,用于将序列中的元素以指定的字符串连接成一个新的字符串。

语法

string.join(sequence)
名称说明备注
string字符串连接符可省略
sequence要连接的元素序列不可省略的参数,序列的元素是字符串

举例

1. 元素序列是列表

>>> a = '!@'.join(['Fusion', 'Sphere', 'Cloud'])
>>> a
'Fusion!@Sphere!@Cloud'

2. 元素序列是元组

>>> " ".join(('China', 'Japan', 'USA', 'UK'))
'China Japan USA UK'

3. 元素序列是集合

>>> ''.join({'C', 'h', 'i', 'n', 'a'})
'ahCni'

可以看出,输出的字符顺序与集合中元素的顺序不是保持一致的。

4. 元素序列是字典

>>> ' ~ '.join({'Asia':'China', 'Europe':'UK'})
'Asia ~ Europe'

可以看出,如果序列是字典,拼接的字符是字典的键。

5. 元素序列是字符串

当元素序列仅仅是字符串时,join函数会将字符串中的每一个单个字符抽取出来,与连接符组合。

>>> ', '.join('happy')
'h, a, p, p, y'

注意事项

1. 要连接的字符串序列(参数)必须是字符串

join函数的参数应该是全部由字符串构成的可迭代对象。当可迭代对象不全是由字符串构成的时,Python会报错TypeError。

例如,参数是一个由字符串和整数构成的列表时:

>>> ' * '.join(['1', 2])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 1: expected str instance, int found

2. 字符串连接符可省略

字符串连接符可以省略(空字符串)。当字符串连接符为空时,序列中的所有字符串都将连接成一个字符串。

>>> ''.join(['1', '2', '3', '4', '5'])
'12345'

3. 当可迭代序列是集合时,拼接结果是无序的

如果可迭代序列参数是集合,join的返回结果不一定是元素在集合中的顺序,而是打乱的:

>>> ' -- '.join({'a', 'b', 'c'})
'b -- c -- a'

4. 当可迭代序列是字典时,拼接结果是键的拼接

如果可迭代序列参数是字典,join的返回结果是字典中键的拼接结果,而不是键值对的拼接结果。

可以用values函数来拼接值的结果。

>>> test_dict = {'A':'a', 'B':'b', 'C':'c'}
>>> "".join(test_dict)
'ABC'
>>> "".join(test_dict.values())
'abc'

join方法和‘+’性能比较

join()方法和 + 号都可以拼接字符串,但是性能却差异很大。

先来看下面的例子:

下面的例子是将列表str_list中的每个元素分别通过“+”和join方法拼接并重复执行1000次,并比较时间差异。

import time

def spend(func):
    def wapper(*args, **kwargs):
        start = time.time()
        # 为了更好的体验性能差异,重复执行1000遍
        for i in range(1000):
            func(*args, **kwargs)
        end = time.time()
        spend_time = end - start
        print("Spend time: %.6f" % spend_time)
        return
    return wapper

# 通过+号拼接字符串
@ spend
def use_add_opertor(str_list):
    result = ""
    for data in str_list:
        result = result + data

    return


# 通过str.join()方法拼接字符串
@ spend
def use_join_method(str_list):
    result = "".join(str_list)
    return


if __name__ == "__main__":
    # 为了充分体现性能差异,我们把要拼接的字符串列表多写一点
    str_list = ["Python", "OpenStack", "data structure", "arithmetic", "Flask", "MySql",
                "concurrence", "PySpider", "HTML", "CSS", "C", "C++"]
    print("1. Use add operator..")
    use_add_opertor(str_list)

    print("-" * 30)

    print("2. Use str.join() method..")
    use_join_method(str_list)

运行结果如下:

1. Use add operator..
Spend time: 0.001079
------------------------------
2. Use str.join() method..
Spend time: 0.000360

可以看出,在我这台机器上,使用+号拼接字符串比使用str.join()方法拼接字符串消耗时常多了将近2倍。

那么为什么使用join()方法时间会更快一些呢?

因为在Python中字符串是不可变对象,修改字符串就得将原字符串中的值复制,开辟一块新的内存,加上修改的内容后写入到新内存中,以达到“修改”字符串的效果。在使用“+”拼接字符串时,正是使用了重复性的复制、申请新内存、写入值到新内存的工作一遍遍的将字符串的值修改。而使用join()方法拼接字符串时,会先计算总共需要申请多少内存,然后一次性申请所需内存并将字符串复制过去。这样便省去了重复性的内存申请和写入,节省了时间消耗。

### Python字符串或文件路径的拼接方法 #### 使用 `+` 运算符 最简单的字符串拼接方式是通过 `+` 运算符实现。这种方式适用于少量字符串之间的简单连接操作。需要注意的是,这种拼接方式会在每次执行时创建新的字符串对象[^3]。 ```python str1 = "Hello" str2 = "World" result = str1 + " " + str2 # 结果为 "Hello World" print(result) ``` #### 使用 `,` 的打印效果 如果在 `print()` 函数中使用逗号分隔多个变量,则它们会被自动转换为元组并以默认空格作为分隔符显示[^1]。 ```python text1 = "Hello" text2 = "Hider" print(text1, text2) # 输出 ('Hello', 'Hider') ``` 注意:这并不是真正的字符串拼接,而是 `print()` 自动处理的结果。 #### 使用 `%s` 占位符 可以利用 C 风格的格式化字符 `%s` 来完成字符串替换和拼接。这种方法适合于需要动态填充模板的情况[^2]。 ```python name = "Alice" age = 25 message = "My name is %s and I am %d years old." % (name, age) print(message) # My name is Alice and I am 25 years old. ``` #### 使用 `.format()` 方法 `.format()` 是一种更灵活且可读性更高的字符串插值技术。它支持位置参数、关键字参数以及复杂的表达式[^4]。 ```python first_name = "John" last_name = "Doe" full_name = "{} {}".format(first_name, last_name) print(full_name) # John Doe ``` 或者指定字段索引: ```python greeting = "{1}, {0}!".format("world", "Hello") print(greeting) # Hello, world! ``` #### 使用 f-string(仅限 Python 3.6+) f-string 提供了一种简洁而高效的内联表达式书写形式来构建字符串。它是现代推荐使用的字符串格式化工具之一。 ```python item = "apple" price = 0.75 description = f"The price of an {item} is ${price:.2f}." print(description) # The price of an apple is $0.75. ``` #### 利用 `''.join()` 方法 当面对大量片段化的子串集合时(比如存储在一个列表里),应该优先考虑采用 `''.join(iterable)` 方式来进行高效的大规模串联工作。 ```python words = ["This", "is", "a", "sentence."] sentence = " ".join(words) print(sentence) # This is a sentence. path_parts = ['folder1', 'subdir', 'file.txt'] file_path = "/".join(path_parts) print(file_path) # folder1/subdir/file.txt ``` #### 文件路径专用模块——`os.path.join()` 针对跨平台兼容性的需求,在实际开发过程中应当借助标准库中的 `os.path.join()` 或者更为现代化的 `pathlib.Path` 对象来安全可靠地组合目录结构。 ```python import os directory = "C:/Users/User/Documents" filename = "example.txt" filepath = os.path.join(directory, filename) print(filepath) # C:\Users\User\Documents\example.txt ``` 或者使用 pathlib: ```python from pathlib import Path base_dir = Path("/home/user/projects/") config_file = base_dir / "settings.conf" print(config_file) # /home/user/projects/settings.conf ``` ---
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值