「python|语言特性」为什么f-string是python中最舒适的字符串格式化方式

Table of Contents

什么是f-string

  • f-stringpython3.6版本引入的语言特性。
  • f-string指的是带有一个f前缀的python字符串,我们在python字符串的文章中介绍了python的字符串可以是由单引号、双引号、三引号来标志。所以f-string可以是如下形式:
1""" 2以下三种都是f-string 3""" 4f'这是一个f-string' 5f"这也是一个f-string" 6f"""这还是一个f-string"""
  • f-string与字符串的内置方法str.format()一样,可以放入各种表达式,用一对花括号包裹表达式。重点在于,我们使用str.format()时还要将变量和表达式位置一一对应,f-string直接写入表达式,省去了一一对应的麻烦和可能带来的对应错误。如下:
1""" 2以下是str.format()和f-string的等价表示 3""" 4name = "Aki" 5string_1 = "My name is {}".format(name) 6string_2 = f"My name is {name}" 7print(string_1 == string_2) 8# 输出结果为: True 9 10name = "Aki" 11string_1 = "My name is {0}. Again, My name is {0}".format(name) 12string_2 = f"My name is {name}. Again, My name is {name}" 13print(string_1 == string_2) 14# 输出结果为: True 15
  • f-string中表达式的值是在运行时(at Run time)根据python全局内置方法format()处理方式计算出来的。

f-string的各种用法

  • f-string本质是字符串,然后允许你在字符串中插入一些表达式(用花括号括起来),表达式包括单一的变量,运算式,变量的运算表达式,推导式等等。如下:
1"""简单的变量""" 2name = "Aki" 3age = 18 4basic_usage = f"My name is {name} and I'm {age}." 5 6"""变量运算""" 7age = 18 8years = 3 9content = f"I'm {age} this year. And {years} year(s) later, I would be {age + years} year-old." 10 11"""直接放入推导式或者函数运算""" 12string = "ABCD" 13result = f"Convert string {string} as list: {list(string)}" 14print(result) 15# 输出结果: Convert string ABCD as list: ['A', 'B', 'C', 'D'] 16 17lst = ["A", "B", "C", "D"] 18result = f"Convert list {lst} as string: {''.join(lst)}" 19print(result) 20# 输出结果: Convert list ['A', 'B', 'C', 'D'] as string: ABCD 21 22numbers = list(range(1, 10)) # [1, 2, 3, 4, 5, 6, 7, 8, 9] 23result = f"All odd numbers: {[number for number in numbers if number % 2 == 0]}" 24print(result) 25# 输出结果: All odd numbers: [2, 4, 6, 8]

f-string的注意事项

  • f-string除了从可读性上更优之外,格式化字符串的效率是更高的,也就是说你的程度运行会更快。我们可以用如下代码测试运行速度:
1import timeit 2 3code_format_string_with_lazy_format = """ 4name = "Eric" 5age = 74 6'%s is %s.' % (name, age) 7""" 8code_format_string_with_str_format = """ 9name = "Eric" 10age = 74 11'{} is {}.'.format(name, age) 12""" 13code_format_string_with_f_string = """ 14name = "Eric" 15age = 74 16f'{name} is {age}.' 17""" 18 19test_times = 10000 20 21print(f""" 22Time cost of lazy format (%-format): {timeit.timeit(code_format_string_with_lazy_format, number=test_times)} 23Time cost of str.format(): {timeit.timeit(code_format_string_with_str_format, number=test_times)} 24Time cost of f-string: {timeit.timeit(code_format_string_with_f_string, number=test_times)} 25""") 26"""输出结果: 27Time cost of lazy format (%-format): 0.002445499994792044 28Time cost of str.format(): 0.004113400005735457 29Time cost of f-string: 0.001851000008173287 30"""
  • f-string本质是字符串,所以字符串内容中如果出现跟字符串外部的引号相同类型的引号,则需要进行转义。比如example = f'I\'m {18}'
  • 表达式中不能用转义符\
    • 所以转义字符都不能在表达式中出现,比如常用的换行符就不能写成content = f"{'\n'.join([1, 2, 3, 4])}",会抛出SyntaxError: f-string expression part cannot include a backslash的异常。
    • 但是花括号之外的地方可以用转义字符,比如content = f"first line\n{1234}\n{'third line'}\n{'last line'}"是符合语法规则的。
  • f-string的花括号中,不能使用花括号创建字典或者使用字典推导式,如下:
1"""无法识别字典""" 2content = f"不能使用花括号创建字典: {{2: 2 * 2, 3: '3'}}" 3print(content) 4# 输出结果: 不能使用花括号创建字典: {2: 2 * 2, 3: '3'} 5 6"""无法识别字典推导式""" 7numbers_from_1_to_10 = range(1, 11) 8content = f"字典推导式(dict comprehension): {{number: number * 2 for number in number}}" 9print(content) 10# 输出结果: 字典推导式(dict comprehension): {number: number * 2 for number in number}

f-string中为表达式内容指定格式

这里补充说明如何在f-string中完成低位数高位补0,比如'1'变成'01'之类的格式化处理。

指定内容长度和填充内容

1number = 123 2f"{number:4}" 3number = 123 4print(f"默认长度不足的位置用空格填充: {number:4}") 5# 输出结果: 默认长度不足的位置用空格填充: 123 6 7print(f"默认长度不足的位置用0填充: {number:04}") 8# 输出结果: 默认长度不足的位置用0填充: 0123

设置对齐方向

1number = 123 2print(f"长度为20, 默认是高位填充(所以默认是左对齐): {number:20}") 3print(f"长度为20, 左对齐: {number:>20}") 4print(f"长度为20, 右对齐: {number:<20}") 5print(f"长度为20, 居中对齐: {number:^20}") 6"""输出结果: 7长度为20, 默认是高位填充(所以默认是左对齐): 123 8长度为20, 左对齐: 123 9长度为20, 右对齐: 123 10长度为20, 居中对齐: 123 11"""

比如我们要模拟mysql的shell交互中的对齐格式, 则可以有如下写法:

1""" 2mysql数据: 3|name|age|job| 4|Aki|18|programmer| 5在shell中用select语句查询出来可以是如上形式也可以用`\G`参数显示成如下形式 6************************ 1. row *************************** 7 name: Aki 8 age: 18 9 job: programmer 10**************************************************************** 11""" 12record = { 13 "name": "Aki", 14 "age": 18, 15 "job": "programmer", 16} 17print('*' * 64) 18print("\n".join([f"{key: >20}: {value}" for key, value in record.items()])) 19print('*' * 64) 20"""输出结果: 21**************************************************************** 22 name: Aki 23 age: 18 24 job: programmer 25**************************************************************** 26""" 27 28""""默认是空格填充, 我们也可以指定其他字符来填充前面的空格""" 29record = { 30 "name": "Aki", 31 "age": 18, 32 "job": "programmer", 33} 34print('*' * 64) 35print("\n".join([f"{key:#>20}: {value}" for key, value in record.items()])) 36print('*' * 64) 37"""输出结果: 38**************************************************************** 39################name: Aki 40#################age: 18 41#################job: programmer 42**************************************************************** 43"""

以上就是f-string的主要内容,快快用起来吧!

好书推荐:

好课推荐:

写文不易,如果对你有帮助的话,来一波点赞、收藏、关注吧~👇

Mastodon