如何将变量的值放入字符串中(将其插入到字符串中)?

2024-11-18 08:41:00
admin
原创
14
摘要:问题描述:我想将 放入int中string。这是我目前正在做的事情:num = 40 plot.savefig('hanning40.pdf') #problem line 我必须针对几个不同的数字运行该程序,所以我想做一个循环。但是像这样插入变量不起作用:plot.savefig('hanning', nu...

问题描述:

我想将 放入intstring。这是我目前正在做的事情:

num = 40
plot.savefig('hanning40.pdf') #problem line

我必须针对几个不同的数字运行该程序,所以我想做一个循环。但是像这样插入变量不起作用:

plot.savefig('hanning', num, '.pdf')

如何将变量插入 Python 字符串?


参见

如果您尝试创建文件路径,请参阅如何根据部分内容(例如文件夹路径、名称和扩展名)创建文件的完整路径?以了解更多技术。通常最好使用特定于创建路径的代码。

如果您尝试构建带有变量数据的 URL请不要使用普通的字符串格式,因为它容易出错并且比必要的更困难。可以使用专门的工具。请参阅在 Python 中向给定 URL 添加参数。

如果您尝试构建 SQL 查询请不要使用普通的字符串格式,因为这会带来重大的安全风险。这就是“SQL 注入”的根源,它每年给实际公司造成巨额损失。例如,请参阅如何在 Python 中的 SQL 语句中使用变量?以了解正确的技术。

如果您只想print(输出)字符串,您可以先以这种方式准备它,或者如果您不需要该字符串用于其他任何用途,则可以使用对 的单个调用分别打印输出的每个部分print。有关这两种方法的详细信息,请参阅如何在同一行上一次打印多个内容(固定文本和/或变量值)?

请参阅如何连接 str 和 int 对象?以了解因尝试使用+连接“字符串”而导致的错误,但其中一个不是字符串。


解决方案 1:

使用f 字符串:

plot.savefig(f'hanning{num}.pdf')

这是在 3.6 版中添加的,是新的首选方式。


使用str.format()

plot.savefig('hanning{0}.pdf'.format(num))

字符串连接:

plot.savefig('hanning' + str(num) + '.pdf')

转换说明符:

plot.savefig('hanning%s.pdf' % num)

使用局部变量名(巧妙的技巧):

plot.savefig('hanning%(num)s.pdf' % locals())

使用string.Template

plot.savefig(string.Template('hanning${num}.pdf').substitute(locals()))

参见:

  • 更精美的输出格式 - Python 教程

  • Python 3 的 f 字符串:改进的字符串格式语法(指南) - RealPython

解决方案 2:

随着Python 3.6 中格式化字符串文字(简称“f 字符串”)的引入,现在可以用更简洁的语法编写这样的代码:

>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'

按照问题中给出的例子,它看起来应该是这样的

plot.savefig(f'hanning{num}.pdf')

解决方案 3:

plot.savefig('hanning(%d).pdf' % num)

当运算%符位于字符串后面时,它允许您通过格式代码(在本例中为)将值插入该字符串%d。有关更多详细信息,请参阅 Python 文档:

printf-style 字符串格式

解决方案 4:

您可以将其用作+普通字符串连接函数以及str()

"hello " + str(10) + " world" == "hello 10 world"

解决方案 5:

通常,你可以使用以下方法创建字符串:

stringExample = "someString " + str(someNumber)
print(stringExample)
plot.savefig(stringExample)

解决方案 6:

如果你想将多个值放入字符串中,你可以使用format

nums = [1,2,3]
plot.savefig('hanning{0}{1}{2}.pdf'.format(*nums))

将生成字符串hanning123.pdf。可以使用任何数组完成此操作。

解决方案 7:

特殊情况

根据变量数据与字符串一起使用的原因,通用方法可能不合适。

如果需要准备 SQL 查询

不要使用任何常用的技术来组装字符串。相反,请使用 SQL 库的功能进行参数化查询。

查询是代码,因此不应将其视为普通文本。使用该库将确保正确转义任何插入的文本。如果查询的任何部分可能以任何方式来自程序外部,那么恶意用户就有机会执行SQL 注入。这被广泛认为是重要的计算机安全问题之一,每年给实际公司造成巨额损失,并给无数客户带来问题。即使您认为您知道数据是“安全的”,使用任何其他方法也没有真正的好处。

语法取决于您使用的库,并且超出了本答案的范围。

如果需要准备 URL 查询字符串

请参阅在 Python 中向给定 URL 添加参数。不要自己动手;没有实际理由让你的生活变得更加困难。

写入文件

虽然可以提前准备一个字符串,但使用单独的.write调用写入每段数据可能更简单,内存效率更高。当然,非字符串在写入之前仍需要转换为字符串,这可能会使代码复杂化。这里没有一个万能的答案,但选择错误通常不会有太大影响。

如果你只是打电话print

内置print函数接受可变数量的参数,并且可以接受任何对象并使用 对其进行字符串化str。在尝试字符串格式化之前,请考虑是否只需传递多个参数即可实现您想要的效果。(您还可以使用sep关键字参数来控制参数之间的间距。)

# display a filename, as an example
print('hanning', num, '.pdf', sep='')

当然,程序组装字符串可能还有其他用途;因此,在适当的地方一定要这样做。

