首页 > 解决方案 > 我知道 f-strings,但是什么是 r-strings?还有其他人吗?

问题描述

几周前,我在数据科学加速课程中第一次开始学习 python,我们很早就被介绍给 f-strings。

简单的代码:

name = 'Tim'
print(f'There are some who call me {name}...')

输出字符串“有些人叫我蒂姆……”

出于好奇,通过浏览各种包,我发现了类似这样的页面,其中详细介绍了您可以在 matplotlib 中调用的函数,以在生成的图像中呈现类似于 $\LaTeX$ 的表达式。在示例代码中,他们使用类似于 f 字符串但使用 r 而不是 f 的东西。

import matplotlib.pyplot as plt
plt.title(r'$\alpha > \beta$')
plt.show()

结果(否则为空)图表的标题使用文本,其格式类似于人们期望使用带有希腊字符 alpha 和希腊字符 beta 的 MathJax 或 $\LaTeX$ 的方式。


我的问题如下:

r-string 到底是什么?它与 f-string 相比如何?r-strings 是专门用于 matplotlib 的 mathtext 和 usetex 的吗?

除了 f-strings 和 r-strings,还有其他值得注意的类似字符串变体或替代品我应该熟悉或了解吗?

标签: pythonstringpython-3.x

解决方案


  1. r 字符串是原始字符串。
    • 它忽略转义字符。例如,"\n"是一个包含换行符的字符串,并且r"\n"是一个包含反斜杠和字母的字符串n
    • 如果您想将其与 f-string 进行比较,您可以将 f-strings 视为“包含电池”。它们在转义字符和执行几乎任意表达式的能力方面具有很大的灵活性。另一方面,r-string 被精简且极简,精确地包含引号之间的字符。
    • 至于实际使用这些东西,通常你会使用一个 r-string 如果你将字符串传递给使用一堆奇怪字符或自己转义的其他东西,这样你就不必考虑太多了你真正需要多少个反斜杠才能让一切正常工作。在您的示例中,他们至少需要 r-strings 才能使该\a位正常工作而无需双重转义。请注意,'$\\alpha > \\beta$'与 相同r'$\alpha > \beta$'
  2. 由于您使用的是 f 字符串,我假设您至少有 Python 3.6。旧版本并不支持所有这些选项,但以下任何前缀在 Python 3.6+ 中以大写和小写的任意组合都有效:r, u, f, rf, fr, b, rb, br
    • b 字符串是二进制文字。在 Python 2 中,它们什么都不做,只是为了源代码与 Python 3 兼容而存在。在 Python 3 中,它们允许您创建一个bytes对象。字符串可以被认为是底层字节的视图,通常受限于允许的组合。类型的区别有助于防止错误地将文本技术盲目地应用于原始数据。'A'==b'A'在 Python 3中,请注意False. 这些不是一回事。
    • u 字符串是unicode 文字。在 Python 3 中,字符串默认为 unicode,但u允许使用前缀以向后兼容 Python 2。在 Python 2 中,字符串默认为 ASCII,并且u前缀允许您在字符串中包含非 ASCII 字符。例如,请注意法语短语中的重音字符u"Fichier non trouvé"
    • 在我编写的那种代码中,我很少需要超出r, u, f, b. 甚至b有点外面。其他人每天(大概)处理这些前缀。它们不一定是您需要熟悉的任何东西,但是知道它们的存在并能够找到它们的文档可能是一项很好的技能。

只是为了让它出现在答案中而不是埋在评论中,@JamesGibson 链接了语言规范,这就是我从中提取前缀列表的地方。凭借您的数学背景,正式的语言规范可能会特别有趣——这取决于您对代数和数理逻辑的喜爱程度。

即使它只是用于像 Forth 这样语义上微不足道的语言,我认为许多程序员都会喜欢编写一个简短的解释器,并获得对他们选择的语言如何工作的宝贵见解。


推荐阅读