【问题标题】:f-strings formatter including for-loop or if conditionsf 字符串格式化程序,包括 for 循环或 if 条件
【发布时间】:2020-05-14 07:48:57
【问题描述】:

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

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

f'{a:{"s" if CONDITION else "??"}}'

我想做的事情是这样的:

示例 1

f'{key: value\n for key, value in dict.items()}'

结果:

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

a: 1 
b: 2

示例 2

c = 'hello'
f'{c} {name if name else "unknown"}'

结果:

如果名称存在,例如name = '迈克'

hello Mike

否则

hello unknown

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

【问题讨论】:

  • 第二个例子的预期结果是什么?
  • 您不能在f 字符串中放入语句,只能放入表达式。 ... if ... else ... 不是 if 声明;这是一个条件表达式。
  • 请提供每个预期输出的示例
  • 如果name 未实际设置,第二个将引发NameError,不被视为假值。
  • 第一个根本不是表达式;它是 dict 理解的一个片段。

标签: python python-3.x f-string


【解决方案1】:

三元组(“if 表达式”)和推导式(“for 表达式”)都可以在 f 字符串中使用。但是,它们必须是计算为字符串的表达式的一部分。例如,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

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

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

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

>>> 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

【讨论】:

    猜你喜欢
    • 2012-04-18
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多