python格式化字符串f引号_f-string:改进的Python字符串格式
化语法
f-strings 是 Python 3.6 引⼊的⼀种⾮常棒的字符串格式化⽅法。
相⽐其他格式⽅法,f-strings 更易读、更简洁、更少犯错,也更快。
在了解为什么以及如何使⽤ f-strings 之前,我们先看⼀下在 f-strings 之前 Python 是如何进⾏字符串格式化的。那是⼀段很艰难的⽇⼦,犹如⼤雪中艰难攀爬上下学路上的⼭坡。
【Python 中字符串格式的⽼式⽅法】
Python 3.6 之前,有两种主要⽅式可将 Python 表达式嵌⼊到常量字符串中进⾏格式化:% 格式化语法和 str.format() ⽅法。
我们来看⼀下这两种⽅法的使⽤⽅法和局限之处。
1,% 格式化语法
这是 Python 中最古⽼的⼀种格式化⽅法,从⼀开始就存在于语⾔规范中。你可以在 Python 官⽅⽂档中
获取更多相关信息。
你需要知道,官⽅⽂档并不推荐 % 格式化⽅法,并给出如下理由:这⾥描述的格式化操作表现出各种怪癖,会导致⼀些常见的错误,⽐如⽆法正确显⽰ tuples 和 dicts。使⽤较新式的格式化字符串字⾯量或 str.format() 有助于避免这些错误,这些可选的格式化⽅式也提供了更加强⼤、灵活以及可扩展的⽅法来格式化⽂本。
那么,如何使⽤ % 格式化语法呢?
string 类型的对象⽀持使⽤ % 运算符来执⾏字符串格式化操作。
例如:>>> name = 'Eric'>>> 'Hello, %s' % name'Hello, Eric'
如果要插⼊多个变量,你必须使⽤ tuple 来包含这些变量。>>> name = 'Eric'>>> age = 21>>> 'Hello %s. You are %s.' % (name,
age)'Hello Eric. You are 21.'
上边这两段代码可读性还是不错的,但是,⼀旦你需要使⽤更多的变量和更长的格式字符串,代码的可读性就变得差很多了。>>>
first_name = 'Eric'>>> last_name = 'Idle'>>> age = 21>>> 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 21. You are a comedian. You were a member of Monty Python.'
这段代码开始显得冗长,⽽且容易产⽣错误:你可能在格式字符串中漏写⼀个 %,或者未能正确显⽰ tuple 或 dict 对象。
幸运的是,格式化之路前途光明。
2,str.format() ⽅法
这是 Python 2.6 引⼊的新式格式化⽅法,能胜任 % 完成的所有⼯作。
str.format() 是 % 格式化语法的⼀个改进。它采⽤了正常的函数调⽤语法,并且可通过待格式化对象的 __format__() ⽅法进⾏扩展。
str.format() 在格式字符串中使⽤⼤括号为待格式化对象预留替换位。>>> "Hello, {}. You are {}.".format(name, age)'Hello, Eric. You are 21.'
可以通过变量在 str.format() 参数中的位置索引来引⽤这些对象。>>> "Hello, {1}. You are {0}.".format(age, name)'Hello, Eric. You are 21.'
也可以在格式字符串中插⼊变量名,这样你就能够传递对象,并在格式字符串的⼤括号⾥引⽤参数和⽅法。>>> person = {'name': 'Eric', 'age': 21}>>> "Hello, {name}. You are {age}.".format(name=person['name'], age=person['age'])'Hello, Eric. You are 21.'>>> "Hello, {name}. You are {age}.".format(age=person['age'], name=person['name'])'Hello, Eric. You are 21.'>>>>>> name =
'Eric'>>> age = 21>>> "Hello, {name1}. You are {age1}.".format(age1=age, name1=name)'Hello, Eric. You are 21.'
对于字典(dict)类型的变量,也可以使⽤ ** 来实现这个操作:>>> person = {'name': 'Eric', 'age': 21}>>> "Hello, {name}. You are {age}.".format(**person)
str.format() 相⽐ % 格式化语法⽆疑是⼀个升级,但难称完美。
插⼊变量名使得它⽐ % 格式化语法更易读;可在参数中对字典类型对象执⾏解压操作,使得代码更简洁。但是处理多个参数或较长字符串时同样显得冗长。>>> first_name = "Eric">>> last_name = "Idle"
>>> age = 21>>> 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 21.You are a comedian. You were a member of Monty Python.'
【f-strings:⼀种新的改进的字符串格式化⽅法】
f-strings 是 Python 3.6 引⼊的⼀种新式字符串格式化⽅法,使得字符串格式化⼯作更简单。
f-strings 也称为格式化的字符串字⾯量,它以 f 开头,在引号包含的字符串中使⽤⼤括号包含待求值的表达式。这些表达式在运⾏时求值,然后通过 __format__ 协议实现格式化。
⼀起看⼀下 f-strings 是如何简化格式化操作的吧。
1,简单语法
f-strings 的基本语法和 str.format() 相似,但是更简洁。>>> name = 'Eric'>>> age = 21>>> f'hello, {name}. You are {age}.''hello, Eric. You are 21.'
只需直接写⼀遍变量名即可。
也可以使⽤⼤写的 F 作为前缀:>>> F"Hello, {name}. You are {age}."'Hello, Eric. You are 21.'
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 中格式化较复杂的对象,只要对象的类中恰当运⽤了 f-strings。
假设你有⼀个下边这样的类:class Comedian:def __init__(self, first_name, last_name, age):self.first_name =
first_nameself.last_name = last_nameself.age = agedef __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", "21")>>> f"{new_comedian}"'Eric Idle is 21.'
__str__() 和 __repr__() ⽅法⽤于处理对象如何表⽰为字符串,你⾄少应该在类定义中包含其中⼀个⽅法。如果只定义⼀个的话,请使⽤__repr__(),因为它可⽤来替代 __str__()。
__str__() 返回的字符串是⼀个对象的⾮正式字符串表⽰,应该是可读的。__repr__() 返回的字符串是正式的表⽰,应该是明确的。
调⽤ str() 和 repr() ⽅法⽐直接使⽤ __str__() 和 __repr__() 要好。
默认情况下,f-strings 会使⽤ __str__() 来输出对象的字符串表⽰,但是如果你加⼊了转换标志 !r,f-strings 就会调⽤ __repr__()。>>>f"{new_comedian}"'Eric Idle is 21.'>>>f"{new_comedian!r}"'Eric Idle is 21. Surprise!'
3,多⾏ f-strings
你可以在 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-strings 扩展到多⾏。>>>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-strings,输出的格式化字符串也将是多⾏的。>>>message = f"""... Hi {name}.... You are a {profession}.... You were in {affiliation}....""">>>message'\n\tHi Eric. \n\tYou are a comedian. \n\tYou were in Monty
Python.\n'
4,运⾏速度
f-strings 中的 f 也可以代表 “fast”。通常情况下,f-strings ⽐ % 格式化语法和 str.format() 都要快。
如你所见,f-strings 实际上是⼀个运⾏时求值的表达式,⽽不是常量值。
运⾏时,⼤括号中的表达式先在其⾃⼰的作⽤域中求值,然后和 f-strings 的字符串常量部分组合在⼀起,并返回结果字符串。这就是 f-strings 的全部⼯作。
这⾥给出⼀个⽐较三种格式化⽅式速度的例⼦。>>>import timeit>>>timeit.timeit("""name = "Eric"...age = 74...'%s is %s.' % (name, age)""", number = 10000)0.003324444866599663>>>timeit.timeit("""name = "Eric"...age = 74...'{} is {}.'.format(name, age)""", number = 10000)0.004242089427570761>>>timeit.timeit("""name = "Eric"...age = 74...f'{name} is {age}.'""",
number = 10000)0.0024820892040722242
可以看出,f-strings 速度较快。
但结果并⾮总是如此,不同版本的 Python 中,str.format() 有时候会快⼀些。
【f-strings 的⼀些语法细节】
我们已经了解到 f-strings 拥有简洁的语法和较快的速度,在开始使⽤ f-strings之前,再来了解⼏点细节知识。
1,引号
在 f-strings 表达式中可以使⽤多种引号,但是f-strings 内部表达式使⽤的引号和 f-strings 外部的引号不能相同。
下边这两种写法都是正确的:>>>f"{'Eric Idle'}"'Eric Idle'>>>f'{"Eric Idle"}''Eric Idle'
也可以使⽤三引号:>>> f"""Eric Idle"""'Eric Idle'>>> f'''Eric Idle''''Eric Idle'
如果你想在 f-strings 的内部和外部使⽤相同的引号,你需要使⽤转义符 \ 来转义内部引号:>>>f"The \"comedian\" is {name}, aged {age}."'The "comedian" is Eric, aged 21.'
2,字典变量
当你打算在 f-strings 中插⼊字典变量的某些 key 时,若你使⽤单引号引⽤ key 名,你需要在 f-strings 的外部使⽤双引号。
python格式化输出format>>>comedian = {'name': 'Eric Idle', 'age': 21}>>>f"The comedian is {comedian['name']}, aged {comedian['age']}."'The comedian is Eric Idle, aged 21.'
若你在 f-strings 的外部使⽤了和引⽤字典 key 相同的单引号,Python 解释器会报错:>>>comedian = {'name': 'Eric Idle', 'age': 21}>>>f'The comedian is {comedian['name']}, aged {comedian['age']}.'File "", line 1f'The comedian is {comedian['name']}, aged {comedian['age']}.'^SyntaxError: invalid syntax
所以,在 f-strings 中插⼊字典的 key 时,需要特别留意引号的使⽤⽅法。
3,⼤括号
由于 f-strings 使⽤⼤括号来插⼊变量,如果想在 f-strings 中输出 {} 字符,你需要使⽤双重⼤括号。>>>f"{{70 + 4}}"'{70 + 4}'
但是,如果使⽤三重⼤括号,格式化结果中只会保留⼀重⼤括号:>>>f"{{{70 + 4}}}"'{74}'
如果使⽤超过三重的⼤括号,你会在输出中得到更多⼤括号。>>>f"{{{{70 + 4}}}}"'{{70 + 4}}'
4,反斜杠

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。