字符串格式化之format()

字符串的格式化是特别特别重要的一个知识点,自己将通过python官方文档来具体总结学习它,整体为如下一篇笔记文章,以备自己后来复习回顾。
    

一、format()在官方文档的整体介绍:

  1. python官网的原文如下:

  2. 关于上述话的理解翻译

    1. 这第一段话的意思是说:将我们需要输出的值通过format_spec处理之后格式化打印输出,关于format_spec的解释取决于value参数的类型。但是呢,大多数内置类型都使用标准的格式语法叫做:格式规范迷你语言(Format Specification Mini-Language
    2. 第二段话的意思是:默认的format_spec是一个空的字符串“”,其效果通常与调用str(value)的效果是相同的。
    3. 第三段话的意思是:在搜索值的__format__()方法的时候,通常会绕开实例字典将format(value,format_spec)转换成type(value).__format__(value, format_spec)的形式。如果该方法搜索到一个对象并且该对象format_spec为非空,或者说如果format_spec其返回值不是一个字符串,则会引发TypeError异常。
    4. 关于改版的异常处理这里将其省略。

二、format()语法在官方文档的介绍

  1. 那么format()的语法我们该如何来用呢?下面是format()的语法在官网的介绍原文如下:

  2. 理解翻译如下:

    1. 第一段话的意思如下:格式字符串包含由大括号{}包围的“替换字段”。大括号未包含的任何内容都被视为文字文本,并将其原样的复制到输出中。如果需要在文字文本中包含大括号字符,可以通过加倍的{{}}来对其进行转义。

    2. 下面的表格就是替换字段的语法

    3. 第三段:用不太正式的语言来说,替换字段replacement_field 可以用上述表格中的语法格式[field_name]开头,这个[field_name]就是需要指定格式化的值,并且将该值插入到输出的对象中去来代替前面我们需要替换的替换字段replacement_field[field_name]随后跟着一个前面带有感叹号!转换字段conversion 和带有冒号:格式化形式format_spec。它们为替换值指定非默认格式。

    4. 第四段:field_name本身是以数字或者关键字arg_name开头。如果它是数字,它指的是一个位置参数;如果它是关键字,那么它指的是一个命名的关键字参数。如果格式字符串中的数字arg_name依次为0、1、2、…,则可以省略它们(而不仅仅是省略其中的一些),数字0、1、2、…将按顺序自动插入。由于arg_name不是用引号分隔的,因此无法在格式字符串中指定任意的字典键(例如,字符串“10”,或“:-]”)。arg_name后面可以跟任意数量的索引或者属性表达式。形为".name"的表达式使用getattr()方法选择命名属性,而形式为[index]的表达式使用__getitem__()执行索引查找。

    5. 关于改版的说明在这里做省略。

    6. 下面的表格是一些简例。

    7. 倒数第二段:转换字段conversion 在格式化之前会导致强制类型转换。通常格式化值的工作由值本身的__format__()方法完成的。然而在某些情况下,需要强制将类型格式化为字符串,来重写它自身的格式定义。通过在调用__format__()之前将值转换为字符串,绕过正常的本身__format__()格式化逻辑。目前支持三个转换标志:!s将会对值调用str()方法,!r将会调用repr()方法,以及!a将会调用ascii()方法。

    8. 注释:

      1. repr()方法:repr() 函数将对象转化为供解释器读取的形式。

      测试代码:

        # coding=UTF-8s="物品\t单价\t数量\n包子\t1\t2"print(s)print(repr(s))
      

      运行结果:

      物品    单价    数量
      包子    1       2
      '物品\t单价\t数量\n包子\t1\t2'
      
      1. ascii()方法:ascii() 函数类似 repr() 函数, 返回一个表示对象的字符串, 但是对于字符串中的非 ASCII 字符则返回通过 repr() 函数使用 \x, \u 或 \U 编码的字符。 生成字符串类似 Python2 版本中 repr() 函数的返回值。

      测试代码:

      >>> ascii('runoob')
      "'runoob'"
      

三、format_spec格式化迷你语言

