Python格式化字符串f-string的使用教程
作者:古明地觉 发布时间:2023-10-07 22:33:29
标签:Python,格式化,字符串,f-string
楔子
在 Python3.6 之前,格式化字符串一般会使用百分号占位符或者 format 函数,举个例子:
name = "古明地觉"
address = "地灵殿"
# 使用百分号占位符格式化字符串
print(
"我是 %s, 来自 %s" % (name, address)
) # 我是 古明地觉, 来自 地灵殿
# 使用format函数格式化字符串
print(
"我是 {}, 来自 {}".format(name, address)
) # 我是 古明地觉, 来自 地灵殿
# format 函数还支持关键字参数
print(
"我是 {name}, 来自 {address}".format(
address=address, name=name)
) # 我是 古明地觉, 来自 地灵殿
但是从 3.6 开始,Python 新增了一个格式化字符串的方法,称之为 f-string。f-string 的功能非常强大,可以说是一把 "瑞士军刀"。
name = "古明地觉"
address = "地灵殿"
print(
f"我是 {name}, 来自 {address}"
) # 我是 古明地觉, 来自 地灵殿
使用 f-string 需要给字符串增加一个前缀 f,此时 {} 和它里面的内容则不再表示字符串,而是整体作为一个需要单独计算的值或者表达式、或者变量。我们再举个例子:
print(f"1 + 1 = {1 + 1}") # 1 + 1 = 2
print(
f"sum([1, 2, 3]) = {sum([1, 2, 3])}"
) # sum([1, 2, 3]) = 6
print(
f"{'--'.join(['a', 'b', 'c', 'd'])}"
) # a--b--c--d
try:
print(f"{a}")
except Exception as e:
print(e) # name 'a' is not defined
# 在f-string中,{} 里面的内容是需要单独计算的
# 可以是常量,比如 {123}、{'hello'} 等等
# 可以是表达式,比如 {1 + 1}、{2 > 1} 等等
# 可以是变量,比如 {a}、{name},但是变量要定义好
# 而我们上面的 a 没有定义,所以报错
# 或者定义一个变量
a = lambda x: x + 100
print(f"{a}") # <function <lambda> at 0x000...>
print(f"{a(1)}") # 101
我们看到 f-string 还是很方便的,并且和 format 功能类似,但是性能要优于 format 函数。
当然 f-string 的功能远没有我们介绍的这么简单,它支持的操作非常多,下面就来逐一介绍。
实现 repr 打印
有时候我们在打印的时候需要带上引号。
name = "古明地觉"
print(name) # 古明地觉
print("%s" % name) # 古明地觉
# 如果使用 %r 打印,会带上单引号
print("%r" % name) # '古明地觉'
# 上面类似于 str 和 repr 的区别
print(str(name)) # 古明地觉
print(repr(name)) # '古明地觉'
# 等价于调用 __str__ 和 __repr__
print(name.__str__()) # 古明地觉
print(name.__repr__()) # '古明地觉'
当我们在交互式环境下,不使用 print,而是直接输入变量 name、然后回车,那么会调用 __repr__ 方法。如果使用 print(name),那么不管在什么环境,都会调用 __str__ 方法。
那么在字符串周围带上一层单引号,有什么意义呢?
birthday = "1995-07-05"
print("select name from where birthday > %s" % birthday)
print("select name from where birthday > %r" % birthday)
"""
select name from where birthday > 1995-07-05
select name from where birthday > '1995-07-05'
"""
看到区别了吗?如果是第一个查询,那么肯定是会报错的。重点来了,如何通过 f-string 实现这种效果呢?
birthday = "1995-07-05"
# 我们只需要在打印的内容后面加上一个!r即可
print(f"{birthday!r}") # '1995-07-05'
print(f"{birthday}") # 1995-07-05
# "{name}" <==> str(name) <==> name.__str__()
# "{name!r}" <==> repr(name) <==> name.__repr__()
print(f"{'.'.join(['a', 'b', 'c'])}") # a.b.c
print(f"{'.'.join(['a', 'b', 'c'])!r}") # 'a.b.c'
# 注意:!r针对的是字符串
# 虽然也可以作用于其它对象,不过没有效果
print(f"{123!r}") # 123
print(f"{3.14!r}") # 3.14
# 另外除了 !r,还有 !s 和 !a,只有这三种
# !a 和 !r 类似,!s是默认选择、加不加均可
print(f"{birthday}") # 1995-07-05
print(f"{birthday!s}") # 1995-07-05
print(f"{birthday!a}") # '1995-07-05'
print(f"{birthday!r}") # '1995-07-05'
来源:https://mp.weixin.qq.com/s/sMzBWW8ba61G5axOlWvfjw


