python字符串相加_Python实用技法第33篇:字符串连接及合并

问题

我们想将许多小字符串合并成一个大的字符串。

解决方案

如果想要合并的字符串在一个序列或可迭代对象中,那么将它们合并起来的最快方法就是使用join()方法。示例如下:

>>> parts = ['Is', 'Chicago', 'Not', 'Chicago?']

>>> ' '.join(parts)

'Is Chicago Not Chicago?'

>>> ','.join(parts)

'Is,Chicago,Not,Chicago?'

>>> ''.join(parts)

'IsChicagoNotChicago?'

>>>

Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

初看上去语法可能显得有些怪异,但是join()操作其实是字符串对象的一个方法。这么设计的部分原因是因为想要合并在一起的对象可能来自于各种不同的数据序列,比如列表、元组、字典、文件、集合或生成器,如果单独在每一种序列对象中实现一个join()方法就显得太冗余了。因此只需要指定想要的分隔字符串,然后在字符串对象上使用join()方法将文本片段粘合在一起就可以了。

如果只是想连接一些字符串,一般使用+操作符就足够完成任务了:

>>> a = 'Is Chicago'

>>> b = 'Not Chicago?'

>>> a + ' ' + b

'Is Chicago Not Chicago?'

>>>

针对更加复杂的字符串格式化操作,+操作符同样可以作为format()的替代,很好地完成任务:

>>> print('{} {}'.format(a,b))

Is Chicago Not Chicago?

>>> print(a + ' ' + b)

Is Chicago Not Chicago?

>>>

如果打算在源代码中将字符串字面值合并在一起,可以简单地将它们排列在一起,中间不加+操作符。示例如下:

>>> a = 'Hello' 'World'

>>> a

'HelloWorld'

>>>

讨论

字符串连接这个主题可能看起来还没有高级到要用一整节的篇幅来讲解,但是程序员常常会在这个问题上做出错误的编程选择,使得他们的代码性能受到影响。

最重要的一点是要意识到使用+操作符做大量的字符串连接是非常低效的,原因是由于内存拷贝和垃圾收集产生的影响。特别是你绝不会想写出这样的字符串连接代码:

s = ''

for p in parts:

s += p

这种做法比使用join()方法要慢上许多。主要是因为每个+=操作都会创建一个新的字符串对象。我们最好先收集所有要连接的部分,最后再一次将它们连接起来。

一个相关的技巧(很漂亮的技巧)是利用生成器表达式(见1.19节)在将数据转换为字符串的同时完成连接操作。示例如下:

>>> data = ['ACME', 50, 91.1]

>>> ','.join(str(d) for d in data)

'ACME,50,91.1'

>>>

对于不必要的字符串连接操作也要引起重视。有时候在技术上并非必需的时候,程序员们也会忘乎所以地使用字符串连接操作。例如在打印的时候:

print(a + ':' + b + ':' + c) # Ugly

print(':'.join([a, b, c])) # Still ugly

print(a, b, c, sep=':') # Better

将字符串连接同I/O操作混合起来的时候需要对应用做仔细的分析。例如,考虑如下两段代码:

# Version 1 (string concatenation)

f.write(chunk1 + chunk2)

# Version 2 (separate I/O operations)

f.write(chunk1)

f.write(chunk2)

如果这两个字符串都很小,那么第一个版本的代码能带来更好的性能,这是因为执行一次I/O系统调用的固有开销就很高。另一方面,如果这两个字符串都很大,那么第二个版本的代码会更加高效。因为这里避免了创建大的临时结果,也没有对大块的内存进行拷贝。这里必须再次强调,你需要对自己的数据做分析,以此才能判定哪一种方法可以获得最好的性能。

最后但也是最重要的是,如果我们编写的代码要从许多短字符串中构建输出,则应该考虑编写生成器函数,通过yield关键字生成字符串片段。示例如下:

def sample():

yield 'Is'

yield 'Chicago'

yield 'Not'

yield 'Chicago?'

