《Python基础知识-1格式化字符串》

  (参考链接:更漂亮的输出格式

1 %格式化

  (参考链接:printf 风格的字符串格式化

2 f-string格式化

  (参考链接:格式化字符串字面值

3 format格式化

  (参考链接:格式字符串语法
  str.format( )方法的基本用法如下所示:

In [1]: print('We are the {} who say "{}!"'.format('knights', 'Ni'))
Out[1]: We are the knights who say "Ni!"

  花括号({ })和其中的字符(称为格式字段,替换字段)将替换为传递给 str.format( ) 方法的对象。不在花括号之内的内容被视为字面文本,会不加修改地复制到输出中。如果需要在字面文本中包含花括号字符,可以通过重复来转义:{{ and }}。
  替换字段的语法如下:

replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name        ::=  arg_name ("." attribute_name | "[" element_index "]")*
arg_name          ::=  [identifier | digit+]
attribute_name    ::=  identifier
element_index     ::=  digit+ | index_string
index_string      ::=  <any source character except "]"> +
conversion        ::=  "r" | "s" | "a"
format_spec       ::=  <described in the next section>

其中:

  • field_name 本身以一个数字或关键字 arg_name 打头。如果为数字,则它指向一个位置参数,而如果为关键字,则它指向一个命名关键字参数。如果格式字符串中的数字 arg_names 为 0, 1, 2, … 的序列,它们可以全部省略(而非部分省略),数字 0, 1, 2, … 将会按顺序自动插入(因此 ‘{} {}’.format(a, b) 等价于 ‘{0} {1}’.format(a, b))。例如:
# 数字 → 位置参数
In [1]: print('{0} and {1}'.format('spam', 'eggs'))  # return spam and eggs
In [2]: print('{} and {}'.format('spam', 'eggs'))  # return spam and eggs
In [3]: print('{1} and {0}'.format('spam', 'eggs'))  # return eggs and spam

# 传入位置参数列表可用 *列表
In [4]: food = ['spam', 'eggs']
In [5]: print('{0} and {1}'.format(food))  # return IndexError: tuple index out of range
In [6]: print('{0} and {0}'.format(food))  # return ['spam', 'eggs'] and ['spam', 'eggs']
In [7]: print('{0} and {1}'.format(*food))  # return spam and eggs
In [8]: print('{0[0]} and {0[1]}'.format(food))  # return spam and eggs

# 关键字 → 命名关键字参数
In [1]: print('This {food} is {adjective}.'.format(food='spam', adjective='absolutely horrible'))
Out[1]: This spam is absolutely horrible.

# 传入关键字参数字典可用 **字典
In [2]: food = {'food1': 'spam', 'food2': 'eggs'}
In [3]: print('{0} and {0}'.format(food))  # return {'food1': 'spam', 'food2': 'eggs'} and {'food1': 'spam', 'food2': 'eggs'}
In [4]: print('{food1} and {food2}'.format(**food))  # return spam and eggs
In [5]: print('{food[food1]} and {food[food2]}'.format(food=food))  # return spam and eggs

# 位置和关键字参数可以任意组合
In [1]: print('The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred', other='Georg'))
Out[1]: The story of Bill, Manfred, and Georg.
  • 由于 arg_name 不使用引号分隔,因此无法在格式字符串中指定任意的字典键 (例如字符串 ‘10’ 或 ‘:-]’)。arg_name 之后可以带上任意数量的索引或属性表达式。‘.name’ 形式的表达式会使用 getattr( ) 选择命名属性,而 ‘[index]’ 形式的表达式会使用 getitem( ) 执行索引查找。
# .name 属性
In [1]: class Food:
In [2]:     food1 = 'spam'
In [3]:     food2 = 'eggs'
In [4]: print('{0.food1} and {0.food2}'.format(Food))  # return spam and eggs

# [index] 索引
In [5]: food = ['spam', 'eggs']
In [6]: print('{0[0]} and {0[1]}'.format(food))  # return spam and eggs
In [7]: print('{food[0]} and {food[1]}'.format(food=food))  # return spam and eggs
  • 使用 conversion 字段在格式化之前进行类型强制转换。通常,格式化值的工作由值本身的 format( ) 方法来完成。但是,在某些情况下最好强制将类型格式化为一个字符串,覆盖其本身的格式化定义。通过在调用 format( ) 之前将值转换为字符串,可以绕过正常的格式化逻辑。目前支持的转换旗标有三种: ‘!s’ 会对值调用 str( ),‘!r’ 调用 repr( ) 而 ‘!a’ 则调用 ascii( )。
In [1]: print('{0!s} and {1!r} and {1!a}'.format('spam', 'eggs'))
Out[1]: spam and 'eggs' and 'eggs'
  • format_spec 字段包含值应如何呈现的规格描述,例如字段宽度、对齐、填充、小数精度等细节信息。一般形式如下:
format_spec     ::=  [[fill]align][sign][#][0][width][grouping_option][.precision][type]
fill            ::=  <any character>
align           ::=  "<" | ">" | "=" | "^"
sign            ::=  "+" | "-" | " "
width           ::=  digit+
grouping_option ::=  "_" | ","
precision       ::=  digit+
type            ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"

▶ [[fill]align] 如果指定了一个有效的 align 值,则可以在该值前面加一个 fill 字符,它可以为任意字符,如果省略则默认为空格符。各种对齐选项的含义如下:

选项描述
<强制字段在可用空间内 左对齐(这是大多数对象的默认值)。
>强制字段在可用空间内 右对齐(这是数字的默认值)。
=强制将填充放置在符号(如果有)之后但在数字之前。这用于以“+000000120”形式打印字段。 \newline 此对齐选项仅对数字类型有效。当’0’紧接在字段宽度之前时,它成为默认值。
^强制字段在可用空间内 居中

  请注意,除非定义了最小字段宽度,否则字段宽度将始终与填充它的数据大小相同,因此在这种情况下,对齐选项没有意义。例如:

# 未定义最小字段宽度 width
In [1]: print('{0:*<}'.format(10))  # renturn 10

# 定义最小字段宽度 width
In [1]: print('{0:*<10}'.format(10))  # renturn 10********
In [2]: print('{0:*>10}'.format(10))  # renturn ********10
In [3]: print('{0:*=10}'.format(-10))  # renturn -*******10
In [4]: print('{0:*^10}'.format(10))  # renturn ****10****

▶ [[fill]align][sign] sign 选项仅对数字类型有效,可以是以下之一:

选项描述
+表示标志应该用于正数和负数。
-表示标志应仅用于负数(这是默认行为)。
space表示应在正数上使用前导空格,在负数上使用减号。

  例如:

In [1]: print('{0:*<+10}'.format(10))  # return +10*******
In [2]: print('{0:*>+10}'.format(10))  # return *******+10
In [3]: print('{0:*=+10}'.format(10))  # return +*******10
In [4]: print('{0:*= 10}'.format(10))  # return  *******10

▶ [[fill]align][sign][#] ‘#’ 选项可以让“替代形式”被用于转换。替代形式可针对不同类型分别定义。此选项仅对整数、浮点、复数和 Decimal 类型有效。对于整数类型,当使用二进制、八进制或十六进制输出时,此选项会为输出值添加相应的 ‘0b’, ‘0o’ 或 ‘0x’ 前缀。对于浮点数、复数和 Decimal 类型,替代形式会使得转换结果总是包含小数点符号,即使其不带小数。通常只有在带有小数的情况下,此类转换的结果中才会出现小数点符号。此外,对于 ‘g’ 和 ‘G’ 转换,末尾的零不会从结果中被移除。
  例如:

In [1]: print('{0:*< #10o}'.format(10))  # return  0o12*****
In [2]: print('{0:*<+#10o}'.format(10))  # return +0o12*****

▶ [[fill]align][sign][#][0][width] width 是一个定义最小总字段宽度的十进制整数,包括任何前缀、分隔符和其他格式化字符。如果未指定,则字段宽度将由内容确定。当未显式给出对齐方式时,在 width 字段前加一个零 (‘0’) 字段将为数字类型启用感知正负号的零填充。这相当于设置 fill 字符为 ‘0’ 且 alignment 类型为 ‘=’。
▶ [[fill]align][sign][#][0][width][grouping_option]

选项描述
_表示对浮点表示类型和整数表示类型 ‘d’ 使用下划线作为千位分隔符。对于整数表示类型 ‘b’, ‘o’, ‘x’ 和 ‘X’,将为每 4 个数位插入一个下划线。 \newline 对于其他表示类型指定此选项则将导致错误。
,表示 使用逗号作为千位分隔符。对于感应区域设置的分隔符,请改用 ‘n’ 整数表示类型。

  例如:

In [1]: print('{0:,}'.format(100000000))  # return 100,000,000

▶ [[fill]align][sign][#][0][width][grouping_option][.precision] precision 是一个十进制数字,表示对于以 ‘f’ and ‘F’ 格式化的浮点数值要在小数点后显示多少个数位,或者对于以 ‘g’ 或 ‘G’ 格式化的浮点数值要在小数点前后共显示多少个数位。对于非数字类型,该字段表示最大字段大小 —— 换句话说就是要使用多少个来自字段内容的字符。对于整数值则不允许使用 precision。
  例如:

In [1]: print('{0:.2f}'.format(10))  # return 10.00
In [2]: print('{0:.4g}'.format(3.14))  # return 3.14
In [3]: print('{0:.4g}'.format(3.1415926))  # return 3.142
In [4]: print('{0:.2}'.format('Hello'))  # return He

▶ [[fill]align][sign][#][0][width][grouping_option][.precision][type] type 确定了数据应如何呈现。
  可用的字符串表示类型是:

类型含义
s字符串格式。这是字符串的默认类型,可以省略。
None和 ‘s’ 一样。

  可用的整数表示类型是:

类型含义
b二进制格式。输出以 2 为基数的数字。
c字符。在打印之前将整数转换为相应的unicode字符。
d十进制整数。输出以 10 为基数的数字。
o八进制格式。输出以 8 为基数的数字。
x十六进制格式。输出以 16 为基数的数字,使用小写字母表示 9 以上的数码。
X十六进制格式。输出以 16 为基数的数字,使用大写字母表示 9 以上的数码。
n数字。这与 ‘d’ 相似,不同之处在于它会使用当前区域设置来插入适当的数字分隔字符。
None和 ‘d’ 相同。

  可用的浮点数表示类型是:

类型含义
e指数表示。以使用字母 ‘e’ 来标示指数的科学计数法打印数字。默认的精度为 6。
E指数表示。与 ‘e’ 相似,不同之处在于它使用大写字母 ‘E’ 作为分隔字符。
f定点表示。将数字显示为一个定点数。默认的精确度为 6。
F定点表示。与 ‘f’ 相似,但会将 nan 转为 NAN 并将 inf 转为 INF。
g常规格式。对于给定的精度 p >= 1,这会将数值舍入到 p 位有效数字,再将结果以定点格式或科学计数法进行格式化,具体取决于其值的大小。 \newline 准确的规则如下:假设使用表示类型 ‘e’ 和精度 p-1 进行格式化的结果具有指数值 exp。则如果 -4 <= exp < p,该数字将使用表示类型 ‘f’ 和精度 p-1-exp 进行格式化。否则的话,该数字将使用表示类型 ‘e’ 和精度 p-1 进行格式化。在两种情况下,都会从有效数字中移除无意义的末尾零,并且如果小数点之后没有数字则小数点也会被移除,除非使用了 ‘#’ 选项。 \newline 正负无穷,正负零和 nan 会分别被格式化为 inf, -inf, 0, -0 和 nan,无论精度如何设定。精度 0 会被视为等同于精度 1。默认精度为 6。
G常规格式。类似于 ‘g’,不同之处在于当数值非常大时会切换为 ‘E’。无穷与 NaN 也会表示为大写形式。
n数字。这与 ‘g’ 相似,不同之处在于它会使用当前区域设置来插入适当的数字分隔字符。
%百分比。将数字乘以 100 并显示为定点 (‘f’) 格式,后面带一个百分号。
None类似于 ‘g’,不同之处在于当使用定点表示法时,小数点后将至少显示一位。默认精度与表示给定值所需的精度一样。 \newline 整体效果为与其他格式修饰符所调整的 str() 输出保持一致。

  例如:

In [1]: print('{0:.2f}'.format(3.1415926))  # return 3.14
In [2]: print('{0:.4%}'.format(3.1415926))  # return 314.1593%
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-Sussurro-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值