在之前的一篇文章中,我们介绍了Python中最经典的两种格式化方法,类C语言格式化和format方法格式化,文章链接是<<Python字符串格式化方法1>>,这两种格式化方法也是目前使用的比较多的两种,下面我们来介绍Python 3.6中引入的一种新格式化方法f-string格式化方法。
f-string格式化是从Python3.6引入的新格式化方法,这种新的格式化方法,支持的功能更为强大。官方的说法是,它不再是一个字符串,而是一个动态表达式。最终的字符串是从表达式的结果中得到的。官方推荐在3.6以后版本中使用这种形式的格式化方法,我们来看一下,它的功能强大在哪里。
我们来看一下这种f-string格式化的用法。还是老规矩,先看简单的基本用法,格式是:
f"{name} {age}"
F"{expression | function()}"
基本格式是,字符串前面加上f或F前缀,字符串里使用大括号来表明变量的位置,大括号内可以直接写以下类型:
常量,例如字符串、数字、列表、字典等基本数据结构
- 变量名
- 表达式
- 函数
我们来看一下基本格式的常用示例:
# 输出常量和变量
>>> name = 'afei'
>>> age = 30
>>> f"My name is {name}, age is {30}"
'My name is afei, age is 30'
>>> f"My name is {'afei'}, age is {age}"
'My name is afei, age is 30'
# 输出变量
>>> f"My name is {name}, age is {age}"
'My name is afei, age is 30'
# 输出表达式结果
>>> f"My name is {name}, next year my age is {age+1}"
'My name is afei, next year my age is 31'
>>> f"My title is {name+' coach'}, next year my age is {age+1}"
'My title is afei coach, next year my age is 31'
# 输出函数返回值
>>> def add(x,y):
... return x+y
...
>>> f"My title is {name+' coach'}, next year my age is {add(age, 1)}"
'My title is afei coach, next year my age is 31'
这里需要注意的问题是有以下几点:
- 在大括号中放入常量的时候,比如字符串,需要注意字符串的引号不要和格式化字符串的引号冲突,例如格式化字符串外面用的是双引号,那么内部使用单引号。外面使用单引号,内部使用双引号。内部同时存在单双引号时,外部使用三引号('''或""")
- 大括号内部不能使用转义字符,否则会报错。
- 因为大括号在格式化中有特殊含义,因此要在字符串中输出大括号的话,必须使用两个大括号
- 使用匿名函数的时候,需要将匿名函数用括号括起
看几个示例:
# 字符串引号的问题
>>> f'''{"I'm very happy your are interested in python"}'''
"I'm very happy your are interested in python"
# 转义字符问题,先在外面定义带转义字符的字符串,再格式化输出没有问题。
>>> str = 'I\'m happy your interested in python'
>>> str
"I'm happy your interested in python"
>>>
>>> f'''{str}'''
"I'm happy your interested in python"
# 直接在格式化字符串内部添加转义字符,会报错,会提示你不能包含转义字符
>>> f'''{'I\'m happy your interested in python'}'''
File "<stdin>", line 1
SyntaxError: f-string expression part cannot include a backslash
# 输出大括号
>>> f"I want to ouput braces {{}}"
'I want to ouput braces {}'
# 匿名函数
>>> f'Next year my age is {(lambda x: x+1)(age)}'
'Next year my age is 31'
和上面两种格式化方法一样,f-string格式化也提供高级用法,用于定制字符串的输出格式,高级用法的格式是:
{content:format}
这里的content就是上面说的,能够填入大括号内的内容,而format则是和上一篇文章里的format格式化方法里的类型一样,也就是说,你学会了format格式化,f-string格式化的高级用法你也会了。我们来看几个高级用法的示例,把上format格式化方法的示例改造成f-string格式化方法
# 演示conversion用法,-号填充,居中对齐,输出宽度20,
>>> class Demo:
... def __str__(self):
... return 'str format'
... def __repr__(self):
... return 'REPR FORMAT'
...
>>> demo = Demo()
# 对象str格式化
>>> f'{demo!s:-^20}'
'-----str format-----'
# 对象repr格式化
>>> f'{demo!r:-^20}'
'----REPR FORMAT-----'
# 左对齐
>>> f'{demo!s:-<20}'
'str format----------'
# 右对齐
>>> f'{demo!s:->20}'
'----------str format'
# 0填充
>>> f'{demo!s:0<20}'
'str format0000000000'
# 数字对齐,
>>> f'{-0.123!s:0<15}'
'-0.123000000000'
# 不再支持等号用于数字对齐,会直接报错,可能是觉得没什么意义。
>>> f'{-0.123!s:0=15}'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: '=' alignment not allowed in string format specifier
# 正负数符号示例,这个时候不要和对齐方式混用,会报错。
>>> f'{-0.123:-f}; {0.123:f}'
'-0.123000; 0.123000'
>>> f'{-0.123:-f}; {0.123:+f}'
'-0.123000; +0.123000'
>>> f'{-0.123:-f}; {0.123: f}'
'-0.123000; 0.123000'
# 逗号和下划线分隔符
>>> f'{1234.56789:<40,.5}'
'1,234.6 '
>>> f'{1234.56789:<40_.5}'
'1_234.6 '
# 有效数字位数
>>> f'{-0.123:.3f} {0.123:.4f}'
'-0.123 0.1230'
# 二进制、八进制和十六进制输出,不带#号
>>> f"{100} 的二进制值是{100:b}"
'100 的二进制值是1100100'
>>> f"{100} 的八进制值是{100:o}"
'100 的八进制值是144'
>>> f"{100} 的十六进制值是{100:x}"
'100 的十六进制值是64'
# 二进制、八进制和十六进制输出,带#号
>>> f"{100} 的二进制值是{100:#b}"
'100 的二进制值是0b1100100'
>>> f"{100} 的二进制值是{100:#o}"
'100 的二进制值是0o144'
>>> f"{100} 的二进制值是{100:#x}"
'100 的二进制值是0x64'
以上就是f-string格式化的高级用法
f-string支持直接输出datetime格式
除了上面讲到的能力,f-string还支持和datetime模块组合使用,datetime模块我们知道,是用来输出不同的时间格式的。它也提供了各种格式化字符,用于输出不同的日期格式,例如常用的:
- %Y 输出4位数的年份
- %m 输出2位数的月份
- %d 输出2位数的日期
当我们使用日期字符串的时候,一般都是先将datetime日期字符串格式拼出来,然后再和其他字符串组合。但是在上面我们讲到f-string是支持在字符串里面嵌入表达式的,而datetime的这些特殊符号,也可以视为表达式的一种,因此也可以直接嵌入到f-string字符串当中。直接动态输出不同格式的日期,我们看几个应用的示例
import datetime
birthday = datetime.datetime(1990, 8, 1)
# 标准输出格式
print(birthday)
1990-08-01 00:00:00
# 格式化后输出
print(f"{birthday:%Y-%m-%d}")
1990-08-01
# 带星期格式
print(f"{birthday:%Y-%m-%d, %A}")
1990-08-01, Wednesday
相比之前,先把日期格式定义好,再做字符串拼接或者嵌套的方式,这种格式化使用起来无疑更加灵活。小伙伴们不妨在自己的机器上尝试一下。以上就是f-string字符串格式化方法的内容。