Python另类格式化f-strings特性

痞子三分冷 提交于 2019-12-04 21:11:03

我们都知道在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 字符串用法非常好用,在性能上,在容错率上,在外观上,都是值得推荐使用的。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!