Weibw's World Weibw's World
首页
  • HTML
  • Python

    • Python基础知识
    • Python CookBook第三版
    • Flask
  • MySQL

    • MySQL基础知识
    • MySQL调优
    • MySQL面试题
算法
  • FineReport
  • Kettle
  • Git
  • 微信公众号文章
  • 优秀博客文章
  • 其他
收藏夹
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Weibw

一个没有梦想的咸鱼
首页
  • HTML
  • Python

    • Python基础知识
    • Python CookBook第三版
    • Flask
  • MySQL

    • MySQL基础知识
    • MySQL调优
    • MySQL面试题
算法
  • FineReport
  • Kettle
  • Git
  • 微信公众号文章
  • 优秀博客文章
  • 其他
收藏夹
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 《Flask》

  • 《Python Cookbook》第三版

    • 第一章:数据结构与算法

    • 第二章:字符串和文本

      • 使用多个界定符分割字符串
      • 字符串开头或结尾匹配
      • 用 Shell 通配符匹配字符串
      • 字符串匹配和搜索
      • 字符串搜索和替换
      • 字符串忽略大小写的搜索替换
      • 最短匹配模式
      • 多行匹配模式
      • 将 Unicode 文本标准化
      • 在正则式中使用 Unicode
      • 删除字符串中不需要的字符
      • 审查清理文本字符串
      • 字符串对齐
      • 合并拼接字符串
        • 字符串中插入变量
        • 以指定列宽格式化字符串
        • 在字符串中处理html和xml
        • 字符串令牌解析
        • 实现一个简单的递归下降分析器
        • 字节字符串上的字符串操作
      • 第三章:数字日期和时间

      • 第四章:迭代器与生成器

      • 第五章:文件与IO

      • 第六章:数据编码和处理

      • 第七章:函数

      • 第八章:类与对象

      • 第九章:元编程

      • 第十章:模块与包

      • 第十一章:网络与Web编程

      • 第十二章:并发编程

      • 第十三章:脚本编程与系统管理

      • 第十四章:测试、调试和异常

      • 第十五章:C语言扩展

    • Python基础

    • Python
    • 《Python Cookbook》第三版
    • 第二章:字符串和文本
    weibw
    2022-01-03

    合并拼接字符串

    # 问题

    你想将几个小的字符串合并为一个大的字符串

    # 解决方案

    如果你想要合并的字符串是在一个序列或者 iterable 中,那么最快的方式就是使用 join() 方法。比如:

    >>> parts = ['Is', 'Chicago', 'Not', 'Chicago?']
    >>> ' '.join(parts)
    'Is Chicago Not Chicago?'
    >>> ','.join(parts)
    'Is,Chicago,Not,Chicago?'
    >>> ''.join(parts)
    'IsChicagoNotChicago?'
    >>>
    
    1
    2
    3
    4
    5
    6
    7
    8

    初看起来,这种语法看上去会比较怪,但是 join() 被指定为字符串的一个方法。这样做的部分原因是你想去连接的对象可能来自各种不同的数据序列 (比如列表,元组,字典,文件,集合或生成器等),如果在所有这些对象上都定义一个 join() 方法明显是冗余的。因此你只需要指定你想要的分割字符串并调用他的 join() 方法去将文本片段组合起来。

    如果你仅仅只是合并少数几个字符串,使用加号 (+) 通常已经足够了:

    >>> a = 'Is Chicago'
    >>> b = 'Not Chicago?'
    >>> a + ' ' + b
    'Is Chicago Not Chicago?'
    >>>
    
    1
    2
    3
    4
    5

    加号 (+) 操作符在作为一些复杂字符串格式化的替代方案的时候通常也工作的很好,比如:

    >>> print('{} {}'.format(a,b))
    Is Chicago Not Chicago?
    >>> print(a + ' ' + b)
    Is Chicago Not Chicago?
    >>>
    
    1
    2
    3
    4
    5

    如果你想在源码中将两个字面字符串合并起来,你只需要简单的将它们放到一起,不需要用加号 (+)。比如:

    >>> a = 'Hello' 'World'
    >>> a
    'HelloWorld'
    >>>
    
    1
    2
    3
    4

    # 讨论

    字符串合并可能看上去并不需要用一整节来讨论。但是不应该小看这个问题,程序员通常在字符串格式化的时候因为选择不当而给应用程序带来严重性能损失。

    最重要的需要引起注意的是,当我们使用加号 (+) 操作符去连接大量的字符串的时候是非常低效率的,因为加号连接会引起内存复制以及垃圾回收操作。特别的,你永远都不应像下面这样写字符串连接代码:

    s = ''
    for p in parts:
    	s += p
    
    1
    2
    3

    这种写法会比使用 join() 方法运行的要慢一些,因为每一次执行 += 操作的时候会创建一个新的字符串对象。你最好是先收集所有的字符串片段然后再将它们连接起来。

    一个相对比较聪明的技巧是利用生成器表达式 (参考 1.19 小节) 转换数据为字符串的同时合并字符串,比如:

    >>> data = ['ACME', 50, 91.1]
    >>> ','.join(str(d) for d in data)
    'ACME,50,91.1'
    >>>
    
    1
    2
    3
    4

    同样还得注意不必要的字符串连接操作。有时候程序员在没有必要做连接操作的时候仍然多此一举。比如在打印的时候:

    print(a + ':' + b + ':' + c) # Ugly
    print(':'.join([a, b, c])) # Still ugly
    print(a, b, c, sep=':') # Better
    
    1
    2
    3

    当混合使用 I/O 操作和字符串连接操作的时候,有时候需要仔细研究你的程序。比如,考虑下面的两端代码片段:

    # Version 1 (string concatenation)
    f.write(chunk1 + chunk2)
    # Version 2 (separate I/O operations)
    f.write(chunk1)
    f.write(chunk2)
    
    1
    2
    3
    4
    5

    如果两个字符串很小,那么第一个版本性能会更好些,因为 I/O 系统调用天生就慢。另外一方面,如果两个字符串很大,那么第二个版本可能会更加高效,因为它避免了创建一个很大的临时结果并且要复制大量的内存块数据。还是那句话,有时候是需要根据你的应用程序特点来决定应该使用哪种方案。

    最后谈一下,如果你准备编写构建大量小字符串的输出代码,你最好考虑下使用生成器函数,利用 yield 语句产生输出片段。比如:

    def sample():
    	yield 'Is'
    	yield 'Chicago'
    	yield 'Not'
    	yield 'Chicago?'
    
    1
    2
    3
    4
    5

    这种方法一个有趣的方面是它并没有对输出片段到底要怎样组织做出假设。例如,你可以简单的使用 join() 方法将这些片段合并起来:

    text = ''.join(sample())
    
    1

    或者你也可以将字符串片段重定向到 I/O:

    for part in sample():
    	f.write(part)
    
    1
    2

    再或者你还可以写出一些结合 I/O 操作的混合方案:

    def combine(source, maxsize):
    	parts = []
    	size = 0
    	for part in source:
    		parts.append(part)
    		size += len(part)
    		if size > maxsize:
    			yield ''.join(parts)
    			parts = []
    			size = 0
    		yield ''.join(parts)
    # 结合文件操作
    with open('filename', 'w') as f:
    	for part in combine(sample(), 32768):
    		f.write(part)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15

    这里的关键点在于原始的生成器函数并不需要知道使用细节,它只负责生成字符串片段就行了。

    编辑 (opens new window)
    #Python
    上次更新: 2023/10/13, 17:39:25
    字符串对齐
    字符串中插入变量

    ← 字符串对齐 字符串中插入变量→

    最近更新
    01
    牛客网非技术快速入门SQL练习题
    03-08
    02
    其他日常SQL题
    03-07
    03
    用户与权限管理
    03-05
    更多文章>
    Theme by Vdoing | Copyright © 2021-2023 | Weibw | 辽ICP备18015889号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式