Python格式化输出


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格式化字符串的高级用法/

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页