• 售前

  • 售后

热门帖子
入门百科

Python 的 f-string 可以毗连字符串与数字的缘故原由解析

[复制链接]
249764701 显示全部楼层 发表于 2021-10-25 19:46:23 |阅读模式 打印 上一主题 下一主题
本文出自“Python为什么”系列,归档在 Github 上:https://github.com/chinesehuazhou/python-whydo
毫无疑问,Python 是一门强范例语言。强范例语言。强范例语言!(关于强弱范例话题,保举阅读这篇 技能科普文)
这就意味着,差别范例的对象通常必要先做显式地范例转化, 然后才能举行某些操纵。
下面以字符串和数字为例,看看强行操纵会产生什么结果:
  1. >>> "Python猫" + 666
  2. Traceback (most recent call last):
  3. File "<stdin>", line 1, in <module>
  4. TypeError: can only concatenate str (not "int") to str
复制代码
它报范例错误了(TypeError),说字符串只能毗连(concatenate)字符串,不能毗连 int 范例。 这正是强范例语言的根本束缚。
但是,如果我们先把数字“转化”成字符串范例,再执行“+”操纵,就不会报错了:
  1. >>> "Python猫" + str(666)
  2. 'Python猫666'
复制代码
上面的这个例子,对读者们来说,应该并不难明白。
由此,我们要引出一个问题:如安在不作显式范例转化的情况下,举行字符串与数字范例的拼接呢?
在《详解Python拼接字符串的七种方式》这篇文章中,它梳理了七种拼接字符串的写法,我们可以逐个来试验一下。
几种字符串拼接方式:
1、格式化类:%、format()、template
2、拼接类:+、()、join()
3、插值类:f-string
为了节流篇幅,此处直接把可以顺遂拼接的 4 种写法罗列如下:
  1. >>> "%s %d" % ("Python猫", 666)
  2. 'Python猫 666'
  3. >>> from string import Template
  4. >>> s = Template('${s1}${s2}')
  5. >>> s.safe_substitute(s1='Python猫',s2=666)
  6. 'Python猫666'
  7. >>> "Python猫{}".format(666)
  8. 'Python猫666'
  9. >>> num = 666
  10. >>> f"Python猫{num}"
  11. 'Python猫666'
复制代码
第一种写法(即 % 格式化)来自古老的 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 文档,在内里查阅看是否有关于实现原理的线索。

文档所在:https://www.python.org/dev/peps/pep-0498
PEP 里提到,f-string 的语法格式是如许的:
  1. f'<text> { <expression> <optional !s, !r, or !a> <optional : format specifier> } <text> ...'
复制代码
其中,花括号里的内容就是要作格式化的内容,撤除可选的“optional”部分后,“expression”部分就是真正要处理惩罚的内容。对应前文的例子,数字 666 就是一个 expression。
expression 会按 __format__ 协议举行格式化,但是并不会直接调用 __format__() 这个方法。
文档上指出,现实的执行过程等效于
  1. type(value).__format__(value, format_spec)
复制代码
大概
  1. format(value, format_spec)
复制代码

究竟上,字符串对象的 foramt() 方法跟 Python 内置的 foramt() 函数,它们都会调用__format__() 魔术方法,以是,f-string 其实是前文中 format() 格式化写法的升级版。
在默认情况下,
  1. format_spec
复制代码
是一个空字符串,而
  1. format(value, "")
复制代码
的结果等同于
  1. str(value)
复制代码
,因此,在不指定别的 format_spec 的情况下,可以简单地认为 f-string 就是调用了 str() 来作的范例转化……
至此,我们看到了 f-string 的实现原理,明确了它在拼接字符串与数字时,结果等效于前文的 format() 格式化方法,也等效于使用 str() 举行范例转化。
写在最后:本文属于“Python为什么”系列(Python猫出品),该系列重要关注 Python 的语法、筹划和发展等话题,以一个个“为什么”式的问题为切入点,试着展现 Python 的迷人魅力。更多精彩文章,请移步 Github 检察,项目所在:https://github.com/chinesehuazhou/python-whydo
到此这篇关于Python 的 f-string 可以毗连字符串与数字的缘故起因解析的文章就介绍到这了,更多相关Python f-string 毗连字符串与数字内容请搜索草根技能分享以前的文章或继承浏览下面的相关文章希望各人以后多多支持草根技能分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作