字符串格式化

str.format_map 格式化

字符串方法 str.format_map(),Python 官方文档描述如下:

help(str.format_map)
Help on method_descriptor:

format_map(...)
    S.format_map(mapping) -> str
    
    Return a formatted version of S, using substitutions from mapping.
    The substitutions are identified by braces ('{' and '}').

类似于 str.format(**mapping),不同之处在于 mapping 会被直接使用。适宜使用此方法的一个例子是当 mapping 为 dict 的子类的情况:

# 创建一个字典子类型,当 键值对 不存在时,返回键
class Default(dict):
    def __missing__(self, key):
        return key
d = Default(a=1)
d['a'], d['b']
(1, 'b')
# country 键值对不存在,所以直接格式化键 ‘country’
'{name} was born in {country}'.format_map(
    Default(name='Guido'))
'Guido was born in country'

与 format 格式化对比:

'{a} is {age}'.format_map({'a':'A', 'age':18})
'A is 18'
'{a} is {age}'.format(**{'a':'A', 'age':18})
'A is 18'

f-string 格式化字符串

f-string 即格式化字符串字面值。字符串以 ‘f’ 或 ‘F’ 为前缀。这种字符串可包含替换字段,即以 {} 标示的表达式。格式化字符串字面值,会在运行时将表达式求值,而其他字符串字面值总是一个常量。

格式化字符串字面值中的表达式会被当作包含在圆括号中的普通 Python 表达式一样处理,但有少数例外。

空表达式不被允许,lambda 和赋值表达式 :=(python 3.8版添加)必须显式地加上圆括号。

f'{(a := 1+1)}' # python 3.8 才能运行
'2'
f'{(lambda x:1)}'
'<function <lambda> at 0x000001D70B06CA60>'

替换表达式可以包含换行(例如在三重引号字符串中),但是不能包含注释。

a = 3; b = 2
f'''3+2\
-5=
{a +
b - 5}'''
'3+2-5=\n0'

每个表达式会在格式化字符串字面值所包含的位置按照从左至右的顺序被求值。

f'{1+2 > 3}'
'False'

可以在表达式后加一个等于号 ‘=’(3.8 新版功能),提供了等于号 ‘=’ 的时候,输出将包含 ‘=’、’=’ 前后的空格以及求值结果。默认情况下,’=’ 会导致表达式的 repr() 被使用,除非专门指定了格式。

foo = "bar"
f"{ foo = }"
" foo = 'bar'"

可以带一个以叹号 ‘!’ 标示的转换字段,转换符 ‘!s’ 即对结果调用 str(),’!r’ 为调用 repr(),而 ‘!a’ 为调用 ascii()。

foo = "bar"
f"{foo = !s}"
'foo = bar'

还可带一个以冒号 ‘:’ 标示的格式说明符,“格式化迷你语言” 与 str.format() 方法所使用的微语言一致,详见 str.format 方法。

foo = 3.14
f"{foo:.4f}"
'3.1400'
f'{123:#o}'
'0o173'
a=5/6
f'{a:.2%}'
'83.33%'

格式表达式中不允许有反斜杠,这会引发错误:

f"newline: {ord('\n')}"
  File "<ipython-input-23-30c78f70325d>", line 1
    f"newline: {ord('\n')}"
    ^
SyntaxError: f-string expression part cannot include a backslash

想包含需要用反斜杠转义的值,可以创建一个临时变量:

newline = ord('\n')
f"newline: {newline}"
'newline: 10'

格式化字符串字面值不可用作文档字符串,即便其中没有包含表达式:

def foo():
    f"Not a docstring"

print(foo.__doc__)
None
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值