Anders Wang


我所认识的每个人都是榜样,都有值得我去尊敬和学习的地方。


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

最近的文章

Python标准库itertools模块

我们知道,迭代器在Python中是一种非常高效又好用的数据结构,迭代器的特点是可以做到惰性求值(lazy evaluation的概念) ,什么意思呢?就是只有当迭代到某个值的时候它才会被计算产生,比如…

Python, 技术博文详细阅读
更早的文章

实用的(named tuple)命名元组

Python的创始人Guido van Rossum曾经提过一个建议:“不要过度的自己去构建数据结构,尽量去使用命名元组 (named tuple) 而不是对象,尽量使用简单的属性域,因为内置数…

Python, 技术博文详细阅读
comments powered by Disqus