当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python String format()用法及代码示例


字符串 format() 方法将给定的字符串格式化为 Python 中更好的输出。

用法:

template.format(p0, p1, ..., k0=v0, k1=v1, ...)

这里,p0, p1,... 是位置参数,k0, k1,... 是关键字参数,其值分别为 v0, v1,...

而且,template 是格式代码与参数占位符的混合。

参数:

format() 方法采用任意数量的参数。但是,分为两类参数:

  • 位置参数- 可以通过花括号内的参数索引访问的参数列表{index}
  • 关键字参数- key=value 类型的参数列表,可以使用花括号内的参数键访问{key}

返回:

format() 方法返回格式化的字符串。

字符串 format() 如何工作?

format() 读取传递给它的参数类型,并根据字符串中定义的格式代码对其进行格式化。

对于位置参数

For positional arguments
位置参数

这里,参数 0 是字符串 "Adam",参数 1 是浮点数 230.2346。

注意:Python 中的参数列表从 0 开始。

字符串"Hello {0}, your balance is {1:9.3f}" 是模板字符串。这包含用于格式化的格式代码。

花括号只是要放置的参数的占位符。在上面的示例中,{0}"Adam" 的占位符,而 {1:9.3f}230.2346 的占位符。

由于模板字符串将 format() 参数表示为 {0}{1} ,因此参数是位置参数。它们都可以在没有数字的情况下引用,因为 {} 并且 Python 在内部将它们转换为数字。

在内部,

  • 自从"Adam"是 0th论点,它被放置在{0}.自从,{0}不包含任何其他格式代码,它不执行任何其他操作。
  • 但是,情况并非如此 1st参数230.2346.这里,{1:9.3f}地方230.2346在其位置并执行操作 9.3f。
  • f 指定处理浮点数的格式。如果没有正确指定,它将给出一个错误。
  • "." (9) 之前的部分指定数字 (230.2346) 可以采用的最小宽度/填充。在这种情况下,230.2346 至少分配了 9 个位置,包括 "."。
    如果未指定对齐选项,则将其对齐到剩余空格的右侧。 (对于字符串,它左对齐。)
  • "." (3) 之后的部分将小数部分 (2346) 截断为给定的数字。在这种情况下,2346 在 3 个位置后被截断。
    剩余数字 (46) 四舍五入输出 235。

对于关键字参数

Keyword argument
关键字参数

我们使用上面的相同示例来显示关键字和位置参数之间的区别。

在这里,我们不仅使用了参数,还使用了参数的键值对。即 name="Adam"blc=230.2346

由于这些参数被它们的键引用为 {name}{blc:9.3f} ,因此它们被称为关键字或命名参数。

在内部,

  • 占位符 {name} 被名称的值替换 - "Adam"。由于它不包含任何其他格式代码,因此放置了"Adam"。
  • 对于参数 blc=230.2346,占位符{blc:9.3f}替换为值 230.2346。但是在替换它之前,像前面的例子一样,它对其执行 9.3f 操作。
    这输出 230.235。小数部分在 3 位后被截断,其余数字四舍五入。同样,总宽度被分配为 9,在左侧留下两个空格。

format() 的基本格式设置

format() 方法允许使用简单的占位符进行格式化。

示例 1:默认、位置和关键字参数的基本格式

# default arguments
print("Hello {}, your balance is {}.".format("Adam", 230.2346))

# positional arguments
print("Hello {0}, your balance is {1}.".format("Adam", 230.2346))

# keyword arguments
print("Hello {name}, your balance is {blc}.".format(name="Adam", blc=230.2346))

# mixed arguments
print("Hello {0}, your balance is {blc}.".format("Adam", blc=230.2346))

输出

Hello Adam, your balance is 230.2346.
Hello Adam, your balance is 230.2346.
Hello Adam, your balance is 230.2346.
Hello Adam, your balance is 230.2346.

注意:在混合参数的情况下,关键字参数必须始终跟随位置参数。

使用format() 格式化数字

您可以使用下面给出的格式说明符来格式化数字:

