本文为译文,原文 by Joanna Jablonski,地址:https://realpython.com/python-f-strings/

Python 3.6 引入了新的字符串格式化方式 f-strings,与其它格式化方式相比,不仅简洁明了,可读性更好,更不容易出错,而且运行效率也更高。

你应该马上开始使用这种新的格式化方式,本文将解释其原因与具体用法。

但在此之前,让我们先看一下 f-strings 之前的字符串格式化方式。


1. Python 字符串格式化的“旧式”做法

在 Python 3.6 之前,把 Python 表达式嵌入字符串,主要有两种方式:% 或 str.format()。它们的用法与主要不足如下:

1.1 选项1:使用 %

这是最原始的、 Python 官方指南所用的格式化方式,相关信息可以阅读官方文档。

值得注意的是,官方文档其实并不推荐使用这种方式,相关说明如下:

“此处描述的格式化操作存在一些奇怪之处,容易导致一些常见错误(比如无法正确格式化元组与字典等)。

使用新的格式化方式或str.format()函数可以避免这些错误。这些格式化方式不仅更强大,而且更灵活,更易于扩展。(来源)

如何使用 % 进行格式化

字符串对象有一个内建操作符%,可以用于格式化操作,具体用法如下:

>>> name = "Eric" >>> "Hello, %s." % name 'Hello, Eric.'

如果要在字符串中嵌入多个变量,则必须使用元组,例如:

>>> name = "Eric">>> age = 74 >>> "Hello, %s. You are %s." % (name, age) 'Hello Eric. You are 74.'


% 格式化的问题

上面的代码看起来还不错,但如果在更长的字符串中嵌入更多变量,代码的可读性就会成为一个问题:

>>> 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.'

因此,这种格式化方式的主要问题是过于繁琐,容易出错,不能正确格式化元组与字典。


1.2 选项2:str.format()

这种方式是在 Python 2.6 引入的,可以在 官方文档 找到相关介绍。

str.format() 的用法

str.format()方式是对 % 方式的一次改进。用户可以通过修改对象的 __format__() 方法来自定义 格式化方式 。

通过大括号,我们可以在字符串中嵌入变量:

>>> "Hello, {}. You are {}.".format(name, age) 'Hello, Eric. You are 74.'

也可以指定变量的引用顺序:

>>> "Hello, {1}. You are {0}.".format(age, name) 'Hello, Eric. You are 74.'

或者直接使用变量名称:

>>> person = {'name': 'Eric', 'age': 74} >>> "Hello, {name}. You are {age}.".format(name=person['name'], age=person['age']) 'Hello, Eric. You are 74.'

在引用字典时,可以用**操作符进行字典拆包:

>>> person = {'name': 'Eric', 'age': 74} >>> "Hello, {name}. You are {age}.".format(**person) 'Hello, Eric. You are 74.'

总的来说,str.format()是 % 格式化方式的一次升级,但依然存在一些问题。

str.format() 的问题

和 % 方式相比,使用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.'

当然,如果我们提前把需要嵌入的变量放在一个字典中,就可以通过 ** 进行拆包操作,从而显得简洁一些。

但一定还存在着更好的格式化方式。


2. f-Strings:一种改进版格式化方式

Python 3.6 引入了新的字符串格式化方式,这种方式来自于 Eric V. Smith 在 2015 年 8 月提出的方案,具体可以参考PEP 498。

f-strings 也称作“格式化的字符串字面量”,它是一个带有 f 前缀的字符串,通过大括号嵌入所需的 Python 表达式,这些表达式的具体值是在运行时确定的,背后依赖的也是嵌入对象的 __format()__ 接口。查看 官方文档 可以获得更多信息。

以下是一些具体使用方式:

2.1 最简单的句法

f-strings 的句法类似于str.format(),但要更简洁,你可以感受一下它的可读性:

>>> name = "Eric" >>> age = 74 >>> f"Hello, {name}. You are {age}." 'Hello, Eric. You are 74.'

前缀f也可以使用大写的F。

>>> F"Hello, {name}. You are {age}." 'Hello, Eric. You are 74.'

你是不是已经开始喜欢上这种格式化方式了?

2.2 支持任意表达式

由于 f-strings 是在运行时计算具体值的,我们得以在字符串中嵌入任意有效的 Python 表达式,从而写出更优雅的代码。

你可以使用很直接的计算式,比如说:

>>> f"{2 * 37}" '74'

也可以在里面调用函数:

>>> def to_lowercase(input):  ... return input.lower() >>> name = "Eric Idle" >>> f"{to_lowercase(name)} is funny." 'eric idle is funny.'

或者直接调用对象的方法:

>>> f"{name.lower()} is funny." 'eric idle is funny.'

甚至可以在对象的字符串方法中直接使用 f-strings,例如有以下类:

