本篇文章为大家展示了为什么可以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文档,在里面查阅看是否有关于实现原理的线索。
文档地址: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其实是前文中格式()格式化写法的升级版。
在默认情况下,