Python 中别再用 ‘+‘ 拼接字符串了!

news2024/11/17 7:50:25

当我开始学习 Python 时,使用加号+来连接字符串非常直观和容易,就像许多其他编程语言(比如Java)一样。

然而,很快我意识到许多开发者似乎更喜欢使用.join()方法而不是+。

在本文中,我将介绍这两种方法之间的区别,以及为什么你不应该使用+。

开篇

作为一个初学者,或者刚从其他使用加号+连接字符串的语言转换过来的人,很容易写出这样的代码:

图片

随着你对 Python 的使用越来越多,你可能会意识到其他人更喜欢使用join()方法,就像这样:

图片

老实说,当我第一次看到上面的方法时,我觉得它不直观,看起来有点丑陋。

连接多个字符串

尽管如此,有一次我需要连接列表中的多个字符串。

最初,我是这样做的:

图片

在这个例子中,我不得不逐个字符串地编写一个循环来连接它们。

此外,结果字符串需要修剪我在开头添加的空格,因为所有的字符串都需要在前面添加一个空格,但第一个字符串不需要。

你可能有其他的解决方案,比如在for循环中添加一个索引,使得索引等于0的字符串不需要添加这个空格。无论如何,你仍然需要这个for循环,并且需要做一些处理来去掉这些空格。

之后,我想起了之前见过的.join()方法,也许这就是我需要使用它的时候了!

图片

多么简单啊!一行代码就完成了所有的工作。由于.join()方法是由一个字符串对象调用的,所以字符串对象将被用来连接列表中的每个字符串,因此你不需要担心开头的空格。

你真的认为这是我们需要使用join()方法而不是+的唯一原因吗?NO

join()方法背后的逻辑

现在,让我们就它们的性能进行比较。我们可以使用 Jupyter Notebook 的魔术方法%timeit来评估它们。

图片

以上显示的性能是基于10万次试验,因此结果非常可信和明显。使用join()方法比使用+来连接列表中的字符串快4倍。

为什么会这样呢?

这是我画的一个概念图,用来演示使用+连接字符串的方法。

图片

这说明了for循环和+运算符做了什么:

  1. 每次循环,从列表中找到一个字符串。

  2. Python执行器解释表达式result += ' ' + s,并为空格' '申请内存地址。

  3. 然后,执行器意识到空格需要与一个字符串连接,所以它会为字符串s申请内存地址,对于第一个循环来说,s是“Life”。

  4. 对于每次循环,执行器都需要申请两次内存地址,一次是为了空格,另一次是为了字符串。

  5. 总共有12次内存分配。

然而,join()方法发生了什么呢?

图片

执行器会统计列表中有多少个字符串,这里有6个。

这意味着用于连接列表中的字符串的字符串将需要重复5次(6-1=5)。

它知道总共需要11个内存空间,所以所有这些都将一次性申请并提前分配。

将字符串按顺序放置,返回结果。

因此,显而易见的主要差异在于内存分配的次数,这是性能改进的主要原因。

想象一下,使用join()方法将6个字符串连接在一起已经快了4倍。如果我们要连接很多很多字符串呢?这将会产生更大的差异!

总结

在这篇简短的文章中,我比较了在 Python 中使用+运算符和join()方法连接字符串时的差异。显然,由于性能原因,更倾向于使用join()方法。

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

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

相关文章

Charles抓包App_https_夜神模拟器

Openssl安装 下载安装 下载地址: http://slproweb.com/products/Win32OpenSSL.html 我已经下载好了64位的,也放出来: 链接:https://pan.baidu.com/s/1Nkur475YK48_Ayq_vEm99w?pwdf4d7 提取码:f4d7 --来自百度网…

Golang实现文件复制

方法:三种 package zdpgo_fileimport ("errors""io""os" )// CopyFile 使用io.Copy进行文件的复制,同时也会复制文件的所有权限 // param src 复制文件 // param des 目标文件 // return error 错误信息 func CopyFile(s…

MacOS安装Docker-Compose

方法一 按照百度的方法进行安装,我大致复制一下百度的方法 1.确保您已经安装了Docker Desktop。 2.下载Docker Compose二进制文件。 3.将二进制文件移动到/usr/local/bin目录。 4.更改二进制文件的权限,使其可执行。 以下是具体的命令:…

LiveGBS流媒体平台GB/T28181用户手册-用户管理:添加用户、编辑、关联通道、搜索、重置密码

LiveGBS流媒体平台GB/T28181用户手册-用户管理:添加用户、编辑、关联通道、搜索、重置密码 1、用户管理1.1、添加用户1.2、编辑用户1.3、关联通道1.4、重置密码1.5、搜索1.6、删除 2、搭建GB28181视频直播平台 1、用户管理 1.1、添加用户 添加用户,可以配置登陆用户…

git 无法下载UE5源码问题

