为什么 Python 的 f-string 可以连接字符串与数字?

简介: 为什么 Python 的 f-string 可以连接字符串与数字?

毫无疑问,Python 是一门强类型语言。强类型语言。强类型语言!

这就意味着,不同类型的对象通常需要先做显式地类型转化, 然后才能进行某些操作。

下面以字符串和数字为例,看看强行操作会产生什么结果:

>>> "Python" + 666
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str
它报类型错误了(TypeError),说字符串只能连接(concatenate)字符串,不能连接 int 类型。 这正是强类型语言的基本约束。

它报类型错误了(TypeError),说字符串只能连接(concatenate)字符串,不能连接 int 类型。 这正是强类型语言的基本约束。


但是,如果我们先把数字“转化”成字符串类型,再执行“+”操作,就不会报错了:

>>> "Python" + str(666)
'Python666'
上面的这个例子,对读者们来说,应该并不难理解。
由此,我们要引出一个问题:如何在不作显式类型转化的情况下,进行字符串与数字类型的拼接呢?

它报类型错误了(TypeError),说字符串只能连接(concatenate)字符串,不能连接 int 类型。 这正是强类型语言的基本约束。


但是,如果我们先把数字“转化”成字符串类型,再执行“+”操作,就不会报错了:

>>> "Python" + str(666)
'Python666'
上面的这个例子,对读者们来说,应该并不难理解。
由此,我们要引出一个问题:如何在不作显式类型转化的情况下,进行字符串与数字类型的拼接呢?

上面的这个例子,对读者们来说,应该并不难理解。


由此,我们要引出一个问题:如何在不作显式类型转化的情况下,进行字符串与数字类型的拼接呢?

几种字符串拼接方式:


1、格式化类:%、format()、template


2、拼接类:+、()、join()


3、插值类:f-string


为了节省篇幅,此处直接把可以顺利拼接的 4 种写法罗列如下:

>>> "%s %d" % ("Python", 666)
'Python 666'
>>> from string import Template
>>> s = Template('${s1}${s2}')
>>> s.safe_substitute(s1='Python',s2=666)
'Python666'
>>> "Python{}".format(666)
'Python666'
>>> num = 666
>>> f"Python{num}"
'Python666'

第一种写法(即 % 格式化)来自古老的 C 语言,其中的“%d”是一个占位符,表示它将要接收一个整数,并格式化成字符串。


第二和第三种写法,它们是第一种写法的升级版,不同的是,它们的占位符是通用型的,不必指定“%s”、“%d”等等明确的类型。这两种写法中,数字类型的参数被传给特定的格式化方法(即 safe_substitute 与 format),在这些方法的内部,它们会作类型转化处理。


可以说,上述三种写法都不难理解,它们的意图都有迹可循。


但是,现在再看看最后一种写法,也就是 f-string 写法,似乎就不是那么明显了。


首先,在字符串内部,它并没有像“%格式化”那样指定占位符的类型;其次,所要拼接的数字并没有作为任何函数的参数来传递。


也就是说,在明面上根本看不出任何要作类型转化的意图。但是,由于我们已知 Python 是强类型语言,已知数字类型绝对不可能直接拼接到字符串里,因此,只能说明 f-string 语法在底层作了某种类型转化的操作!


那么,我们就可以再提出一个新的问题:f-string 语法在处理字符串与数字时,是如何实现数字的类型转化的呢?


也许有的读者会猜想它是调用了内置的 str() 或 repr()(或它们对应的魔术方法\\str\_\_() 与 \\repr\\()),从而实现类型转化,但是,答案并没有如此简单!


f-string 语法是在 Python 3.6 版本引入的。为了省事,我们直接找到 PEP-498 文档,在里面查阅看是否有关于实现原理的线索。



14.jpeg

PEP 里提到,f-string 的语法格式是这样的:


其中,花括号里的内容就是要作格式化的内容,除去可选的“optional”部分后,“expression”部分就是真正要处理的内容。对应前文的例子,数字 666 就是一个 expression。


expression 会按 \\format\\ 协议进行格式化,但是并不会直接调用 \\format\\() 这个方法。


文档上指出,**实际的执行过程等效于type(value).__format__(value, format_spec) 或者 format(value, format_spec) 。**


事实上,字符串对象的 foramt() 方法跟 Python 内置的 foramt() 函数,它们都会调用\format\\() 魔术方法,所以,f-string 其实是前文中 format() 格式化写法的升级版。