猜你喜欢
- 运行效果:完整代码from tkinter import *def click(num): global op op
- 当我们写用例断言时,往往一个断言结果是不够的,所以需要加入多重断言,而多重断言,当断言中间出现断言结果False时,会中断后续的断言执行,会
- ps:不曾想还有那么好用的方法。汗一个先。Div即父容器不根据内容自适应高度,我们看下面的代码:<div id="main&
- 一般我们安装Python的第三方包都会在终端执行下列命令进行安装:pip install 要安装的包名安装成功后发现在PyCharm中仍然存
- 一、序言本文承接[Mybatis缓存体系探究],提供基于MybatisPlus技术可用于生产环境下的二级缓存解决方案。1、前置条件掌握MyB
- 创建表时创建外键创建两个表格,一个名为class,create table classes(id int not null primary
- 郁闷的事来了,先看前台HTML: 购买数量: <input id="txtNum" type="text
- 迷宫问题问题描述:迷宫可用方阵 [m, n] 表示,0 表示可通过,1 表示不能通过。若要求左上角 (0, 0) 进入,设计算法寻求一条能从
- 我们在进行表单设计时,可能要用到select下拉选项控件,遗憾的是,IE浏览器默认的select控件外观非常丑陋,而且不能用样式来控制,不能
- 学习python编程,首先要配置好环境变量。本文主要讲解python的环境变量配置,在不同版本下如何安装Windows打开Python官方下
- 本文实例讲述了JavaScript简单获取页面图片原始尺寸的方法。分享给大家供大家参考,具体如下:这里通过Image()对象获取原始宽高这种
- 本文实例讲述了Python批量重命名同一文件夹下文件的方法。分享给大家供大家参考。具体分析如下:朋友发了一个文件夹过来,里面的图片都以 .t
- 前言摘要之前写了一篇 grpool goroutine池详解 | 协程管理 收到了大家积极的反馈,今天这篇来做一下grpool的性能测试分析
- 一.多表关系MySQL多表之间的关系可以概括为:一对一、一对多/多对一关系,多对多一对一关系一个学生只有一张身份证;一张身份证只能对应一学生
- 本文将讨论Python中下划线(_)字符的使用方法。我们将会看到,正如Python中的很多事情,下划线的不同用法大多数(并非所有)只是常用惯
- 本文实例讲述了js正则匹配中文标点符号的方法。分享给大家供大家参考,具体如下:运行效果截图如下:具体代码如下:<html><
- 本文实例展示了Python Tkinter实现简单布局的方法,示例中备有较为详尽的注释,便于读者理解。分享给大家供大家参考之用。具体如下:#
- 举例如下: 数据表为DemoTable,字段有id, condition1,condition2,condition3,condition4
- PyQt5简介1.什么是GUI:Graphical User Interface,图形用户界面,用于人机交互。2.怎么设计GUI:Qt3.什
- 阿里云服务器的带宽为2M,网站每日的备份包都3G多了,离线下载太费时间了,打算每日将备份包自动上传到自己的百度云盘里。 1、先安装