当前位置: 首页 > news >正文

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

本文主要介绍python语言特性中关于字符串格式化的特性,f-string的特点、具体用法和注意事项

文章目录

  • 什么是f-string
  • f-string的各种用法
  • f-string的注意事项
  • f-string中为表达式内容指定格式
    • 指定内容长度和填充内容
    • 设置对齐方向

什么是f-string

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

name = "Aki"
string_1 = "My name is {0}. Again, My name is {0}".format(name)
string_2 = f"My name is {name}. Again, My name is {name}"
print(string_1 == string_2)
# 输出结果为: True

  • f-string中表达式的值是在运行时(at Run time)根据python全局内置方法format()的处理方式计算出来的。

f-string的各种用法

  • f-string本质是字符串,然后允许你在字符串中插入一些表达式(用花括号括起来),表达式包括单一的变量,运算式,变量的运算表达式,推导式等等。如下:
"""简单的变量"""
name = "Aki"
age = 18
basic_usage = f"My name is {name} and I'm {age}."

"""变量运算"""
age = 18
years = 3
content = f"I'm {age} this year. And {years} year(s) later, I would be {age + years} year-old."

"""直接放入推导式或者函数运算"""
string = "ABCD"
result = f"Convert string {string} as list: {list(string)}"
print(result)
# 输出结果: Convert string ABCD as list: ['A', 'B', 'C', 'D']

lst = ["A", "B", "C", "D"]
result = f"Convert list {lst} as string: {''.join(lst)}"
print(result)
# 输出结果: Convert list ['A', 'B', 'C', 'D'] as string: ABCD

numbers = list(range(1, 10)) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
result = f"All odd numbers: {[number for number in numbers if number % 2 == 0]}"
print(result)
# 输出结果: All odd numbers: [2, 4, 6, 8]

f-string的注意事项

  • f-string除了从可读性上更优之外,格式化字符串的效率是更高的,也就是说你的程度运行会更快。我们可以用如下代码测试运行速度:
import timeit

code_format_string_with_lazy_format = """
name = "Eric"
age = 74
'%s is %s.' % (name, age)
"""
code_format_string_with_str_format = """
name = "Eric"
age = 74
'{} is {}.'.format(name, age)
"""
code_format_string_with_f_string = """
name = "Eric"
age = 74
f'{name} is {age}.'
"""

test_times = 10000

print(f"""
Time cost of lazy format (%-format): {timeit.timeit(code_format_string_with_lazy_format, number=test_times)}
Time cost of str.format(): {timeit.timeit(code_format_string_with_str_format, number=test_times)}
Time cost of f-string: {timeit.timeit(code_format_string_with_f_string, number=test_times)}
""")
"""输出结果:
Time cost of lazy format (%-format): 0.002445499994792044
Time cost of str.format(): 0.004113400005735457
Time cost of f-string: 0.001851000008173287
"""
  • 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的花括号中,不能使用花括号创建字典或者使用字典推导式,如下:
"""无法识别字典"""
content = f"不能使用花括号创建字典: {{2: 2 * 2, 3: '3'}}"
print(content)
# 输出结果: 不能使用花括号创建字典: {2: 2 * 2, 3: '3'}

"""无法识别字典推导式"""
numbers_from_1_to_10 = range(1, 11)
content = f"字典推导式(dict comprehension): {{number: number * 2 for number in number}}"
print(content)
# 输出结果: 字典推导式(dict comprehension): {number: number * 2 for number in number}

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

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

指定内容长度和填充内容

number = 123
f"{number:4}"
number = 123
print(f"默认长度不足的位置用空格填充: {number:4}")
# 输出结果: 默认长度不足的位置用空格填充:  123

print(f"默认长度不足的位置用0填充: {number:04}")
# 输出结果: 默认长度不足的位置用0填充: 0123

设置对齐方向

number = 123
print(f"长度为20, 默认是高位填充(所以默认是左对齐): {number:20}")
print(f"长度为20, 左对齐: {number:>20}")
print(f"长度为20, 右对齐: {number:<20}")
print(f"长度为20, 居中对齐: {number:^20}")
"""输出结果:
长度为20, 默认是高位填充(所以默认是左对齐):                  123
长度为20, 左对齐:                  123
长度为20, 右对齐: 123                 
长度为20, 居中对齐:         123  
"""

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

"""
mysql数据: 
|name|age|job|
|Aki|18|programmer|
在shell中用select语句查询出来可以是如上形式也可以用`\G`参数显示成如下形式
************************ 1. row ***************************
           name: Aki
            age: 18
            job: programmer
****************************************************************
"""
record = {
    "name": "Aki",
    "age": 18,
    "job": "programmer",
}
print('*' * 64)
print("\n".join([f"{key: >20}: {value}" for key, value in record.items()]))
print('*' * 64)
"""输出结果:
****************************************************************
                name: Aki
                 age: 18
                 job: programmer
****************************************************************
"""

""""默认是空格填充, 我们也可以指定其他字符来填充前面的空格"""
record = {
    "name": "Aki",
    "age": 18,
    "job": "programmer",
}
print('*' * 64)
print("\n".join([f"{key:#>20}: {value}" for key, value in record.items()]))
print('*' * 64)
"""输出结果:
****************************************************************
################name: Aki
#################age: 18
#################job: programmer
****************************************************************
"""

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

好书推荐:

  • 流畅的python
  • Python编程 从入门到实践 第2版
  • Python数据结构与算法分析 第2版

好课推荐:

  • 零基础学python
  • python核心技术与实战
  • python自动化办公实战

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

相关文章:

  • 8. 好客租房-WebSocket与即时通讯系统[项目必需]
  • 机器学习04 决策树
  • java基础学习 day37 (集合)
  • Python闭包与闭包陷阱
  • 测试篇(三):测试用例的万能公式、对水杯和登录页面设计测试用例、测试用例的设计方法
  • 第十三届蓝桥杯省赛 Java A 组 I 题、Python A 组 I 题、Python B 组 J 题——最优清零方案(AC)
  • 阿里“云开发“小程序(uniCould)
  • 提权漏洞和域渗透历史漏洞整理
  • 传参的理解
  • 基于蜣螂算法的极限学习机(ELM)分类算法-附代码
  • 主流的操作系统(带你快速了解)
  • 六、numpy拷贝
  • STM32+python产生三角波
  • 【计算机网络(考研版)】第一站:计算机网络概述(一)
  • C++空间命名
  • 【5+】跨webview多页面 触发事件(二)
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Android 控件背景颜色处理
  • CSS居中完全指南——构建CSS居中决策树
  • Flannel解读
  • interface和setter,getter
  • javascript数组去重/查找/插入/删除
  • Java精华积累:初学者都应该搞懂的问题
  • JS 面试题总结
  • node入门
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Python利用正则抓取网页内容保存到本地
  • React-flux杂记
  • Webpack 4 学习01(基础配置)
  • 判断客户端类型,Android,iOS,PC
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 前嗅ForeSpider教程:创建模板
  • 什么是Javascript函数节流?
  • 使用 Docker 部署 Spring Boot项目
  • 数组的操作
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 关于Android全面屏虚拟导航栏的适配总结
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • # 透过事物看本质的能力怎么培养?
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #Linux(权限管理)
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (windows2012共享文件夹和防火墙设置
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (免费分享)基于springboot,vue疗养中心管理系统
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET 解决重复提交问题