数字格式类型
类型 意义
d 十进制整数
c 对应的 Unicode 字符
b 二进制格式
o 八进制格式
x 十六进制格式(小写)
X 十六进制格式(大写)
n 与'd' 相同。除了它使用当前区域设置作为数字分隔符
e index 符号。 (小写字母 e)
E index 符号(大写 E)
f 显示定点编号(默认值:6)
F 与'f' 相同。除了将 'inf' 显示为 'INF' 和 'nan' 显示为 'NAN'
g 一般格式。将数字四舍五入为 p 个有效数字。 (默认精度:6)
G 与'g' 相同。如果数量很大,则切换到 'E' 除外。
% 百分比。乘以 100 并将 % 放在末尾。

示例 2:简单的数字格式

# integer arguments
print("The number is:{:d}".format(123))

# float arguments
print("The float number is:{:f}".format(123.4567898))

# octal, binary and hexadecimal format
print("bin: {0:b}, oct: {0:o}, hex: {0:x}".format(12))

输出

The number is: 123
The number is:123.456790
bin: 1100, oct: 14, hex: c

示例 3:使用 int 和 float 填充的数字格式

# integer numbers with minimum width
print("{:5d}".format(12))

# width doesn't work for numbers longer than padding
print("{:2d}".format(1234))

# padding for float numbers
print("{:8.3f}".format(12.2346))

# integer numbers with minimum width filled with zeros
print("{:05d}".format(12))

# padding for float numbers filled with zeros
print("{:08.3f}".format(12.2346))

输出

   12
1234
  12.235
00012
0012.235

这里,

  • 在第一条语句中,{:5d} 采用整数参数并指定最小宽度为 5。由于未指定对齐方式,因此它向右对齐。
  • 在第二个语句中,您可以看到宽度 (2) 小于数字 (1234),因此它不会向左占用任何空间,但也不会截断数字。
  • 与整数不同,浮点数同时具有整数和小数部分。并且,定义为数字的最小宽度适用于整个两个部分,包括".".
  • 在第三个语句中,{:8.3f} 将小数部分截断为 3 位,将最后 2 位四舍五入。而且,这个数字现在是 12.235,整体宽度为 8,向左留出 2 个位置。
  • 如果您想用零填充剩余的位置,请在格式说明符之前放置一个零。它适用于整数和浮点数:{:05d}{:08.3f}

示例 4:有符号数字的数字格式

# show the + sign
print("{:+f} {:+f}".format(12.23, -12.23))

# show the - sign only
print("{:-f} {:-f}".format(12.23, -12.23))

# show space for + sign
print("{: f} {: f}".format(12.23, -12.23))

输出

+12.230000 -12.230000
12.230000 -12.230000
 12.230000 -12.230000

带对齐的数字格式

运算符<, ^, > and = 在为数字分配一定宽度时用于对齐。

带对齐的数字格式
类型 意义
< 与剩余空间左对齐
^ 中心对齐到剩余空间
> 与剩余空间右对齐
= 强制带符号 (+) (-) 到最左边的位置

示例 5:具有左对齐、右对齐和居中对齐的数字格式

# integer numbers with right alignment
print("{:5d}".format(12))

# float numbers with center alignment
print("{:^10.3f}".format(12.2346))

# integer left alignment filled with zeros
print("{:<05d}".format(12))

# float numbers with center alignment
print("{:=8.3f}".format(-12.2346))

输出

   12
  12.235  
12000
- 12.235

注意:用零填充整数的左对齐可能会导致问题,如第三个示例,它返回 12000,而不是 12。

使用format() 格式化字符串

作为数字,可以使用与 format() 类似的方式格式化字符串。

示例 6:使用填充和对齐的字符串格式化

# string padding with left alignment
print("{:5}".format("cat"))

# string padding with right alignment
print("{:>5}".format("cat"))

# string padding with center alignment
print("{:^5}".format("cat"))

# string padding with center alignment
# and '*' padding character
print("{:*^5}".format("cat"))

输出

cat  
  cat
 cat 
*cat*

示例 7:使用 format() 截断字符串

# truncating strings to 3 letters
print("{:.3}".format("caterpillar"))

# truncating strings to 3 letters
# and padding
print("{:5.3}".format("caterpillar"))

# truncating strings to 3 letters,
# padding and center alignment
print("{:^5.3}".format("caterpillar"))

输出

cat
cat  
 cat 

使用 format() 格式化类和字典成员

Python 在内部使用 getattr() 作为类成员,格式为 ".age"。并且,它使用__getitem__() 查找字典成员,格式为"[index]"。

