详解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中使用base64模块处理字符编码的教程
Apr 28 Python
python通过openpyxl生成Excel文件的方法
May 12 Python
python开发之函数定义实例分析
Nov 12 Python
浅析Python中else语句块的使用技巧
Jun 16 Python
基于python socketserver框架全面解析
Sep 21 Python
用python实现的线程池实例代码
Jan 06 Python
python使用__slots__让你的代码更加节省内存
Sep 05 Python
python绘图模块matplotlib示例详解
Jul 26 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
Aug 06 Python
使用pyqt 实现重复打开多个相同界面
Dec 13 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
Jun 17 Python
Python常用数字处理基本操作汇总
Sep 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
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
php字符串截取函数用法分析
2014/11/25 PHP
PHP stream_context_create()函数的使用示例
2015/05/12 PHP
PHP实现连接设备、通讯和发送命令的方法
2015/10/13 PHP
jQuery 联动日历实现代码
2012/05/31 Javascript
jquery.form.js用法之清空form的方法
2014/03/07 Javascript
Nodejs全栈框架StrongLoop推荐
2014/11/09 NodeJs
再谈Javascript中的基本类型和引用类型(推荐)
2016/07/01 Javascript
jQuery如何解决IE输入框不能输入的问题
2016/10/08 Javascript
Vue制作Todo List网页
2017/04/26 Javascript
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
2017/10/26 Javascript
Vue封装的组件全局注册并引用
2019/07/24 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
2019/09/17 Javascript
Selenium执行Javascript脚本参数及返回值过程详解
2020/04/01 Javascript
JavaScript设计模式之策略模式实现原理详解
2020/05/29 Javascript
Vue中正确使用Element-UI组件的方法实例
2020/10/13 Javascript
微信小程序自定义tabBar的踩坑实践记录
2020/11/06 Javascript
python生成器generator用法实例分析
2015/06/04 Python
python中urlparse模块介绍与使用示例
2017/11/19 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
2018/08/16 Python
在python里从协程返回一个值的示例
2019/02/19 Python
详解Django+uwsgi+Nginx上线最佳实战
2019/03/14 Python
python装饰器的特性原理详解
2019/12/25 Python
python的sys.path模块路径添加方式
2020/03/09 Python
python能做哪些生活有趣的事情
2020/09/09 Python
Move Free官方海外旗舰店:美国骨关节健康专业品牌
2017/12/06 全球购物
FLIR美国官网:热成像, 夜视和红外摄像系统
2018/07/13 全球购物
Java的for语句中break, continue和return的区别
2013/12/19 面试题
学生自我评价范文
2014/02/02 职场文书
《我的第一本书》教学反思
2014/02/15 职场文书
基层党员公开承诺书
2014/05/29 职场文书
会计试用期工作总结2015
2015/05/28 职场文书
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
2021/03/31 Servers
python 实现德洛内三角剖分的操作
2021/04/22 Python
Python语言中的数据类型-序列
2022/02/24 Python
JS实现简单九宫格抽奖
2022/06/28 Javascript