欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python格式化输出

程序员文章站 2022-07-15 08:36:15
...

Python格式化输出主要有三种方式,1、%-formatting;2、str.format();3、f-Strings

%-formatting

字符串对象具有实用%运算符的内置操作,您可以使用它来格式化字符串。

以下是部分字符串格式符号:

符号 说明
%s 字符串
%c 字符
%i 整数
%d 十进制整数
%o 八进制整数
%x 十六进制整数
%e 浮点数1
%f 浮点数2
%g 浮点数3
# 整数输出
print('%o' % 10)  # 八进制
print('%d' % 10)  # 十进制
print('%x' % 10)  # 十六进制

# 运行结果
12
10
a
# 浮点数输出
print('%f' % 0.123456333)     # (默认)保留小数点后六位有效数字
print('%.3f' % 0.123456333)   # 保留小数点后三位有效数字
print('%e' % 0.123456333)     # 保留小数点后六位有效数字,以指数形式输出
print('%.3e' % 0.123456333)   # 保留小数点后三位有效数字,以指数形式输出
print('%g' % 0.123456333)     # 保留六位有效数字的前提下,以小数形式输出,否者以指数形式输出
print('%.8g' % 0.123456333)
print('%.2g' % 0.123456333)
print('%.2g' % 123.4563333)   # 保留两位有效数字,无法使用小数形式,以指数的形式

# 运行结果
0.123456
0.123
1.234563e-01
1.235e-01
0.123456
0.12345633
0.12
1.2e+02
# 字符串输出
print('%s' % 'i love python')
print('%20s' % 'i love python')   # 右对齐,占20位,不够则补位
print('%-20s' % 'i love python')    # 左对齐,占20位,不够则补位
print('%.3s' % 'i love python')   # 右对齐,截取3位字符串
print('%20.3s' % 'i love python')    # 右对齐,占20位,截取3位字符串,不够则补位

# 运行结果
i love python
       i love python
i love python       
i l
                 i l

%-formatting 的方式并不好用,上面我们的示例代码很容易看明白。但是当我们使用更多的参数和更长的字符串,代码就开始变得不太容易阅读,变得十分凌乱:

first_name = "Eric"
last_name = "Idle"
age = 74
profession = "comedian"
affiliation = "Monty Python"
"Hello, %s %s. You are %s. You are a %s. You were a member of %s." %\
(first_name, last_name, age, profession, affiliation)

# 运行结果
Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python.

str.format()

str.format()是对 %-formatting 的改进,相对于 %-formatting ,str.format()功能更加强大,该函数把字符串当成一个模板,通过传入的参数进行格式化,并且使用大括号“{}”作为特殊字符代替“%”。

通过代码查看它的使用方法:

print('{} {} {}'.format('i', 'love', 'python')) # 替换字段使用{}标记
print('{0} {1} {2}'.format('i', 'love', 'python'))  # 也可以通过引用索引以任何顺序引用变量
print('{2} {1} {0}'.format('i', 'love', 'python'))  # 带索引可以任意调换顺序
print('{year}/{month}/{day}'.format(year='2018', month='10', day='21')) # 带变量名称,通过变量名称查找字符串
# 通过使用 ** 来用字典传递值
person = {name:'Eric', age:17}
print("Hello,{name},You are {age}.".format(**person))

# 运行结果
i love python
i love python
python love i
2018/10/21
Hello,Eric,You are 17.

使用str.format()的代码比使用%-formatting的代码更易读,但当处理多个参数和更长的字符串时,str.format()仍然可能非常冗长。看看这个:

first_name = "Eric"
last_name = "Idle"
age = 74
profession = "comedian"
affiliation = "Monty Python"
print(("Hello, {first_name} {last_name}. You are {age}. " + 
       "You are a {profession}. You were a member of {affiliation}.")
       .format(first_name=first_name, last_name=last_name, age=age, profession=profession, affiliation=affiliation))
       
# 运行结果
Hello, Eric Idle. You are 74. You are a comedian. You were a member of Monty Python. 

f-Strings:一种改进Python格式字符串的新方法

f-Strings使格式化更容易,也可以节省很多时间。以下是f-strings使用的一些方法。

a = 'i'
b = 'love'
c = 'python'
print(f"{a} {b} {c}")   # 使用大写字母F也是有效的

# 运行结果
i love python

我们同样可以使用f{}调用函数:

print(f"{first_name.lower()} is funny.")

# 运行结果
eric is funny.

f-Strings性能:

f字符串中的f也可以代表“速度快”。f-字符串比%-formatting和str.format()都快。正如你已经看到的,f-字符串是运行时渲染的表达式,而不是常量值。在运行时,大括号内的表达式将在其自己的作用域中进行求值,然后将其与其余字符串组合在一起。

现在你已经知道了为什么F字符串很好,我确定你想要出去并开始使用它们。当你冒险进入这个勇敢的新世界时,请记住一些细节。

引号

您可以在表达式中使用各种类型的引号。只要确保在表达式中使用的f-Strings外部没有使用相同类型的引号即可。
以下写法都是正确的:

f"{'Eric Idle'}"

# 运行结果:
'Eric Idle'

f'{"Eric Idle"}'

# 运行结果:
'Eric Idle'

f"""Eric Idle"""

# 运行结果:
'Eric Idle'

f'''Eric Idle'''

# 运行结果:
'Eric Idle'

f"The \"comedian\" is {name}, aged {age}."

# 运行结果:
'The "comedian" is Eric, aged 74.'

字典

说到引号,注意你在使用字典的时候。如果要为字典的键使用单引号,请记住确保对包含键的f字符串使用双引号。
以下代码是有效的:

comedian = {'name': 'Eric Idle', 'age': 74}
print(f"The comedian is {comedian['name']}, aged {comedian['age']}.")

# 运行结果:
'The comedian is Eric Idle, aged 74.'

但是,以下代码就是一个语法错误:

print(f'The comedian is {comedian['name']}, aged {comedian['age']}.')
-   File "<ipython-input-40-cd7d8a3db23b>", line 1
    f'The comedian is {comedian['name']}, aged {comedian['age']}.'
                                    ^
SyntaxError: invalid syntax

大括号

为了使字符串出现大括号,您必须使用双大括号:

print(f"{{74}}")

# 运行结果:
{74}

但是,如果使用三个以上的大括号,则可以获得更多大括号:

print(f"{{{{74}}}}")

# 运行结果:
{{74}}

反斜杠

正如您之前所看到的,您可以在f字符串的字符串部分使用反斜杠转义符。但是,您不能使用反斜杠在f字符串的表达式部分中进行转义:

print(f"{\"Eric Idle\"}")
-  File "<ipython-input-43-35cb9fe0ccc1>", line 1
    f"{\"Eric Idle\"}"
                      ^
SyntaxError: f-string expression part cannot include a backslash

lambda表达式

如果您需要使用lambda表达式,请记住,解析f-字符串的方式会稍微复杂一些。

如果!, :或}不在括号,大括号,括号或字符串中,则它将被解释为表达式的结尾。由于lambda使用:,这可能会导致一些问题:

f"{lambda x: x * 37 (2)}"
-  File "<fstring>", line 1
    (lambda x)
             ^
SyntaxError: unexpected EOF while parsing

您可以通过将您的lambda嵌套在圆括号中来解决此问题:

f"{(lambda x: x * 37) (2)}"

# 运行结果:
74

结束语

文章主要参考:http://www.mlln.cn/2018/05/19/python3 f-string格式化字符串的高级用法/