示例 8:使用 format() 格式化类成员

# define Person class
class Person:
    age = 23
    name = "Adam"

# format age
print("{p.name}'s age is: {p.age}".format(p=Person()))

输出

Adam's age is: 23

在这里,Person 对象作为关键字参数 p 传递。

在模板字符串中,Person 的 nameage 分别使用 .name.age 访问。

示例 9:使用 format() 格式化字典成员

# define Person dictionary
person = {'age': 23, 'name': 'Adam'}

# format age
print("{p[name]}'s age is: {p[age]}".format(p=person))

输出

Adam's age is: 23

与类类似,person 字典作为关键字参数 p 传递。

在模板字符串中,人员的nameage 分别使用[name][age] 访问。

使用 str.format(**mapping) 在 Python 中格式化字典有一种更简单的方法。

# define Person dictionary
person = {'age': 23, 'name': 'Adam'}

# format age
print("{name}'s age is: {age}".format(**person))

** 是格式参数(最小字段宽度)。

使用 format() 将参数作为格式代码

您还可以动态传递格式代码,如精度、对齐、填充字符作为位置或关键字参数。

示例 10:使用 format() 进行动态格式化

# dynamic string format template
string = "{:{fill}{align}{width}}"

# passing format codes as arguments
print(string.format('cat', fill='*', align='^', width=5))

# dynamic float format template
num = "{:{align}{width}.{precision}f}"

# passing format codes as arguments
print(num.format(123.236, align='<', width=8, precision=2))

输出

*cat*
123.24  

这里,

  • 在第一个示例中,'cat' 是要格式化的位置参数。同样,fill='*' , align='^'width=5 是关键字参数。
  • 在模板字符串中,这些关键字参数不是作为要打印的普通字符串检索的,而是作为实际的格式代码检索的fill, align and width.
    参数替换了相应的命名占位符,并且字符串'cat' 被相应地格式化。
  • 同样,在第二个示例中,123.236 是位置参数,对齐、宽度和精度作为格式代码传递给模板字符串。

format() 的额外格式化选项

format() 还支持 type-specific 格式选项,例如日期时间和复数格式。

format() 内部调用 __format__() 获取日期时间,而 format() 访问复数的属性。

您可以轻松地覆盖任何对象的__format__() 方法以进行自定义格式设置。

示例 11:使用 format() 格式化 Type-specific 并覆盖 __format__() 方法

import datetime
# datetime formatting
date = datetime.datetime.now()
print("It's now: {:%Y/%m/%d %H:%M:%S}".format(date))

# complex number formatting
complexNumber = 1+2j
print("Real part: {0.real} and Imaginary part: {0.imag}".format(complexNumber))

# custom __format__() method
class Person:
    def __format__(self, format):
        if(format == 'age'):
            return '23'
        return 'None'

print("Adam's age is: {:age}".format(Person()))

输出

It's now: 2016/12/02 04:16:28
Real part: 1.0 and Imaginary part: 2.0
Adam's age is: 23

这里,

  • 对于日期时间:
    当前日期时间作为位置参数传递给format()方法。
    并且,内部使用__format__()方法,format()访问年、月、日、小时、分钟和秒。
  • 对于复数:
    1+2j 在内部转换为 ComplexNumber 对象。
    然后访问它的属性realimag,数字被格式化。
  • 覆盖__format__():
    像日期时间一样,您可以覆盖自己的__format__()自定义格式的方法,在访问时返回年龄{:age}

您还可以使用带有速记符号的对象的 __str__()__repr__() 函数使用 format()

__format__() 一样,您可以轻松地覆盖对象的 __str__()__repr_() 方法。

示例 12:__str()__ 和 __repr()__ 简写 !r 和 !s 使用 format()

# __str__() and __repr__() shorthand !r and !s
print("Quotes: {0!r}, Without Quotes: {0!s}".format("cat"))

# __str__() and __repr__() implementation for class
class Person:
    def __str__(self):
        return "STR"
    def __repr__(self):
        return "REPR"

print("repr: {p!r}, str: {p!s}".format(p=Person()))

输出

Quotes: 'cat', Without Quotes: cat
repr: REPR, str: STR

相关用法


注:本文由纯净天空筛选整理自 Python String format()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。