下面是关于Format Specification Mini-Language的python官方文档,接下来通过分析官方文档来学习format()格式化字符串中的Format Specification Mini-Language。

  1. 下面是官网中的原文:

  1. 理解翻译:

    1. 下面这是第一段话的解释: 在format(value, format_spec="")format_spec相当于Format Specifications的简称。我们需要格式化字符串时需要用format_spec来规范如何显示我们输出的字符串。
    2. 第二段话的解释为: 有些格式选项只支持数字类型
    3. 第三段话解释:一般惯例是,空格式规范format_spec 产生的结果与对值调用str()时的结果相同。 非空的 格式化规范format_spec 通常会修改解果。
    4. 接下来是一个语法表格
    5. 第四段话是:如果指定了一个有效的对齐值,则可以在其前面加一个填充字符,该字符可以是任意字符,如果填充字符被省略,则默认为空格。在格式化字符串文本中使用str.format()方法时,不能使用文本大括号("{""}")作为填充字符。但是,我们可以插入带有 替换字段repacement_field 的大括号"{ }"({{}})。因此这个限制不会影响我们对format()方法的使用。
  2. 关于format_spec中的[align]选项如下:

    关于上述表格对应中文表格如下:

    选项 描述
    < 强制字段在有效空间内保持左对齐(这是大多数对象的默认设置)
    > 强制字段在有效空间内保持右对齐(这是大多数对象的默认设置)
    = 强制将填充字符放置在符号(如果有)之后数字之前,这被用来打印例如表单“+000000120”这样的字段。并且这种对齐选项仅对数字类型有效。当“0”紧接在字符宽度之前时,它将成为填充数字时的默认值。
    ^ 强制字段在有效空间内保持居中对齐
  3. 关于format_spec中的[sign]选项如下:
    [sign]选项只对数字类型有效

    关于上述表格的对应中文表如下:

    选项 描述
    + 表示正负数均可使用符号
    - 指示符号只被用于负数(这是默认行为)
    space 表示正数应使用前导空格,负数应使用负号。
  4. 下面是关于format_spec 中的[z]选项的解释

选项 描述
z “z”选项在舍入到格式精度后将负零浮点值强制为正零。此选项仅对浮点表示类型有效。
  1. 关于format_spec中的#的解释
选项 描述
# #号这个选项仅对整型、浮点型和负数型有效。对于整数,当使用二进制、八进制或十六进制输出时,此选项会在输出值中添加相应的前缀"0b""0o""0x""0X"。对于浮点型和负数型,即使后面没有数字,替换形式会导致转换结果始终包含小数点字符,但通常,只有数字跟在小数点字符后面时,小数点字符才会出现在这些转换的结果中。此外,对于“g”和“G”的科学计数法小数点的转换,不会从结果中删除尾随零。
  1. 关于format_spec中的[0] [width]的解释
选项 描述
[0][width] width是定义最小字段总宽度的十进制整数,包括任何前缀、分隔符和其他格式字符。如果未指定,则字段宽度将由输出内容决定。如果未指定显式对齐方式,则在宽度字段前面加一个零(“0”)字符将启用数字类型的符号识别零填充。这相当于对齐类型[sign]“=”的填充字符“0”
  1. 关于format_spec中的[grouping_option]的解释
选项 描述
, “,”选项表示使用逗号作为千位分隔符。对于支持区域设置的分隔符,请改用“n”整数表示类型。
_ “_”选项表示对浮点表示类型和整数表示类型“d”使用下划线作为千位分隔符。对于整数表示类型“b”“o”“x”“x”,将每4位插入下划线。对于其他演示类型,指定此选项是错误的。
  1. 关于format_spec中的[.precision]的解释
