《Python编程的术与道:Python语言进阶》视频课程 《Python编程的术与道:Python语言进阶》视频课程链接:https://edu.csdn.net/course/detail/28618
f-strings字符串格式化
Python f-strings是执行字符串格式化的最新Python语法。 自Python 3.6起可用。 f-strings提供了一种更快、更易读、更简明且不易出错的在Python中格式化字符串的方式。
f-strings具有f前缀,并使用{}括号来评估值。
在Python 3.6之前,有两种主要的方式将Python表达式嵌入到字符串文字中进行格式化:%-formatting 和str.format() 。
Option #1: %-formatting
name = "Eric"
"Hello, %s." % name
'Hello, Eric.'
为了插入多个变量,必须使用这些变量的元组。
name = "Eric"
age = 35
"Hello, %s. You are %s." % (name, age)
'Hello, Eric. You are 35.'
上面看到的代码示例具有足够的可读性。 但是,一旦开始使用多个参数和更长的字符串,代码将很快变得不那么易读。
first_name = "Eric"
last_name = "Idle"
age = 35
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 35. You are a comedian. You were a member of Monty Python.'
这种格式不好用,因为它太冗长并会导致错误,例如无法正确显示元组或字典。
Option #2: str.format()
str.format() ? 是对%-formatting 的改进。 它使用普通的函数调用语法,并且可以通过将对象转换为字符串的__format__() 方法进行扩展。
使用str.format() ,替换字段用花括号标记:
"Hello, {}. You are {}.".format(name, age)
'Hello, Eric. You are 35.'
可以通过引用变量的索引以任何顺序引用它们:
"Hello, {1}. You are {0}.".format(age, name)
'Hello, Eric. You are 35.'
但是,如果插入变量名称,则会获得额外的好处,即能够传递对象,然后在花括号之间引用参数和方法:
person = {'name': 'Eric', 'age': 35}
"Hello, {name}. You are {age}.".format(name=person['name'], age=person['age'])
'Hello, Eric. You are 35.'
还可以使用** 和字典技巧来完成:
person = {'name': 'Eric', 'age': 35}
"Hello, {name}. You are {age}.".format(**person)
'Hello, Eric. You are 35.'
与%-formatting 相比,str.format() 绝对是升级,但是当处理多个参数和更长的字符串时,仍然很冗长:
first_name = "Eric"
last_name = "Idle"
age = 35
profession = "comedian"
affiliation = "Monty Python"
print(("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 35. You are a comedian. You were a member of Monty Python.
如果想要在字典中传递给.format() 的变量,则可以只用.format(**some_dict) 拆包并按字符串中的键引用值,但是有一个更好的方法做到这一点的方法。
f-Strings
f-strings也称为“格式化字符串字面量”(“formatted string literals,”)。它在开头带有f且花括号包含将被其值替换的表达式的字符串字面量。 在运行时对表达式求值,然后使用__format__ 协议进行格式化。
语法
语法与在str.format() 中使用的语法相似,但不那么冗长,而容易阅读:
name = "Eric"
age = 35
f"Hello, {name}. You are {age}."
'Hello, Eric. You are 35.'
使用大写字母F也是有效的:
F"Hello, {name}. You are {age}."
'Hello, Eric. You are 35.'
任意表达式
由于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的类创建的对象。
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", "35")
f"{new_comedian}"
'Eric Idle is 35.'
__str __() 和__repr __() 方法处理如何以字符串形式显示对象,因此需要确保在类定义中至少包括这些方法之一。 如果必须选择一个,请使用__repr __() ,因为它可以代替__str __() 使用。
__str __() 返回的字符串是对象的非正式字符串表示形式。 __repr __() 返回的字符串是正式表示形式。
默认情况下,f-strings将使用__str __() ,但如果包含转换标志!r ,则可以确保它们使用__repr __() 。
f"{new_comedian}"
'Eric Idle is 35.'
f"{new_comedian!r}"
'Eric Idle is 35. Surprise!'
多行 f-Strings
You can have multiline 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}. " \
f"You are a {profession}. " \
f"You were in {affiliation}."
message
'Hi Eric. You are a comedian. You were in Monty Python.'
速度比较
f-strings中的f也可以代表“fast”。
f-strings 比%-formatting 和str.format() 都快。 f-string是在运行时求值的表达式,而不是常量值。
在运行时,大括号内的表达式在其自己的作用域内求值,然后与f-strings的字符串字面量部分放在一起。 然后返回结果字符串。
import timeit
timeit.timeit("""name = "Eric"
age = 35
'%s is %s.' % (name, age)""", number = 10000)
0.0036138039999968896
timeit.timeit("""name = "Eric"
age = 35
'{} is {}.'.format(name, age)""", number = 10000)
0.0034118680000574386
timeit.timeit("""name = "Eric"
age = 35
f'{name} is {age}.'""", number = 10000)
0.0013109760000133974
|