关于这种方法有一个有趣的事实,那就是它不会假设产生的片段要如何组合在一起。比如说可以用join()将它们简单的连接起来:

text = ''.join(sample())

或者,也可以将这些片段重定向到I/O:

for part in sample():

f.write(part)

又或者我们能以混合的方式将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)

for part in combine(sample(), 32768):

f.write(part)

Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎

关键在于这里的生成器函数并不需要知道精确的细节,它只是产生片段而已。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pycharm pyqt5 pyrrc_编程基础 | Pycharm安装、配置、快捷键

Pycharm可以去官网下载Pycharm的安装激活jar包的目的就是让截获截止时间并骗过pycharm;将jar包放入pycharm在你本地的安装目录bin下。并且修改两个以 vmoptions为结尾的启动文件如图所示:并且在两个文件后追加 -javaagent:D:devAppPyCharm 2017.3.2inJetbrainsCrack-2.6.10-rel…

微信公众号url服务器在哪里,微信公众号url认证(服务器认证)

把下面的代码复制路由需指定到wx方法namespace App\Http\Controllers\Wx;use Illuminate\Http\Request;use App\Http\Controllers\Controller;class WxController extends Controller{public function Wx(){//valid signature , optionif($this->checkSignature()){$echoStr…

php的web表单系统源码毕设_从业十多年看了千百套Java毕设项目,整理出100个精品!免费分享...

加班无数个昼夜看了千百套Java毕设项目,发现这100个精品!今天免费分享给大家!再给大家推荐一条由浅入深的JAVA学习路径,首先完成 Java基础、JDK、JDBC、正则表达式等基础实验,然后进阶到 J2SE 和 SSH 框架学习。最后再…

xbox360无线手柄接收器驱动_八位堂USB 无线接收器让手柄不闲置,无线畅玩各平台游戏...

遥想儿时每逢周末放假,得闲便会打上一下午的游戏。富有活跃想象力的游戏画面和不断操作游戏手柄发出的愉悦打击声,总会令人感到如此如醉。长大了,随着科技创新进步与物质生活的丰富,我们都会向往童年时游戏带来的满足愉快之情&…

在scrapy中parse函数里面xpath的内容打印不出来_如何正确的使用Scrapy ?

本节是 《Python爬虫从入门到进阶》课程中的一节,课程购买链接(PC访问需要微信扫码) ,目前已更新80% 课程购买课程请扫码:Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。只需要编写很少的代码就能实现抓取功能&a…

绳索受力分析的软件_【硕士论文】供热管网管道支架载荷分析与优化设计

摘 要改革开放后我国经济快速发展,随着集中供热事业的扩大,集中供暖越来越受到广大民众的欢迎,居民冬季用热为主的集中供暖面积在连年递增,已经成为主要一种供暖方式。集中供热作为城市公共服务功能中重要的一项工作,对…

python-docx 如何获取当前字号_餐饮老字号迈上“云端”

原标题:餐饮老字号迈上“云端”老字号陈麻婆豆腐旗舰店。 杨予頔 摄中新网成都10月31日电 (单鹏)临近中午,成都餐饮老字号“钟水饺”文殊院店的前台站满身穿黄色和蓝色服装的“外卖小哥”,拿到打包好的钟水饺后,他们急匆匆地转身…

python编的俄罗斯方块游戏_python编写俄罗斯方块

本文实例为大家分享了python实现俄罗斯方块的具体代码,供大家参考,具体内容如下 #codingutf-8 from tkinter import * from random import * import threading from tkinter.messagebox import showinfo from tkinter.messagebox import askquestion imp…

进入hbase命令_Zookeeper、Hbase安装部署

zookeeper安装与配置使用xftp将压缩包传入/soft中创建zookeeper数据存放目录mkdir /soft/zookeeperchmod 766 /soft/zookeeper分别在三台服务上面依次执行 echo id > /var/zookeeper/myid 命令创建zookeeper编号的myid文件echo 1 > /soft/zookeeper/myidecho 2 > /sof…

c++new时赋初值_C高级编程精髓之内存管理,万千码农踩过的雷,大神带你走出雷区...

今天给大家分享C高级编程精华片之内存管理——欢迎跟大家一起踏进内存这片雷区,然后带大家从雷区中走出来!程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们&#xff…

为什么用pyqt的不多_现在农村提倡用天然气和清洁煤球取暖,为何农民不爱用?看完懂了...

近几年华北很多农村响应保护环境的政策,大多数农村家庭都安装了天然气。冬季的取暖方式也从以前的烧煤取暖改成了烧天然气或清洁煤球取暖。对于安装天然气并烧天然气或清洁煤球取暖,大多数农民都很抗拒,为什么农村人不愿意烧天然气和清洁煤球…

两种参数类型_布尔参数这些缺点不能忍?不如试试枚举吧

全文共2222字,预计学习时长9分钟图源:unsplash在代码库中使用布尔标志值来管理状态机似乎听起来是个不错的办法,但事实并非如此。布尔值恐怕是很多程序员接触到的第一种数据类型,它非常简单,只有两种状态: true 和fals…

405 not allowed怎么解决_英语口语:“您拨叫的用户不在服务区”这类电话常用语怎么说...

1、空号:中文:您好!您所拨打的号码是空号,请核对后再拨。英文:Sorry! The number you dialed does not exist, please check it and dial later.2、被叫用户关机:中文:您好!您所拨打…

利用代码分别实现jdk动态代理和cglib动态代理_代理模式实现方式及优缺点对比...

作者:爱宝贝丶来源:https://my.oschina.net/zhangxufeng/blog/1633187代理模式最典型的应用就是AOP,本文结合主要讲解了代理模式的几种实现方式:静态代理和动态代理,这里动态代理又可以分为jdk代理和Cglib代理&#xf…

$ajax不能识别,JQuery/JS Ajax功能无法识别

我有一些jQuery的,这将始终抛出此错误控制台:Uncaught SyntaxError: Unexpected token .从符合$。阿贾克斯()在它的函数调用。$(#send).click(function(){$("#form").submit();});$("#form").submit({$.ajax({url: "../php/mai…

防抖 节流_防抖节流与前端性能优化

在我们日常的开发中经常会用到一些容易被反复触发的事件。比如:scroll、resize、鼠标事件(mousemove,mouseover等)、键盘事件(keyup、keydown)。频繁触发回调导致的大量计算会引发页面的抖动甚至卡顿。为了规避这种情况,我们需要一些手段来控制事件被触发…

电脑温度检测软件哪个好_重装电脑,用哪个软件重装系统比较好?

展开全部大家好我是大2113明、关于重装5261系统的问题没4102有“用哪个软件重装好“这个概念,重装系统的1653形式无非就是“正常安装”“GHOST快捷安装”“网络安装”这三种形式,所谓的用软件来安装应该是“网络在线安装”的形式,接下来我就说…

扫雷程序设计 python_端口扫描

通过该工具可以扫描常用的端口和指定的端口是否开放。 常用端口号: 代理服务器常用以下端口: (1). HTTP协议代理服务器常用端口号:80/8080/3128/8081/9080 (2). SOCKS代理协议服务器常用端口号&…

惠普10代的服务器有哪些型号,英特尔官方科普:秒懂十代酷睿型号怎么认!

今日,英特尔官方微博再次放出科普:十代酷睿处理器是如何命名的?英特尔介绍,以酷睿i7-1065G7为例,“i7”为产品型号,“1065”中的“10”代表十代酷睿,“65”为CPU代号,“G7”为显卡性…

python日期迭代_计算敏捷项目中迭代时间安排(Python3版)

节奏是敏捷开发的核心,保持合理固定的节奏,能有效的促使各个环节协调统一,高效运行。针对产品的不同周期,方案有所不同。迭代开发.jpg通常,我们需要在一个时间盒中去分配一个项目中不同阶段的时间,在项目管…