极简python 之 字符串的格式化2

时启发2024-05-18 19:37:32  130

上一篇,我们简单了解一下字符串的表示,从字符串的表示开始,逐步从字面量的表达,转到对字符串中直接应用变量的表达形式。这在定制某种结果时,使得各种变量的组合更加方便、更加直观。所以,将字符串众多函数放下不讲,咱们再进一步讨论一下字符串的格式化。

前篇中,我们知道将一个字符串作为格式化串使用,只需要在字符串左引号之前添加字母f。f是英文format的简写。很巧的是,内置函数中有format函数存在。官方文档参见:https://docs.python.org/zh-cn/3.12/library/functions.html#format。所采用的格式化语言的文档,见https://docs.python.org/zh-cn/3.12/library/string.html#formatspec。毕竟咱们不是对官方文档的照搬照抄。所以,我们还是按照自己的思路继续学习。

那么,f'{a}+{b}={int(a)+int(b)}'这种表达,有用类似于内置format函数这样的表示么?有的,字符串本身有个format方法,str.format(*args, **kwargs),让我们把f字符串中用{}括起来的部分(变量或者表达式)拿出来,把剩余部分作为一个字符串(格式化串),然后把前面从f字符串中拿出来的部分依次放在字符串format方法的参数位置。现在,改写一下,见图1:

图1 用format函数改写f字符串

如果官方文档看不懂不要紧,结果一致就是正确的。这说明字符串{}中间的变量或表达式直接逐个照搬照抄到format的参数中是没有问题的。需要注意的是,表示格式化串的字符串前没了f字母,只是一个普通字符串,这样最大的好处是,可以将此字符串储存在变量里,以对应不同的格式化要求(扩展一点,这不就是模版需求的来源么)。

而其中每个占位符位置的转换,我们可以视同为调用内置函数format的转换。内置函数format的定义为format(value, format_spec=''),只有两个参数,官方文档讲的非常清楚,“对 format(value,format_spec) 的调用会转写为 type(value).__format__(value,format_spec)”。而format_spec部分的解释可以参见官方文档:https://docs.python.org/zh-cn/3.12/library/string.html#format-specification-mini-language。

简而言之,字符串值(注意不是格式化串,格式化串是format_spec部分)的格式化一般是为了控制字符串的最小宽度。比如将一个字符串格式为至少4个字符长,不够的用空格填充,那么对应的代码是format(字符串值, '4s'),而居左、居右、居中,可以在4s前分别添加<、>、^。见图2:

图2 对字符串调用内置format函数的格式化

上图的输出部分,可以让我们更加直观的比较str.format函数和内置format函数的区别,他们的格式化串不是同一套语言体系,照搬照抄是不行的。但是KeyError错误是啥错误,从字面意义上看,就是关键字错误。为什么会这样?这是因为字符串的format方法定义的占位符部分是这样定义的:

replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

其中field_name,可以理解为给这块占位符(或者说将要被替换的部分)起的名字。

conversion,表示将要替换的值转换为字符串时,所采用的方法。比如s,表示调用str函数;r表示调用repr函数,而a表示调用是ascii函数。

format_spec才是与内置format函数的参数format_spec定义一致的部分。

上图中的例子,没有感叹号!和冒号:,所以大括号{}之内的部分将会被认为是关键字(field_name)(图中即>4s这三个字符),即对这块的命名,而后续部分并没给对应关键字指定的值,所以才会产生KeyError错误。绕的圈子有点大。不要紧,换成'{s}'.format(a)可能更容易理解,看代码,图3:

图3 字符串格式化 之 带字段名的format

而想要达到与format(a,'>4s')同样效果的话,需要将前面的格式化串改写成图4的形式:

图4 带格式化细节的字符串的格式化

尤其注意的是!r,也就是说调用repr函数与默认str函数的不同之处。repr函数的行为通常是这样的:“对于许多类型而言,此函数会尝试返回一个具有与传给eval时相同的值的字符串;在其他情况下,其表示形式将为一个包含对象类型名称和通常包括对象名称和地址的额外信息的用尖括号括起来的字符串。“(见官方文档repr函数的说明)。

对于其他类型的转换,熟悉一下format_spec部分的说明就ok了。

转载此文是出于传递更多信息目的。若来源标注错误或侵犯了您的合法权益,请与本站联系,我们将及时更正、删除、谢谢。
https://www.414w.com/read/544431.html
0
随机主题
杨紫在时尚圈弯道超车,拿下第二封五大央视《法治在线》主播经蓓工作着装生活化, 背后原因用心良苦一公里油耗才6毛钱 开瑞优劲 致富又带劲吉利缤越cool最新落地参考和配置分析不服不行! 华为的科技自立真的太绝了鲜奶成为奶中王者, 头部老大再出狠招, 去年液态奶卖了超150亿德甲保级推送: 波鸿VS杜塞尔多夫, 不败金身再添一局, 德甲升降机名不虚传!英国国防大臣称: 欧洲的中立国如果还想得到保护, 就必须加入北约辛芷蕾实力和运气并存,玩套圈一次套中大奖,抽签直接欧皇附体妮基·黑利宣布支持特朗普: 政坛风云再起地球班往事: 苏联解体时, 俄罗斯继承了1000亿债权, 要回来多少?股市专治不服,服了之后你才知道怎么去交易!千元档王炸, vivo Y200 GT: 旗舰同款大电池, 重新定义Y系列~vivo S19系列预热: 有直屏有长焦, 还有赵今麦黑龙江春耕生产即将全面告捷俄罗斯别尔哥罗德市传出多次爆炸声,此前已发布导弹警报国内首台甲醇双燃料低速机在中船发动机成功交验火箭越老越粗暴,希金斯防守瞬间变成马蜂窝,魔幻操控教科书清台因涉嫌信披违法违规 超卓航科及董事长李光平等被警告及罚款贸易商表示, 由于巴西价格坚挺, 中国购买美国大豆李彦宏吐槽AI发展速度“太慢了,AGI还要十年以上”,英语流利秒杀一大帮老对手
最新回复(0)