详解Python3 中的字符串格式化语法


Posted in Python onJanuary 15, 2020

一、旧式的字符串格式化

% 操作符

参考以下示例:

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

str.format()

str.format() 是对 % 方式的改进,它使用常见的函数调用的语法,并且可以通过定义对象本身的 __format__() 方法控制字符串格式化的具体行为。

基本用法:

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

str.format() 相对于 % 操作符有着更强的灵活性。比如可以通过数字索引来关联替换到字符串中的变量:

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

为了提高代码可读性, {} 中也可以使用有具体含义的参数名:

>>> name = "Eric"
>>> age = 74
>>> "Hello, {name}. You are {age}".format(name=name, age=age)
'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() 方式依然会导致代码变得过于冗长:

>>> first_name = "Eric"
>>> last_name = "Idle"
>>> age = 74
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> "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.'

二、f-string

基本用法

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

嵌入表达式

>>> 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-string 中还可以直接嵌入某个对象实例,只要其内部实现了 __str__ 或者 __repr__ 方法:

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}"


new_comedian = Comedian("Eric", "Idle", 74)
print(f"{new_comedian}")
# Eric Idle is 74
多行 f-string
>>> name = "Eric"
>>> profession = "comedian"
>>> affiliation = "Monty Python"
>>> message = (
...  f"Hi {name}. "
...  f"You are a {profession}. "
...  f"You were in {affiliation}."
... )
>>> message
'Hi Eric. You are a comedian. You were in Monty Python.'

总结

以上所述是小编给大家介绍的Python3 中的字符串格式化语法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python杀死一个线程的方法
Sep 06 Python
利用python打印出菱形、三角形以及矩形的方法实例
Aug 08 Python
Python实现KNN邻近算法
Jan 28 Python
python+opencv实现动态物体识别
Jan 09 Python
快速了解Python相对导入
Jan 12 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
Jun 14 Python
Django 导出项目依赖库到 requirements.txt过程解析
Aug 23 Python
使用Python完成15位18位身份证的互转功能
Nov 06 Python
python编程简单几行代码实现视频转换Gif示例
Oct 05 Python
python编程实现清理微信重复缓存文件
Nov 01 Python
Python实现猜拳与猜数字游戏的方法详解
Apr 06 Python
python基础之//、/与%的区别详解
Jun 10 Python
用pytorch的nn.Module构造简单全链接层实例
Jan 14 #Python
pytorch三层全连接层实现手写字母识别方式
Jan 14 #Python
Python实现bilibili时间长度查询的示例代码
Jan 14 #Python
基于python监控程序是否关闭
Jan 14 #Python
关于pytorch中全连接神经网络搭建两种模式详解
Jan 14 #Python
使用Pytorch来拟合函数方式
Jan 14 #Python
pytorch 模拟关系拟合——回归实例
Jan 14 #Python
You might like
蝙蝠侠:侠影之谜
2020/03/04 欧美动漫
不错的一篇面向对象的PHP开发模式(简写版)
2007/03/15 PHP
PHP遍历数组的方法汇总
2015/04/30 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
PHP实现的多进程控制demo示例
2019/07/22 PHP
laravel框架实现去掉URL中index.php的方法
2019/10/12 PHP
理解 JavaScript 预解析
2009/10/25 Javascript
innerhtml用法 innertext用法 以及innerHTML与innertext的区别
2009/10/26 Javascript
利用js实现禁止复制文本信息
2015/06/03 Javascript
jQuery实现动画效果circle实例
2015/08/06 Javascript
Jquery实现顶部弹出框特效
2015/08/08 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
2016/06/21 Javascript
Bootstrap实现的表格合并单元格示例
2018/02/06 Javascript
详解如何在你的Vue项目配置vux
2018/06/04 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
vue 的 solt 子组件过滤过程解析
2019/09/07 Javascript
python中反射用法实例
2015/03/27 Python
Python实现简单的文件传输与MySQL备份的脚本分享
2016/01/03 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
python构建自定义回调函数详解
2017/06/20 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
2017/09/25 Python
解决Python2.7中IDLE启动没有反应的问题
2018/11/30 Python
python+opencv像素的加减和加权操作的实现
2019/07/14 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
2019/12/04 Python
深入浅析Python 命令行模块 Click
2020/03/11 Python
Django实现图片上传功能步骤解析
2020/04/22 Python
函授毕业生自我鉴定
2013/11/06 职场文书
消防安全汇报材料
2014/02/08 职场文书
《陶罐和铁罐》教学反思
2014/02/19 职场文书
学习“七一”讲话精神体会
2014/07/08 职场文书
环境卫生工作汇报材料
2014/10/28 职场文书
幼儿园个人总结
2015/02/28 职场文书
小学英语新课改心得体会
2016/01/22 职场文书
2016年质量月活动总结报告
2016/04/05 职场文书
 Redis 串行生成顺序编码的方法实现
2022/04/03 Redis
AndroidStudio图片压缩工具ImgCompressPlugin使用实例
2022/08/05 Java/Android