Python另类格式化f-strings特性
我们都知道在Python中字符串格式化常用的有百分号操作符(%)和 str.format()方式,前者最早是在Python 2.5版本以前所支持的,之后便推出了后者。而在Python3.6发布之后,在PEP 498提案或建议书中提出了一种新型字符串格式和机制,被称为(Literal String Interpolation) 字符串插值,也就是f-strings,他的特点是进行字符串格式化时都是以 f 字母开头的。
而不得不说的是,f-strings的运行速度很快。比%-string和str.format()这两种格式化方法都快得多。
我们先来一个直观感受,就是把过去几个字符串格式化方法和新方法做个比较。
name = 'Anders'
gender = 'Male'
str1 = '%s is a %s' %(name, gender)
print(str1)
str2 = '{} is a {}'.format(name, gender)
print(str2)
str3 = f'{name} is a {gender}'
str3
# 输出如下:
# Anders is a Male
# Anders is a Male
# 'Anders is a Male'
在上述例子中,可以看到f-strings方法直接以f字母开头,后面紧跟你要输入的字符串内容编辑,无论是单引号,双引号,三个单引号括起来都可以,然后把要输出的格式化变量内容对号入座即可。
以表达式方式传递
当然不仅仅是传递普通变量,还可以是一个函数方法,因为f-string实际上是在运行时计算的表达式,为了更加说明这点,引用PEP 498官方提到的内容。
从字符串中提取的表达式在f字符串出现的上下文中计算。这意味着表达式可以完全访问本地和全局变量。可以使用任何有效的Python表达式,包括函数和方法调用。
所以我们来看看如果把一个函数方法并调用它的例子。
def math_test(num1, num2):
return num1 * num2
result = f'the result is {math_test(2, 3)}'
result
# 输出如下:
# 'the result is 6'
我们可以看到,如上例子中,先前定义了一个math_test函数方法,在f-string字面量格式化中直接就像平时调用函数一样给函数传递参数,就能得到对应的结果,并把结果替换到先前指定的位置。
多行f
如果我们想要输出的格式本身是以段落形式存在的,存在分行,那可以直接用三个单引号将整段内容括起来,随后输出的字符串格式也包含了段落分隔符。
name = 'Anders'
age = 25
pet = 'dogs'
info = f'''my name is {name},
my age is {age},
I like {pet}.'''
info
# 输出内容:
# 'my name is Anders,\nmy age is 25,\nI like dogs.'
如果是另一种情况,假设输入的字符串拼接很长,占用了屏幕的边宽,只需输入反斜杠"\"跟在折行内容的末尾去做处理即可。
name = 'Anders'
age = 25
pet = 'dogs'
info = f'my name is {name}, \
my age is {age}, \
I like {pet}.'
info
# 输出内容:
# 'my name is Anders, my age is 25, I like dogs.'
性能方面
引用PEP 498中网友翻译提到的:
f -string提供了一种方法,可以在字符串文字中嵌入表达式,使用最小的语法。应该注意的是,f-string实际上是在运行时计算的表达式,而不是一个常量值。在Python源代码中,f-string是一个文本字符串,前缀为f,其中包含括号内的表达式。表达式被替换为它们的值。
总之,在Python 3.6之后 f 字符串用法非常好用,在性能上,在容错率上,在外观上,都是值得推荐使用的。