如何将变量的值放入字符串中(将其插入到字符串中)?
- 2024-11-18 08:41:00
- admin 原创
- 13
问题描述:
我想将 放入int
中string
。这是我目前正在做的事情:
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
,或者savefig
Matplotlib 绘图的方法,我们需要自己准备一个字符串。
级联
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
,了解内置的locals
、globals
和vars
函数返回将变量名称映射到这些变量的内容的字典很有用。因此,'{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
类。实例提供substitute
和safe_substitute
方法,其工作方式与内置类似.format
(safe_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
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件