【Python】详解 %、format、f-string (格式化字符串)

目录

一、绪论

二、% 

2.1 示例

2.2 速查表

三、format 

3.1 示例

3.2 速查表 (数字格式化)

四、f-string

4.1 说明

4.2 示例


一、绪论

随着 Python 的更新,其 字符串格式化 功能也在不断地优化。在 Python 2.6 以前,% 操作符一枝独秀;在 Python 2.6 之后,迎来后起之秀 format 操作符;在 Python 3.6 之际,更有 f-string 操作符异军突起。字符串格式化的逐步优化,不但简化了操作,而且提升了效率,如下执行时间对比柱状图所示:

可见,“远古时期” 的模板字符串 str.Template 过于低效,str.format 和 % 操作符在简便和效率之间有所权衡,而 f-string 则具有 最佳性能。以下将逐一回顾:


二、% 

2.1 示例

作为最古老格式化字符串方式,% 操作符与 C 中 sprintf 函数的语法基本相同,因而具有浓浓的 C 风味,使得最终的表达式可能较为复杂和冗长。关于 % 操作符的用法一言以蔽之 —— 在目标字符串中指定位置插入待填充内容的类型符号。例如:

>>> "%s is %d years old." % ('Zhang San', 18)  # 直接使用
'Zhang San is 18 years old.'
# -------------------------------------------------------------------------
>>> name = 'Zhang San'
>>> age = 18
>>> "%s is %d years old." % (name, age)  # 间接使用
'Zhang San is 18 years old.'

2.2 速查表

常用类型符号及其说明

符号说明
%s格式化字符串
%c格式化字符及其 ASCII 码
%d格式化整数
%u格式化无符号整型
%o格式化无符号八进制数
%x格式化无符号十六进制数
%X格式化无符号十六进制数 (大写)
%f格式化浮点数,可指定小数点后的精度
%e格式化浮点数 (科学计数法)
%E同 %e
%g%f 和 %e 的简写
%G%F 和 %E 的简写
%p用十六进制数格式化变量的地址

辅助指令

符号说明
*定义宽度或小数点精度
-用于左对齐
+正数前显示加号 '+'
<sp>正数前显示空格
#八进制数前显示零 '0'、十六进制数前显示 '0x' 或 '0X'
0显示的数字前面填充'0'而不是默认的空格
%'%%' 输出一个 '%' (百分号转义)
(var)映射变量 (字典参数)
m.n.m 是显示的最小总宽度,n 是小数点后的保留位数

常用转义字符


三、format 

3.1 示例

相比于 % 操作符,str.format() 在少量降低性能的条件下,强化了字符串格式化的功能。其基本语法是:接受一个格式字符串及任意一组位置与关键字参数,通过 { } 和 : 来代替 %,而且参数数量没有限制 (相对概念),参数位置可以不按顺序。例如:

>>> "{} is {} years old.".format('Li Hua', 3)  # 不指定位置索引, 默认排列
'Li Hua is 3 years old.'
# -------------------------------------------------------------------------
>>> "{0} is {1} years old.".format('Li Hua', 3)  # 指定位置索引
'Li Hua is 3 years old.'
# -------------------------------------------------------------------------
>>> "{0} is {1}{1} years old.".format('Li Hua', 3)  # 指定位置索引, 多次使用
'Li Hua is 33 years old.'

还可以对 str.format() 设定参数:(其中使用 * ** 解包的原理详见文章 单/双星号操作符)

>>> "宿舍楼:{building}, 门牌号:{number}".format(building="鹏翔2斋", number=1234)
'宿舍楼:鹏翔2斋, 门牌号:1234'
# -------------------------------------------------------------------------
>>> info = {"building":"鹏翔2斋", "number":1234}
>>> "宿舍楼:{building}, 门牌号:{number}".format(**info)  # 使用 ** 对 dict 解包
'宿舍楼:鹏翔2斋, 门牌号:1234'
# -------------------------------------------------------------------------
>>> info2 = ("鹏翔2斋", 1234)
>>> "宿舍楼:{}, 门牌号:{}".format(*info)  # 使用 * 对 tuple 解包
'宿舍楼:鹏翔2斋, 门牌号:1234'
# -------------------------------------------------------------------------
>>> info3 = ["鹏翔2斋", 1234]
>>> "宿舍楼:{0[0]}, 门牌号:{0[1]}".format(info3)  # 使用 index 指定 list 元素
'宿舍楼:鹏翔2斋, 门牌号:1234'

甚至可以向 str.format() 传入对象:

>>> class Num:
	def __init__(self, num):
		self.num = num

>>> six = Num(6)
>>> "my number is {0.num}".format(six)  # 调用成员属性作为参数
'my number is 6'

以上实例足以说明 str.format() 的灵活与强大!

3.2 速查表 (数字格式化)

常见用法示例及其说明