最近做镜像,突然遇到这个问题。 无法下载,应该如何解决呢? 1.首先 跳过htts ssl验证 2,设置更大的缓冲区 结果还是这个问题:

鹏特资本进入中国市场具有以下一些优势

1. 带来资金:补充国内资金缺口,为企业发展和项目建设提供重要的资金支持。 2. 先进技术和管理经验:有助于推动技术创新和管理水平提升,促进产业升级和优化。 3. 促进竞争:激发国内市场活力,促使本土企业不…

【调和级数】100321. 优质数对的总数 II

本文涉及知识点 调和级数 质数、最大公约数、菲蜀定理 LeetCode100321. 优质数对的总数 II 给你两个整数数组 nums1 和 nums2,长度分别为 n 和 m。同时给你一个正整数 k。 如果 nums1[i] 可以被 nums2[j] * k 整除,则称数对 (i, j) 为 优质数对&#…

网络模型-路由策略

一、路由策略 路由策略(Routing Policy)作用于路由,主要实现了路由过滤和路由属性设置等功能,它通过改变路由属性(包括可达性)来改变网络流量所经过的路径。目的:设备在发布、接收和引入路由信息时,根据实际组网需要实施一些策略&#xff0c…

什么是聚簇索引和非聚簇索引,如何理解回表、索引下推

聚簇索引(Clustered Index)和非聚簇索引(Non-clustered Index)是数据库中的两种索引类型,它们在组织和存储数据时有不同的方式。 聚簇索引 聚簇索引简单理解就是将数据与索引放在一起,找到索引即找到了数…

当AWR1843发送完设置的固定帧后,如何使其再发送第一次的帧?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

Qt 界面上字体自适应控件大小 - 随控件缩放

Qt 界面上字体自适应控件大小 - 随控件缩放 引言一、设计思路二、进阶版大致思路三、参考链接 引言 Qt控件自适应字体大小可以用adjustSize()函数,但字体自适应控件大小并没有现成的函数可调. - 本文实现了按钮上的字体随按钮大小变化而变化 (如上图所示) - 其他控件…

[CISCN2024]-PWN:gostack解析(go语言程序,syscall)

查看保护 ida比较复杂,建议动调配合静态分析程序运行 这里函数返回不用leave和ret,而是利用add rsp和ret,所以要动调查看到底要覆盖哪里。 完整exp: from pwn import* pprocess(./gostack) syscall0x4616c9 pop_rax0x40f984 po…

电子电器架构 - AUTOSAR ON THE AIR

电子电器架构 - AUTOSAR ON THE AIR 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

C# 控制台应用模板可生成顶级语句

C# 控制台应用模板可生成顶级语句 项目2024/01/0810 个参与者 反馈 本文内容 使用新的程序样式隐式 using 指令全局 using 指令使用旧程序样式 从 .NET 6 开始,新 C# 控制台应用的项目模板在 Program.cs 文件中生成以下代码: C#复制 // See https…

C语言基础(六)

C语言基础 指针与一维数组总结 * p、* (p)、(\*p)、* p、*(p)、*p区别和用法运算优先级p与p区别*p与 *(p)与(*p)*p与 *(p)与 *p 指针常量与一维数组的关系指针变量与一维数组的关系数…

基于FIDO2和USBKEY硬件的SSH认证

在 8.2(最新为 8.3)版本中,OpenSSH 提供了对 FIDO 和 UAF 的支持。从此用户就可以用硬件 USBKEY 证书进行 SSH 原生认证。这样可以实现简捷、有效和安全的 SSH 认证。本文我们就就少一下 FIDO2 以及 OpenSSH 对其的支持,并尝试一下…

十大排序 —— 冒泡排序

十大排序 —— 冒泡排序 什么是冒泡排序基本步骤特点 优化冒泡的各项性能时间复杂度空间复杂度稳定性总结 我们今天来讲一个大家熟悉的老朋友——冒泡排序: 什么是冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法,因其工作…

【大模型部署】在C# Winform中使用文生图Stable Diffusion XL 模型

【大模型部署】在C# Winform中使用文生图Stable Diffusion XL 模型 前言 整了一个在C# Winform中调用文生图Stable Diffusion XL的小程序,基于百度智能云千帆平台 步骤 如何注册百度智能云和创建应用,获取API 密钥等和在之前的博客中基本相同&#…

单日收益1000+看了就会的项目,最新灵异短视频项目,简单好上手可放大操作

各位好友,佳哥在此与大伙儿聊聊一项神秘莫测的短视频项目。你或许会想,“又是一个视频创作项目?” 但别急,这个项目与众不同,日入千元不再是梦,而且它的易用性让人惊喜,无论你是初学者还是资深玩…

面向对象------多态

1.多态的定义 通俗来说,当同一种行为或者事情发生在不同的对象上,这些行为或者事情最终得到的结果不同。 注意:多态要发生在继承的基础上。 例如:彩色打印机和黑白打印机。 彩色打印机和黑白打印机是不同的对象,但…