不使用“+”运算符的字符串连接

2025-02-27 09:07:00
admin
原创
78
摘要:问题描述:我在玩 Python,我意识到我们不需要使用“+”运算符来连接静态字符串。但是如果我将它分配给变量,它就会失败。例如:string1 = 'Hello' 'World' #1 works fine string2 = 'Hello' + 'World' #2 also works fine ...

问题描述:

我在玩 Python,我意识到我们不需要使用“+”运算符来连接静态字符串。但是如果我将它分配给变量,它就会失败。

例如:

string1 = 'Hello'   'World'  #1 works fine
string2 = 'Hello' + 'World'  #2 also works fine

string3 = 'Hello'
string4 = 'World'
string5 = string3   string4  #3 causes syntax error
string6 = string3 + string4  #4 works fine

现在我有两个问题:

  1. 为什么语句 3 不起作用而语句 1 起作用?

  2. 表述1和表述2在计算速度等方面是否存在技术上的差异?


解决方案 1:

来自Python 3.12 文档:

允许使用多个相邻的字符串文字(以空格分隔),可能使用不同的引用约定,并且它们的含义与它们连接在一起时相同。因此,"hello" 'world'相当于"helloworld"


语句 3 不起作用,因为:

运行时必须使用“+”运算符来连接字符串表达式。

请注意,文档中的子标题也是“字符串文字连接”。这仅适用于字符串文字,不适用于其他对象。


可能没什么区别。如果有区别,那可能也是微不足道的,没什么好担心的。


另外,要知道这样做可能会有危险:

>>> def foo(bar, baz=None):
...     return bar
... 
>>> foo("bob"
... "bill")
'bobbill'

这是一个完美的例子,说明错误不应该默默地传递。如果我想"bill"成为参数怎么办baz?我忘了一个逗号,但没有引发任何错误。相反,发生了连接。

解决方案 2:

这是隐式字符串文字连接。它只发生在字符串文字中,而不是变量或其他求值为字符串的表达式中。过去存在(微小的)性能差异,但如今,窥孔优化器应该使这些形式基本等同。

解决方案 3:

回答你的第二个问题:完全没有区别(至少在我使用的实现中没有区别)。拆解这两个语句,它们被呈现为LOAD_CONST STORE_FAST。它们是等效的。

解决方案 4:

您可以使用%s,因为这比使用 + 号更有效。

>>> string2 = "%s %s" %('Hello', 'World')
>>> string2
'Hello World'

(或者)


另一种方法是.format

>>> string2 = "{0} {1}".format("Hello", "World")
>>> string2
'Hello World'
>>> 

解决方案 5:

语句 3 不起作用,因为当您连接两个字符串表达式来创建一个新字符串时,您需要一个“+”运算符。

而在字符串 1、2 和 4 的情况下,由空格分隔的相邻文字使用不同的引用约定。因此,允许它们打印与它们的连接相同的内容。

此外,运行这两项操作不会有任何显著或明显的时间差异。

%%timeit -n 1
s1='ab'
s2='ba'
print(s1+s2)

o/p 最慢的运行时间比最快的运行时间长 17.08 倍。这可能意味着中间结果正在被缓存。每循环 57.8 µs ± 92.5 µs(7 次运行的平均值 ± 标准差,每次 1 次循环)

%%timeit -n 1
s3='ab' 'ba'
print(s3)

o/p 最慢的运行时间比最快的运行时间长 4.86 倍。这可能意味着中间结果正在被缓存。每循环 25.7 µs ± 21 µs(7 次运行的平均值 ± 标准差,每次 1 次循环)

解决方案 6:

为什么语句 3 不起作用而语句 1 起作用?

因为在第一个语句中,我们将某个常量赋值给一个变量。变量赋值非常简单,我们可以继续将多个常量赋值给一个变量,赋值仍然会成功。术语"hello""world"是两个相同类型的常量。所以,这个语句有效。

如果我们执行以下操作,我们将得到SyntaxError

string1 = "Hello" 1

原因是我们在单个变量赋值中提供了多个常量。这让 Python 感到困惑,并抛出了错误。

语句 3 是关于根据两个变量分配一个变量。这将产生结果SyntaxError,因为 Python 在将其分配给变量之前不知道它可以用 2 个变量做什么。

表述1和表述2在计算速度等方面是否存在技术上的差异?

是的。唯一的技术差异是可读性,而不是其他任何东西。可读性在 Python 中最为重要。对于未经训练的人来说,"hello" "world"可能看起来像是编译器会在字符串中添加空格。但事实并非如此。

然而,

"hello" + "world"

是明确且正常的。几乎总是,明确比隐含更好。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2974  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1836  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。然而,在实际运行中,资源冲突是经常会遇到的难题。资源冲突可能导致项目进度延迟、成本增加以及产品质量下降等一系列问题,严重影响企业的效益与竞争力。因此,如何有效应对PLM系统中的资源冲突,成为众多企业关注的焦点。接下来,我们将详细探讨5...
plm项目管理系统   47  
  敏捷项目管理与产品生命周期管理(PLM)的融合,正成为企业在复杂多变的市场环境中提升研发效率、增强竞争力的关键举措。随着技术的飞速发展和市场需求的快速更迭,传统的研发流程面临着诸多挑战,而将敏捷项目管理理念融入PLM,有望在2025年实现研发流程的深度优化,为企业创造更大的价值。理解敏捷项目管理与PLM的核心概念敏捷项...
plm项目   47  
  模块化设计在现代产品开发中扮演着至关重要的角色,它能够提升产品开发效率、降低成本、增强产品的可维护性与可扩展性。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键平台,对模块化设计有着强大的支持能力。随着技术的不断发展,到 2025 年,PLM 系统在支持模块化设计方面将有一系列令人瞩目的技术实践。数字化...
plm软件   48  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用