在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缺省更加简洁、易读。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- lol全球总决赛lck一号种子是谁 S14全球总决赛lck一号种子队伍
- BradMehldau-ApresFaure(2024)[24-96]FLAC
- IlCannone-FrancescaDegoPlaysPaganinisViolin(2021)[24-96]FLAC
- Tchaikovsky,Babajanian-PianoTrios-Gluzman,Moser,Sudbin[FLAC+CUE]
- 费玉清.1987-费玉清十周年旧曲情怀4CD【东尼】【WAV+CUE】
- 群星.2024-春花焰电视剧影视原声带【TME】【FLAC分轨】
- 方力申.2008-我的最爱新曲+精丫金牌大风】【WAV+CUE】
- 群星 《2024好听新歌35》十倍音质 U盘音乐 [WAV分轨][1.1G]
- 群星《烧透你的耳朵1》DXD金佰利 [低速原抓WAV+CUE][1.2G]
- 莫文蔚《超级金曲精选2CD》SONY [WAV+CUE][1.6G]
- 【RR】加尼克奥尔森GarrickOhlsso《贝多芬钢琴协奏曲全集》原声母带WAV
- 彭芳《纯色角1》[WAV+CUE]
- 李蔓《山顶的月亮—李蔓动态情歌》
- 梁咏琪.1999-新鲜【EEI】【WAV+CUE】
- 张琍敏.1979-悲之秋【海山】【FLAC分轨】