.precision 精度是一个十进制整数,表示浮点类型“f”“f”的小数点之后应显示多少位数字,表示科学计数法小数类型“g”“g”的小数点前和后应显示多少位数。对于字符串类型,字段指示最大字段大小,换句话说,字段内容将使用多少个字符。整数表示类型不允许精度。
  1. 关于format_spec中的[type]类型的解释

    1. 关于字符串表示类型
    类型 含意
    's' 字符串格式。这是字符串的默认类型,可以省略。
    None 's' 一样。
    1. 关于整数表示类型
    类型 含意
    'b' 二进制格式。 输出以 2 为基数的数字。
    'c' 将字符在打印之前将整数转换为相应的unicode字符。
    'd' 十进制整数。 输出以 10 为基数的数字。
    'o' 八进制格式。 输出以 8 为基数的数字。
    'x' 十六进制格式。 输出以 16 为基数的数字,使用小写字母表示 9 以上的数码。
    'X' 十六进制格式。 输出以 16 为基数的数字,使用大写字母表示 9 以上的数码。 在指定 ‘#’ 的情况下,前缀'0x' 也将被转为大写形式'0X'
    'n' 数字。 这与 'd' 相似,不同之处在于它会使用当前区域设置来插入适当的数字分隔字符。
    None 'd' 相同。
    1. 在上述的表示类型之外,整数还可以通过下列的浮点表示类型来格式化 (除了'n'None)。 当这样做时,会在格式化之前使用 float() 将整数转换为浮点数。
    类型 含意
    'e' 科学计数法。 对于一个给定的精度 p,将数字格式化为以字母 'e' 分隔系数和指数的科学计数法形式。 系数在小数点之前有一位,之后有 p 位,总计 p + 1 个有效数位。 如未指定精度,则会对 float 采用小数点之后 6 位精度,而对 Decimal 则显示所有系数位。 如果小数点之后没有数位,则小数点也会被略去,除非使用了 # 选项。
    'E' 科学计数法。 与 'e' 相似,不同之处在于它使用大写字母 'E' 作为分隔字符。
    'f' 定点表示法。 对于一个给定的精度 p,将数字格式化为在小数点之后恰好有 p 位的小数形式。 如未指定精度,则会对 float 采用小数点之后 6 位精度,而对 Decimal 则使用大到足够显示所有系数位的精度。 如果小数点之后没有数位,则小数点也会被略去,除非使用了# 选项。
    'F' 定点表示。 与 'f' 相似,但会将 nan 转为 NAN 并将 inf 转为 INF
    'g' 1. 常规格式。 对于给定精度 p >= 1,这会将数值舍入到 p 个有效数位,再将结果以定点表示法或科学计数法进行格式化,具体取决于其值的大小。 精度 0 会被视为等价于精度12.准确的规则如下: 假设使用表示类型 'e' 和精度 p-1 进行格式化的结果具有指数值 exp。 那么如果 m <= exp < p,其中 m-4 表示浮点值而以 -6 表示 Decimal 值,该数字将使用类型'f' 和精度 p-1-exp 进行格式化。 否则的话,该数字将使用表示类型 'e' 和精度 p-1 进行格式化。 在两种情况下,都会从有效数字中移除无意义的末尾零,如果小数点之后没有余下数字则小数点也会被移除,除非使用了 '#' 选项。3.如未指定精度,会对 float 采用 6 个有效数位的精度。 对于 Decimal,结果的系数会沿用原值的系数数位;对于绝对值小于 1e-6 的值以及最小有效数位的位值大于 1 的数值将会使用科学计数法,在其他情况下则会使用定点表示法即科学计数法。正负无穷,正负零和 nan 会分别被格式化为 inf, -inf, 0, -0nan,无论精度如何设定。
    'G' 常规格式。 类似于'g',不同之处在于当数值非常大时会切换为 'E'。 无穷与 NaN 也会表示为大写形式。
    'n' 数字。 这与 'g' 相似,不同之处在于它会使用当前区域设置来插入适当的数字分隔字符。
    '%' 百分比。 将数字乘以 100 并显示为定点 ('f') 格式,后面带一个百分号。
    None 对于 float 来说这类似于 'g',不同之处在于当使用定点表示法时,小数点之后将至少显示一位。 所用的精度会大到足以精确表示给定的值。对于 Decimal 来说这相当于 'g''G',具体取决于当前 decimal 上下文的 context.capitals 值。总体效果是将 str() 的输出匹配为其他格式化因子所调整出的样子。

四、关于format()格式化实例的一些应用

format()语法在大多数情况下与旧式的 % 格式化类似,只是增加了 {}: 来取代 %。 例如'%03.2f' 可以被改写为 '{:03.2f}'
新的格式语法还支持新增的不同选项,将在以下示例中说明。

  1. 按位置访问参数:
