f 字符串格式化程序,包括 for 循环或 if 条件

dea*_*n44 2 python python-3.x f-string

如何在f-string 中插入for循环或if表达式?

我最初想为if表达式做这样的事情:

f'{a:{"s" if CONDITION else "??"}}'
Run Code Online (Sandbox Code Playgroud)

我想做的是:

示例 1

f'{key: value\n for key, value in dict.items()}'
Run Code Online (Sandbox Code Playgroud)

结果:

如果 dict = {'a': 1, 'b': 2}

a: 1 
b: 2
Run Code Online (Sandbox Code Playgroud)

示例 2

c = 'hello'
f'{c} {name if name else "unknown"}'
Run Code Online (Sandbox Code Playgroud)

结果:

如果名称存在,例如 name = 'Mike'

hello Mike
Run Code Online (Sandbox Code Playgroud)

除此以外

hello unknown
Run Code Online (Sandbox Code Playgroud)

这可以做到吗?如果是,怎么做?

Mis*_*agi 7

在 f 字符串中允许使用三元组(“if表达式”)和推导式(“表达式”)for。但是,它们必须是计算结果为字符串的表达式的一部分。例如,key: value是一个字典对,f"{key}: {value}"需要生成一个字符串。

>>> dct = {'a': 1, 'b': 2}
>>> newline = "\n"  # \escapes are not allowed inside f-strings
>>> print(f'{newline.join(f"{key}: {value}" for key, value in dct.items())}')
a: 1
b: 2
Run Code Online (Sandbox Code Playgroud)

请注意,如果整个 f 字符串是单个格式表达式,则直接计算表达式会更简单。

>>> print("\n".join(f"{key}: {value}" for key, value in dct.items())))
a: 1
b: 2
Run Code Online (Sandbox Code Playgroud)

格式字符串中的表达式仍然遵循其常规语义。例如,三元可以测试现有名称是否为真。如果未定义名称,它将失败。

>>> c, name = "Hello", ""
>>> f'{c} {name if name else "unknown"}'
'Hello unknown'
>>> del name
>>> f'{c} {name if name else "unknown"}'
NameError: name 'name' is not defined
Run Code Online (Sandbox Code Playgroud)