class Comedian:  def __init__(self, first_name, last_name, age):  self.first_name = first_name  self.last_name = last_name  self.age = age  def __str__(self):  return f"{self.first_name} {self.last_name} is {self.age}."  def __repr__(self):  return f"{self.first_name} {self.last_name} is {self.age}. Surprise!"

你可以有如下代码:

>>> new_comedian = Comedian("Eric

python格式化字符串_Python字符串格式化问题:%、format()与f-strings相关推荐

  1. python输出举例_python字符串格式化输出及相关操作代码举例

    字符串的格式化 Python 支持格式化字符串的输出 .尽管这样可能会用到非常复杂的表达式,但最基本的用法是将一个值插入到一个有字符串格式符 %s 的字符串中.在   Python 中,字符串格式化使 ...

  2. python整数格式化表达式_Python字符串格式化表达式和格式化方法

    Python格式化字符串由两种方式可以选择:一种是格式化表达式(Formatting Expression),一种是格式化方法(Formatting Method).其中格式化表达式在全Python版 ...

  3. python123格式化输出_python 字符串格式化输出 %d,%s及 format函数

    旧式格式化方式:%s,%d 1.顺序填入格式化内容 s = "hello %s, hello %d"%("world", 100) print(s) 结果: ' ...

  4. python 三引号_Python 字符串

    字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可.例如: var1 = 'Hello World!' var2 ...

  5. python编写程序接收字符串_Python字符串操作

    a = 'Hello' b = 'Python' 一.字符串运算符 1.字符串连接(+) '字符串1' + '字符串2' >>>print(a + b) HelloPython 2. ...

  6. python横向输出字符串_Python字符串及用法详解

    字符串是由数字.字母.下画线组成的一串字符,在编程语言中表示文本的数据类型.在 Python 2.X 中,普通字符串是以 8 位 ASCII 码进行存储的,而 Unicode 字符串则以 16 位 U ...

  7. python 输入字符串_python字符串及字符串操作

    字符串介绍 1.字符串在内存中的存储: 2.字符串相加: 3.字符串的格式化: In [1]: a = 100In [2]: a Out[2]: 100 #100<255,在堆内存下占用了一个字 ...

  8. python怎么显示字符串_python字符串

    Python 字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可.例如: var1 ='Hello Wo ...

  9. 以30字符宽居中输出python字符串_Python 字符串

    字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可.例如: var1 = 'Hello World!'var2= ...

  10. python循环拼接字符串_Python字符串拼接

    问题描述 在解析文件的时候,需要将解析出来的数据字符串拼接成新的字符串.正常来说这个,过程是一个循环,不断拼接字符串.如果这个过程循环的次数不多的话,不同的方式拼接方式差别不大.如果循环次数超过100 ...

最新文章

  1. 揭开「拓扑排序」的神秘面纱
  2. 整数二分查找原理及代码模板
  3. OU/Group/Group Policy组织单元、组和组策略
  4. java垃圾回收根对象_Java垃圾回收怎么理解?
  5. 关于LBS坐标系与精度的问题
  6. electron 屏幕标注_屏幕 | screen (screen) – Electron 中文开发手册
  7. 西澳大学商科专业排名_澳洲西澳大学优势专业排名多少
  8. php 重新编译_linux下为php添加GD库(重新编译php)
  9. 玩具谜题(洛谷-P1563)
  10. 孙宇java_[JAVA] 孙宇老师Struts2+Hibernate4+Maven+EasyUI+SpringMvc+Spring+Mybatis+Maven整合课程...
  11. java工商银行项目_ChaosBlade 在工商银行混沌工程体系中的应用实践
  12. b超可以看出什么_B超什么时候可以看到孕囊?
  13. 那些不能遗忘的知识点回顾——操作系统系列(笔试面试高频题)
  14. Android 属性动画(三)
  15. html5按钮组水平均分,ichart.js绘制虚线、平均分虚线效果的实现代码_javascript技巧...
  16. 菩提心的修法-四无量心的具体修法
  17. Print Conductor批量打印工具,Print Conductor|Crack版
  18. 我国无线2.4g及5g信道-个人笔记
  19. TX-LCN分布式事务
  20. 电脑专业英语1695词

热门文章

  1. java中 String StringBuffer StringBuilder的区别
  2. 【mongodb系统学习之十】mongodb查询(二)
  3. C++数据类型基础知识
  4. 搜索结果红色php,.NET_asp.net搜索匹配关键字为红色显示的代码,首先创建类库 Model (业务实体 - phpStudy...
  5. CSS基础汇总——点击标题跳转详细博客【学习笔记】
  6. 剑指offer面试题[54]-表示数值的字符串
  7. C++栈与队列基本操作
  8. 插件properties_PageHelper分页插件的原理是什么
  9. 当你学会这项python数据提取神器时,请做好升职准备!
  10. 大学计算机应用基础模拟试题,《大学计算机应用基础》模拟试题.doc