需要注意的是,这print只是一种特殊情况。只有明确编写的函数才能以这种方式工作。对于普通函数和方法,例如input,或者savefigMatplotlib 绘图的方法,我们需要自己准备一个字符串。

级联

Python 支持+在两个字符串之间使用,但不支持在字符串和其他类型之间使用。为了解决这个问题,我们需要明确地将其他值转换为字符串:'hanning' + str(num) + '.pdf'

基于模板的方法

解决该问题的大多数方法都涉及某种“模板”字符串,其中包含显示应在何处添加信息的“占位符”,然后使用某些函数或方法添加缺失的信息。

f 字符串

这是尽可能推荐的方法。它看起来像f'hanning{num}.pdf'。要插入的变量名称直接出现在字符串中。重要的是要注意,实际上没有“f-string”这样的东西;它不是一种单独的类型。相反,Python 会提前翻译代码:

>>> def example(num):
...     return f'hanning{num}.pdf'
... 
>>> import dis
>>> dis.dis(example)
  2           0 LOAD_CONST               1 ('hanning')
              2 LOAD_FAST                0 (num)
              4 FORMAT_VALUE             0
              6 LOAD_CONST               2 ('.pdf')
              8 BUILD_STRING             3
             10 RETURN_VALUE

因为它是一种特殊的语法,所以它可以访问其他方法中未使用的操作码。

str.format

当无法使用 f 字符串时,建议使用这种方法 - 主要是因为模板字符串需要提前准备并在稍后填充。它看起来像'hanning{}.pdf'.format(num), 或'hanning{num}.pdf'.format(num=num)'。这里,format是内置于字符串的方法,可以通过位置或关键字接受参数。

特别是对于str.format,了解内置的localsglobalsvars函数返回将变量名称映射到这些变量的内容的字典很有用。因此,'{a}{b}{c}'.format(a=a, b=b, c=c)我们可以使用 之类的东西来解包字典'{a}{b}{c}'.format(**locals()),而不是 之类的东西。locals()

str.format_map

这是 的一个罕见变体.format。它看起来像'hanning{num}.pdf'.format_map({'num': num})。它不接受关键字参数,而是接受单个参数,即映射。

这听起来可能没什么用——毕竟,'hanning{num}.pdf'.format_map(my_dict)我们可以轻松地写成 而不是'hanning{num}.pdf'.format(**my_dict)。但是,这对于动态确定值的映射(而不是普通的dict)很有用。在这些情况下,使用 解包**可能不起作用,因为键集可能无法提前确定;并且尝试根据模板解包键很麻烦(想象一下:'hanning{num}.pdf'.format(num=my_mapping[num]),每个占位符都有一个单独的参数)。

string.Formatter

标准库模块string包含一个很少使用的Formatter类。使用它看起来像string.Formatter().format('hanning{num}.pdf', num=num)。模板字符串再次使用相同的语法。这显然比仅仅调用.format字符串更笨重;动机是允许用户子类化Formatter以定义模板字符串的不同语法。

所有上述方法都使用通用的“格式化语言”(尽管string.Formatter允许更改它);还有许多其他东西可以放在里面{}。解释它的工作原理超出了本答案的范围;请查阅文档。请记住,文字{}字符需要通过加倍来转义。该语法大概是受 C# 启发的。

%操作员

这是解决问题的传统方法,灵感来自 C 和 C++。长期以来,这种方法已被禁止,但仍受支持。'hanning%s.pdf' % num对于简单的情况,它看起来像。正如您所期望的那样,'%'模板中的文字符号需要加倍才能转义它们。

它存在一些问题:

  • 转换说明符( 后面的字母)似乎%应该与要插入的内容的类型相匹配,但事实并非如此。相反,值被转换为指定的类型,然后从那里转换为字符串。这通常不是必需的;直接转换为字符串在大多数情况下都有效,而先转换为其他类型在大多数情况下没有帮助。所以's'几乎总是使用(除非您想要repr值的 ,使用'r')。尽管如此,转换说明符是语法的强制性部分。

  • 元组是经过特殊处理的:在右侧传递元组是提供多个参数的方式。这是一个丑陋的特殊情况,但这是必要的,因为我们没有使用函数调用语法。因此,如果您真的想将元组格式化为单个占位符,则必须将其包装在 1 元组中。

  • 其他序列类型没有得到特殊处理,并且不同的行为可能会成为一个陷阱。

string.Template

标准库模块string包含一个很少使用的Template类。实例提供substitutesafe_substitute方法,其工作方式与内置类似.formatsafe_substitute当参数不匹配时,将保留占位符不变,而不是引发异常)。这也应被视为解决问题的传统方法。

它看起来像string.Template('hanning$num.pdf').substitute(num=num),并且受到传统 Perl 语法的启发。它显然比该.format方法更笨重,因为必须先使用单独的类才能使用该方法。括号 ( {}) 可以随意用于变量名称,以避免歧义。与其他方法类似,'$'模板中的文字需要加倍才能转义。

解决方案 8:

我需要这个的扩展版本:不是在字符串中嵌入单个数字,而是需要生成一系列文件名,形式为“file1.pdf”,“file2.pdf”等。它的工作原理如下:

['file' + str(i) + '.pdf' for i in range(1,4)]

解决方案 9:

您可以创建字典并替换字符串中的变量。

var = {"name": "Abdul Jalil", "age": 22}
temp_string = "My name is %(name)s. I am %(age)s years old." % var
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用