为什么可以Python中使用f-string连接字符串与数字

  介绍

本篇文章为大家展示了为什么可以Python中使用f-string连接字符串与数字,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

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

在祝辞祝辞,“Python猫“+,666   Traceback  (most  recent  call 最后一个):   ,File “& lt; stdin>“, line  1,拷贝& lt; module>   TypeError:还要only  concatenate  str  (not “int"),用str

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

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

在祝辞祝辞,“Python猫“,+,str (666)   & # 39;Python猫666 & # 39;

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

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

在《详解Python拼接字符串的七种方式》这篇文章中,它梳理了七种拼接字符串的写法,我们可以逐个来试验一下。

几种字符串拼接方式:

1,格式化类:%,格式(),模板

2,拼接类:+(),加入()

3,插值类:f-string

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

在祝辞祝辞,“% s  % d", %, (“Python猫“,,666)   & # 39;Python猫,666 & # 39;      在祝辞祝辞,得到string  import 模板   在祝辞祝辞,s =,模板(& # 39;$ {s1} $ {s2} & # 39;)   祝辞祝辞祝辞,s.safe_substitute (s1=& # 39; Python猫& # 39;,s2=666)   & # 39;Python猫666 & # 39;      在祝辞祝辞,“Python猫{}“.format (666)   & # 39;Python猫666 & # 39;      在祝辞祝辞num =, 666   在祝辞祝辞,f" Python猫{num}“;   & # 39;Python猫666 & # 39;

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

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

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

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

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

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

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

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

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

为什么可以Python中使用f-string连接字符串与数字

文档地址:https://www.python.org/dev/peps/pep - 0498

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

f # 39; & lt; text>, {, & lt; expression>, & lt; optional  !年代,,! r,趁机! a>, & lt; optional :, format  specifier>,}, & lt; text>,…& # 39;

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

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

文档上指出,实际的执行过程等效于<代码>类型(值)。__format__(价值,format_spec)> 格式(价值,format_spec)

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

在默认情况下,

为什么可以Python中使用f-string连接字符串与数字