示例格式结果说明
3.1415{:.2f}3.14保留小数点后2位
2.7182{:+.2f}+2.71带符号保留小数点后2位
-1{:+.2f}-1.00带符号保留小数点后2位
1.2345{:.0f}1删去小数部分
8{:x>2d}08整数补x (填充左边, 宽度为2)
16{:y<4d}16xx整数补y (填充右边, 宽度为4)
1000000{:,}1,000,000, 作千分位分隔符
1000000{:_}1_000_000_ 作千分位分隔符
0.48{:.4%}48.0000%小数转百分比
100000000{:.2e}1.00e+08指数记法
16{:>8d}      16向右对齐 (宽度为8)
16{:<8d}16      向左对齐 (宽度为8)
16{:^8d}   16    居中对齐 (宽度为8)

进制转换:(# 符号用于切换数字显示,可获取各进制的带前缀大、小写表示)

示例格式结果说明
12{:#b}0b1100带前缀 二进制小写表示
12{:b}1100二进制表示
12{:o}14八进制表示
12{:d}12十进制表示
12{:x}c十六进制表示
12{:#X}0XC带前缀 十六进制大写表示

事实上,str.format() 的用法远比上述示例复杂多样,详见官方文档:格式字符串语法


四、f-string

4.1 说明

相较于前两种方法,Python 3.6 中的 f-string (格式化字符串常量 formatted string literals),应为最佳形式 —— 简洁易读,不仅有助于简化十分繁琐的写法,而且具有 最佳效率,非常建议使用。与具有恒定值的其它字符串常量不同,格式化字符串实际上是运行时运算求值的表达式。

f-string 的语法结构为:

f ' <text> { <expression> <optional !s, !r, or !a> <optional : format specifier> } <text> ... '

其中,f (或 F) 为目标字符串前缀;<text> 表示占位符的上下文;类似于 str.format,目标字符串中的占位符 (一种运行时计算的表达式) 也使用了花括号 { },在其中必须加入表达式 <expression>,可选参数标志 !s 表示调用表达式上 str() (默认)、!r 表示调用表达式的 repr()、!a 表示调用表达式的 ascii()。最后,使用 format 协议格式化目标字符串。

4.2 示例

其常用方法是在目标字符串前加上字母 f 或 F,然后在目标字符串中插入占位符(直接在 { } 中加入变量)。例如:

>>> name = 'Bob'
>>> age = 24
>>> f"{name} is {age} years old."  # 格式字符串前缀 f 或 F, 中间插入占位符 {variable}
'Bob is 24 years old.'

其实,花括号 { } 中可以灵活地填入 各种表达式,甚至可以 调用函数与类成员 等,而不仅仅局限于变量,例如:

>>> f"The result of the function is {2 * 3 + 4}"  # 算术表达式 内联运算
'The result of the function is 9.43656365691809'
# ----------------------------------------------------------------------------
>>> f'My weapen is {weapen.upper()}'  # 函数/方法调用
'My weapen is AK47'
# ----------------------------------------------------------------------------
>>> import math
>>> f"The result of the function is {2 * math.e + 4}"  # 类成员(属性/方法)调用
'The result of the function is 9.43656365691809'

当然,除了内置函数和自定义普通函数,lambda 表达式 (匿名函数) 也可以填入 { },但为避免 lambda 表达式的分号 : 带来的歧义,应将 lambda 表达式置于圆括号 ( ) 中,例如:

>>> f'The test result is {lambda x: x + 1 (99)}'  # 无法解析 End-of-File
SyntaxError: unexpected EOF while parsing
# ----------------------------------------------------------------------------
>>> f'The test result is {(lambda x: x + 1)(99)}'  # 格式:{(lambda表达式)(lambda表达式参数)}
'The test result is 100'

为避免引号冲突,可以灵活使用 单引号 ' 、双引号 '' 、单引号文本字符串 ' ' '、双引号文本字符串 '' '' '' 来解决,只需 保证 目标字符串外定界符的引号 与 目标字符串中 占位符内的引号 不同。例如:

>>> f"We are {"CT"}"  # 内外均使用了双引号 ""
SyntaxError: invalid syntax  
# ----------------------------------------------------------------------------
>>> f"We are {'CT'}"  # 内用单引号 '' 外用双引号 ""
'We are CT'
# ----------------------------------------------------------------------------
>>> f'''We are {'CT'} and you are {"T"} '''  # 内用单双 外用三
'We are CT and you are T '

# 不论怎么搭配, 只要内外不冲突即可

但注意,占位符 { } 内不能使用转义符号 \ 对引号转义 (因为不允许出现 \,除非用变量间接传递),而上下文可以:

>>> f'I think {you\'re powerful}'  # {} 内不可使用转义符号 \
SyntaxError: f-string expression part cannot include a backslash
# ----------------------------------------------------------------------------
>>> f'You\'re powerful'  # {} 外则可同正常字符串一样使用转义符号 \
"You're powerful"
# ----------------------------------------------------------------------------
>>> words = "you\'re powerful"  # 除非用变量传递
>>> f'I think {words}'
"I think you're powerful"

此外,更多技术细节详见 官方文档。由于 f-string 是基于 str.format 发展而来的, str.format 所用符号同样适用于 f-string (所以可以使用 3.2 节的速查表)。


参考文献

6.1. string — 常见的字符串操作 — Python 3.6.15 文档

Python format 格式化函数 | 菜鸟教程

Python 字符串 | 菜鸟教程

f-string - 简书

Python学习干货—f-string 更酷的格式化字符串 - 知乎

2. Lexical analysis — Python 3.10.4 documentation

  • 13
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: f-stringPython3.6及更高版本中引入的一种字符串格式化方法。除了基本的变量插入外,f-string还支持一些高级的用法。 首先,f-string支持表达式的内嵌计算。我们可以在花括号内使用任何有效的Python表达式,例如函数调用、数学运算等。这样我们可以直接在格式化字符串中执行计算,避免了额外的步骤。 其次,f-string还支持设定字段的宽度和对齐方式。可以在花括号中使用冒号(:)来进行格式设置。可以指定字段的宽度以及对齐方式(左对齐:<,右对齐:>,居中对齐:^),方便美化输出格式。 另外,f-string还可以在花括号内使用格式化说明符。格式化说明符可以用来指定数值的显示格式,如小数位数、千位分隔符等。通过在冒号后加上格式化指令,可以实现更加灵活的数值格式化。 此外,f-string还支持特殊字符的转义。在花括号内使用双花括号({{}})表示打印花括号字符本身,避免被解析为变量插入。 总的来说,f-string提供了一种简洁而强大的字符串格式化方式。它可以方便地嵌入变量和表达式,支持字段宽度和对齐方式的设置,允许使用格式化说明符进行数值格式化,并支持特殊字符的转义。这些高级用法使得f-string在日常编程中能够更好地满足我们对字符串格式化的需求。 ### 回答2: Python 3 中的 f-string 是一种方便的字符串格式化方法,在格式化字符串时具有一些高级用法。 首先,可以在 f-string使用表达式。除了简单的变量名外,还可以在大括号中使用任何有效的表达式,例如数学运算、函数调用等。这样可以灵活地对字符串进行计算或处理。 其次,可以在 f-string使用属性和方法。如果大括号中的表达式是一个对象的属性或方法调用,f-string 将自动获取或调用它们的值。这使得处理对象属性和方法时更加方便。 此外,可以在 f-string使用格式化选项。通过在大括号中使用冒号:,可以指定格式化选项。例如,可以设置宽度、精度、填充字符等等。这样可以方便地控制输出的格式。 另外,可以在 f-string使用字典和列表。通过使用花括号 {} 和索引或键名,可以方便地获取字典和列表中的元素,并进行格式化输出。 最后,可以在 f-string使用循环和条件语句。通过在大括号中使用循环和条件表达式,可以根据需要多次输出字符串或进行条件判断,并灵活地处理输出结果。 综上所述,Python 3 的 f-string 提供了一种高级的字符串格式化方法,不仅可以进行简单的变量替换,还可以使用表达式、属性和方法、格式化选项、字典和列表、循环和条件语句等高级功能。这些特性使得 f-string 成为一种非常方便和灵活的字符串格式化工具。 ### 回答3: Python3中的f-string是一种方便且直观的格式化字符串的方式。除了基本的字符串插值功能外,它还有一些高级用法,可以更灵活地处理字符串格式化需求。 一、格式化变量: f-string可以直接在字符串中插入变量,并使用大括号{}将变量包裹起来。可以在大括号内使用简单表达式对变量进行格式化。例如: name = 'Alice' age = 20 print(f'My name is {name} and my age is {age}.') # 输出:My name is Alice and my age is 20. 二、格式化数字: f-string支持在大括号内使用格式化选项,对数字进行格式化。例如: num = 3.1415926 print(f'The value of pi is approximately {num:.2f}.') # 输出:The value of pi is approximately 3.14. 三、调用函数: f-string中可以直接调用函数,并将函数的返回值插入到字符串中。例如: def get_greeting(): return 'Hello' print(f'{get_greeting()} World!') # 输出:Hello World! 四、使用表达式: f-string支持在大括号内使用复杂的表达式,可以对变量进行运算、取长度等操作。例如: name = 'Alice' print(f'My name is {name.upper()} and my name has {len(name)} characters.') # 输出:My name is ALICE and my name has 5 characters. 总结: Python3的f-string是一种强大的字符串格式化工具,它不仅可以简洁地插入变量,还支持格式化数字、调用函数和使用表达式。它的高级用法可以满足更复杂的字符串格式化需求,提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值