在默认情况下,format_spec 是一个空字符串,而format(value, "") 的效果等同于str(value) ,因此,在不指定其它 format_spec 的情况下,可以简单地认为 f-string 就是调用了 str() 来作的类型转化……


此,我们看到了 f-string 的实现原理,明白了它在拼接字符串与数字时,效果等效于前文的 format() 格式化方法,也等效于使用 str() 进行类型转化。


目录
打赏
0
0
0
0
23
分享
相关文章
Python中r前缀:原始字符串的魔法解析
本文深入解析Python中字符串的r前缀(原始字符串)的设计原理与应用场景。首先分析传统字符串转义机制的局限性,如“反斜杠地狱”问题;接着阐述原始字符串的工作机制,包括语法定义、与三引号结合的用法及特殊场景处理。文章重点探讨其在正则表达式、文件路径和多语言文本处理中的核心应用,并分享动态构建、混合模式编程等进阶技巧。同时纠正常见误区,展望未来改进方向,帮助开发者更好地理解和使用这一特性,提升代码可读性和维护性。
51 0
Python正则表达式:用"模式密码"解锁复杂字符串
正则表达式是处理字符串的强大工具,本文以Python的`re`模块为核心,详细解析其原理与应用。从基础语法如字符类、量词到进阶技巧如贪婪匹配与预定义字符集,结合日志分析、数据清洗及网络爬虫等实战场景,展示正则表达式的强大功能。同时探讨性能优化策略(如预编译)和常见错误解决方案,帮助开发者高效掌握这一“瑞士军刀”。最后提醒,合理使用正则表达式,避免过度复杂化,追求简洁优雅的代码风格。
58 0
|
12天前
|
解读 Python 3.14:模板字符串、惰性类型、Zstd压缩等7大核心功能升级
Python 3.14 引入了七大核心技术特性,大幅提升开发效率与应用安全性。其中包括:t-strings(PEP 750)提供更安全灵活的字符串处理;类型注解惰性求值(PEP 649)优化启动性能;外部调试器API标准化(PEP 768)增强调试体验;原生支持Zstandard压缩算法(PEP 784)提高效率;REPL交互环境升级更友好;UUID模块扩展支持新标准并优化性能;finally块语义强化(PEP 765)确保资源清理可靠性。这些改进使Python在后端开发、数据科学等领域更具竞争力。
44 5
解读 Python 3.14:模板字符串、惰性类型、Zstd压缩等7大核心功能升级
Python语言中字符串操作方法的全面归纳
以上就是Python中一些重要的字符串操作方法,掌握了这些,对于操作字符串,你也就够用了。在Python众多的特性中,字符串操作无疑是最有趣的部分之一。希望你也觉得如此。
56 27
鸿蒙开发:ArkTs字符串string
字符串类型是开发中非常重要的一个数据类型,除了上述的方法概述之外,还有String对象,正则等其他的用处,我们放到以后得篇章中讲述。
140 19
python字符串类型及操作
本文主要讲解字符串类型的表示、操作符、处理函数、处理方法及格式化。内容涵盖字符串的定义、表示方法(单双引号、三引号)、索引与切片、特殊字符转义、常见操作符(如+、*、in等)、处理函数(如len()、str()、chr()等)、处理方法(如.lower()、.split()等)以及格式化方式(如.format())。通过实例代码详细介绍了字符串的各种用法和技巧,帮助读者全面掌握字符串操作。
123 2
python字符串类型及操作
课时16:String字符串
课时16介绍了Java中的String字符串。在Java中,字符串使用`String`类表示,并用双引号定义。例如:`String str = &quot;Hello world!&quot;;`。字符串支持使用“+”进行连接操作,如`str += &quot;world&quot;;`。需要注意的是,当“+”用于字符串与其他数据类型时,其他类型会先转换为字符串再进行连接。此外,字符串中可以使用转义字符(如`\t`、`\n`)进行特殊字符的处理。掌握这些基本概念对Java编程至关重要。
|
7月前
|
在 Python 中,如何将日期时间类型转换为字符串?
在 Python 中,如何将日期时间类型转换为字符串?
284 64
|
7月前
|
在 Python 中,如何将字符串中的日期格式转换为日期时间类型?
在 Python 中,如何将字符串中的日期格式转换为日期时间类型?
215 62

推荐镜像

更多