>>>'{0}, {1}, {2}'.format('a', 'b', 'c')
'a, b, c'
>>>'{}, {}, {}'.format('a', 'b', 'c')  # 3.1+ only
'a, b, c'
>>>'{2}, {1}, {0}'.format('a', 'b', 'c')
'c, b, a'
>>>'{2}, {1}, {0}'.format(*'abc')      # unpacking argument sequence 序列解包
>>>'c, b, a'
'{0}{1}{0}'.format('abra', 'cad')   # arguments' indices can be repeated 参数索引重复
'abracadabra'
  1. 按名称访问参数
>>>'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'
>>>coord = {'latitude': '37.24N', 'longitude': '-115.81W'}
>>>'Coordinates: {latitude}, {longitude}'.format(**coord)
'Coordinates: 37.24N, -115.81W'
  1. 访问参数的属性
>>>c = 3-5j
>>>('The complex number {0} is formed from the real part {0.real} ''and the imaginary part {0.imag}.').format(c)
'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.'
>>>class Point:def __init__(self, x, y):self.x, self.y = x, ydef __str__(self):return 'Point({self.x}, {self.y})'.format(self=self)>>>str(Point(4, 2))
'Point(4, 2)'
  1. 访问参数的项
>>>coord = (3, 5)
>>>'X: {0[0]};  Y: {0[1]}'.format(coord)
'X: 3;  Y: 5'
  1. 替代 %s%r:
>>>"repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')
"repr() shows quotes: 'test1'; str() doesn't: test2"
  1. 对齐文本以及指定宽度:
>>>'{:<30}'.format('left aligned')
'left aligned                  '
>>>'{:>30}'.format('right aligned')
'                 right aligned'
>>>'{:^30}'.format('centered')
'           centered           '
>>>'{:*^30}'.format('centered')  # use '*' as a fill char
'***********centered***********'
  1. 替代 %+f, %-f 和 % f 以及指定正负号:
>>>'{:+f}; {:+f}'.format(3.14, -3.14)  # show it always 正负号都显示
'+3.140000; -3.140000'
>>>'{: f}; {: f}'.format(3.14, -3.14)  # show a space for positive numbers 只显示正号的空格
' 3.140000; -3.140000'
>>>'{:-f}; {:-f}'.format(3.14, -3.14)  # show only the minus -- same as '{:f}; {:f}' 只显示负数的负号
'3.140000; -3.140000'
  1. 替代 %x 和 %o 以及转换基于不同进位制的值:
>>># format also supports binary numbers
>>>"int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>># with 0x, 0o, or 0b as prefix:
>>>"int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin:{0:#b}".format(42)
'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'
  1. 使用逗号作为千位分隔符:
>>>'{:,}'.format(1234567890)
'1,234,567,890'
  1. 表示为百分数:
>>>points = 19
>>>total = 22
>>>'Correct answers: {:.2%}'.format(points/total)
'Correct answers: 86.36%'
  1. 使用特定类型的专属格式化:
>>>import datetime
>>>d = datetime.datetime(2010, 7, 4, 12, 15, 58)
>>>'{:%Y-%m-%d %H:%M:%S}'.format(d)
'2010-07-04 12:15:58'
  1. 嵌套参数以及更复杂的示例:
>>>for align, text in zip('<^>', ['left', 'center', 'right']):'{0:{fill}{align}16}'.format(text, fill=align, align=align)'left<<<<<<<<<<<<'
'^^^^^center^^^^^'
'>>>>>>>>>>>right'
>>>
>>>octets = [192, 168, 0, 1]
>>>'{:02X}{:02X}{:02X}{:02X}'.format(*octets)
'C0A80001'
>>>int(_, 16)
3232235521
>>>
>>>width = 5
>>>for num in range(5,12): for base in 'dXob':print('{0:{width}{base}}'.format(num, base=base, width=width), end=' ')print()5     5     5   1016     6     6   1107     7     7   1118     8    10  10009     9    11  100110     A    12  101011     B    13  1011

END

