Python3中的f-Strings增强版字符串格式化方法
作者:neweastsun 发布时间:2022-07-07 12:34:36
在Python3.6提供f-Strings新的字符串格式化语法。不仅更加可读、简洁,相比其他方式也不易造成错误,而且还更快。
看完本文你将学习到如何以及为什么使用f-strings。正式开始之前,我们先看看之前格式化字符串语法。
1. 旧式字符串格式化
在Python3.6之前,主要有两种方式格式化字符串:%-格式化 和 str.format()。下面我们先了解它们的用法以及局限性。
1.1 %-格式化
这时Python的官方字符串格式化方法,从语言开始时就存在。官方文档明确提出不建议使用,并其他使用其他方式代替避免不必要的错误。
String对象内置了%操作,用于格式化字符串,请看示例:
>>> name = "Eric"
>>> "Hello, %s." % name
'Hello, Eric.'
如果需要插入多个变量,则需要使用元祖:
>>> name = "Eric"
>>> age = 74
>>> "Hello, %s. You are %s." % (name, age)
'Hello Eric. You are 74.'
上面两个实例还比较好理解,但当使用多个参数,字符串变得很长时,可读性会下降;因为冗长易导致错误,故不建议使用。
1.2. 使用 str.format()方法
这种较新的方式是Python2.6版本提供的。是%格式化的升级方式。使用正常的方法调用实现字符串转换。其内部通过类的__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方式对%格式化进行了有限的升级,但仍不是最好的。当传入多个参数时,还是很冗余且易错。如果字典值传递给.format()变量,可以用.format(**some_dict)对其解包,并使用键索引对应值,但是有更好的办法进行处理。
2. 增强版字符串格式化方式 f-Strings
f-Strings可以解决上述问题,而且容易使用且十分有效。2015年8月在Python3.6版中提供。
也称为格式化字符串自变量,f开头的字符串中花括号括起来的变量会被替换。该表达式在运行时被评估并使用__format__方法进行格式化。下面看一些示例:
>>> name = "Eric"
>>> age = 74
>>> f"Hello, {name}. You are {age}."
'Hello, Eric. You are 74.'
与str.format()方法类似但更简洁。使用大写字符F也行:
>>> F"Hello, {name}. You are {age}."
'Hello, Eric. You are 74.'
2.1. 格式化任意表达式
因为f-string是在运行时评估,因此可以放入任何有效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.'
当然也可以是自定义类。假设我们定义下面类:
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", "Idle", "74")
>>> f"{new_comedian}"
'Eric Idle is 74.'
str() 和 repr() 方法用于实现以字符串形式表示对象。所以类定义时确保至少包括它们中的一个。如果需要挑选一个,则为 repr(),因为在使用__str__()的地方都可以使用__repr__()。
由__str__()返回的字符串是对象的非正式字符串表示,应该是可读的。由__repr__()返回的字符串是官方表示,应该是明确的(外层多了引号,长度是原来长度+2)。直接调用str()和repr()比直接使用_str__()和_repr__()要好。
缺省情况下使用str函数,但可以使用!r标识明确调用repr:
>>> f"{new_comedian}"
'Eric Idle is 74.'
>>> f"{new_comedian!r}"
'Eric Idle is 74. Surprise!'
2.2. 多行f-strings
我们可以格式化多行字符串:
>>> 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.'
但需要在每行前面增加f。下面代码不工作:
>>> message = (
... f"Hi {name}. "
... "You are a {profession}. "
... "You were in {affiliation}."
... )
>>> message
'Hi Eric. You are a {profession}. You were in {affiliation}.'
我们看到没有f的行没有被解析。
对于多行我们也可以使用反斜杠进行换行:
>>> 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.'
但如何使用三个分号“““:
>>> message = f"""
... Hi {name}.
... You are a {profession}.
... You were in {affiliation}.
... """
...
>>> message
'\n Hi Eric.\n You are a comedian.\n You were in Monty Python.\n'
3. 总结
本文介绍了Python3.6提供的增强字符串格式化方法。通过与之前的两种方法对比,f-string缺省更加简洁、易读。
来源:https://blog.csdn.net/neweastsun/article/details/100830360


猜你喜欢
- Python3.5 版本引入了类型提示(Type Hints),它允许开发者在代码中显式地声明变量、函数、方法等的类型信息。这种类型声明不会
- 上线 Django 项目记录,超简单,避免无意义的踩坑!第一步:安装python管理器在宝塔在线面板安装“ python项目管理器 ”第二步
- 最近想备份网站,但是php下载文件的大小是有大小限制的,而我也懒得装ftp再下载了,就想着暂时弄个二级域名站,然后用python(pytho
- 本文实例为大家分享了pygame实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下由于这段时间实在是太聊了,没什么事做,游戏也玩腻了,所以
- 传参时传递可变对象,实际上传的是指向内存地址的指针/引用这个标题是我的结论,也是我在做项目过程查到的。学过C的都知道,函数传参可以传值,也可
- 写在前面如非特别说明,下文均基于Python3命名空间与作用于跟名字的绑定相关性很大,可以结合另一篇介绍Python名字、对象及其绑定的文章
- 简介使用百度深度学习框架paddlepaddle对人像图片进行自动化抠图安装根据PaddlePaddle官网命令安装如pip install
- 通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。你们大部分人大概都知道怎样把日期进行分割
- 一 概念固定窗口就像是滑动窗口的一个特例,固定窗口是大小固定且不能随着时间而变化的。滑动时间窗口就是把一段时间片分为多个样本窗口,可以通过更
- 1.Django实现WebSocket在线聊天室1.1 安装pip install channels==2.3(saas) F:\Deskt
- delete 删除一张大表时空间不释放,非常慢是因为占用大量的系统资源,支持回退操作,空间还被这张表占用着。truncate table 表
- 直接上代码:#!/usr/bin/python# -*- coding: utf-8 -*-import urllibimport os,d
- 对于map()它的原型是:map(function,sequence),就是对序列sequence中每个元素都执行函数function操作。
- 在seclists中看到一个很惊人的thread:http://seclists.org/oss-sec/2012/q2/493MySQL爆
- 三元条件判断的3种实现方法C语言中有三元条件表达式,如 a>b?a:b,Python中没有三目运算符(?:),但Python有它自己的
- 本文主要介绍了IDEA配置连接MYSQL数据库遇到Failed这个问题解决,分享给大家,具体如下: &nb
- 本文实例讲述了js实现的全国省市二级联动下拉选择菜单。分享给大家供大家参考。具体如下:运行效果截图如下:具体代码如下:<!DOCTYP
- 0、首先查看当前是否开启慢查询:(1)快速办法,运行sql语句show VARIABLES like "%slow%"
- 前言1992年扫雷被加入到windows3.1,成为早期windows的经典游戏。近来接触python的GUI(图形化)编程,于是通过编写扫
- 局部变量什么是局部变量通俗定义:函数内部定义的变量就叫局部变量。话不多说,代码如下:def test1(): a = 300 # 定义一个局