python笔记6-python官方文档之format()格式化详解相关推荐

  1. Spring指南之使用Spring缓存数据(Spring Framework官方文档之缓存抽象详解)

    1.请参见官方文档Spring指南之使用 Spring 缓存数据 2.请参见Spring官方文档之缓存抽象 3.参见github代码 文章目录 一.简介 二.你将创造什么(What You Will ...

  2. 零基础Python修炼笔记——整理自官方文档

    零基础Python修炼笔记 题外话 "编外人员"学Python 书籍 交互课程 中小学儿童学习 教材和网站 科学工作者教程 视频 工具 后记 题外话 去年我自学Python的时候, ...

  3. python pymssql - pymssql模块官方文档的翻译

    译者注:译者博客(http://blog.csdn.net/lin_strong),转载请保留这条.此为pymssql模块version2.1.4官方文档的翻译,仅供学习交流使用,请勿用于商业用途. ...

  4. Python 3.7.1 官方文档 总结

    Python 3.7.1 1.一些概念 2.小用法 2.1 迭代器: 2.2 生成器 3.数据结构 3.1 字符串 3.2 列表 3.2.1 列表方法 list.append(x) list.exte ...

  5. Python Turtle 海龟画图 官方文档

    turtle --- 海龟绘图 源码: Lib/turtle.py 概述 海龟绘图很适合用来引导孩子学习编程. 最初来自于 Wally Feurzeig, Seymour Papert 和 Cynth ...

  6. Python的Requests库官方文档

    中文文档地址:http://cn.python-requests.org/zh_CN/latest/ 英文文档地址:https://2.python-requests.org/en/master/ap ...

  7. Django企业开发读书笔记(及官方文档学习笔记) 老男孩2019Go语言视频学习

    目标:深入理解Django以及web开发深入知识,掌握Gin ,Go micro 框架 ,Kafka ,Zookeeper 为kubernetes Istio 做微服务,服务网格做铺垫 实现Pytho ...

  8. [Python3]Python官方文档-Python Manuals

    简介 一般情况下,初学者都不愿意直接去浏览Python Manuals,即Python自带的官方文档.尤其是只有英文版的情况下,初学者更加不会去使用该官方文档了. 在这里笔者强力推荐初学者经常学会使用 ...

  9. gateway的官方文档解读

    之前公司用了springcloud的gateway.被一个伙伴留下了一堆的坑,没办法只能从头梳理. 第一步就是确定架构, gateway+consul+springboot 第二步就是确定一个flag ...

最新文章

  1. 2021年大数据Flink(三):​​​​​​​Flink安装部署 Local本地模式
  2. 我来告诉你【Redis】入门 一
  3. 文本框点击后文字消失总结
  4. 几种所见所得的在线编辑器
  5. 如何使用键盘操控苹果Mac?
  6. IDC:第三季度企业WLAN市场增长强劲
  7. 伪代码是计算机语言的一种吗,伪代码是什么?可以取代代码存在吗?
  8. mysql 最新版本_mysql最新版本是多少
  9. 机器学习笔记——14 矩阵谱分解与奇异值分解及其背后的线性算子理论 (实战项目:利用SVD进行图像压缩)
  10. ra_customer_trx_all 的XLA会计科目
  11. 【MATLAB】批量修改文件名
  12. WinEdit初使用
  13. 记以ELK结合的Web日志数据采集心得整理
  14. 【计算机视觉】张正友棋盘格标定法
  15. React Native ---fetch 之GET请求带参数
  16. Windows Update自动更新
  17. 管理者一定要分清绝对优势和比较优势:我做的比你好,就应该我做吗?
  18. ROS2.96-97,电信网通双线接入图文教程(转)
  19. amd显卡导致matlab崩溃,AMD的Radeon显卡黑屏和崩溃解决了大部分
  20. 【新政策】2021年全日制大专学历持软考中级证书可入户深圳

热门文章

  1. 【前端】Ajax-form表单与模板引擎
  2. android强制全屏_如何强制任何Android应用进入全屏浸入模式(无生根)
  3. 设计模式(2)六大原则(七大原则)
  4. 数据库面试题(开发者必看)
  5. 使用Fiddler抓取微信小程序二维码请求地址
  6. server2019文件服务器,windows server 2019文件共享问题
  7. mysql的表面sno大全_学生表学号sno数据库
  8. 手动可以执行脚本,crontab执行失败,可能和环境变量有关(如果涉及到环境变量)
  9. python中定义变量有引号和单引号_说说Python 单引号、双引号、三引号的区别?...
  10. FP Tree算法原理