15

说我有一个功能

def foo(): return [1, 2, 3]

我想将函数的结果插入到字符串中以获取"001 002 003". 我试过这个:

f"{*foo():03d 03d 03d}"

但它产生了SyntaxError: can't use starred expression here。我可以使用 f 字符串来执行此操作吗?

4

5 回答 5

7

这是你想要的?

str_repr = ' '.join(map('{:03d}'.format, foo()))
print(str_repr)  # prints: 001 002 003

也许这个解决方案最好的一点是它适用于任何列表长度,并且只需最少的调整,您也可以更改输出格式。

于 2017-01-27T14:38:40.480 回答
5

星号表达式只允许在少数特定上下文中使用,例如函数调用、列表/元组/集合文字等。显然,f-string 占位符不是其中之一。您可以单独格式化每个元素并加入字符串,例如:

lst = foo()
s = ' '.join(f'{x:03d}' for x in lst)  # '001 002 003'

通常,要格式化多个值,您必须为每个值使用单独的占位符。

于 2017-01-27T14:39:02.940 回答
2

运算符(存在类似的*规则**)只能在内部使用:

  • 函数调用:foo(*bar)
  • 列表、元组或集合文字:['foo', *bar]
  • 一个任务:foo, *bar = range(10)

它不是表达式,因此不能在 f 字符串的大括号内使用。

于 2017-01-27T14:43:58.410 回答
1

您也可以改用 zfill 方法:

s_repr=" ".join([str(x).zfill(3) for x in foo()]) #not very PEP8 =S
于 2019-03-12T14:10:11.160 回答
0

对于列表,f-strings 似乎并没有给没有它们的情况增加太多。一个替代的、稍微简单的、不带f 字符串和不带 的解决方案.join,适用于任何列表长度,如下所示

a = foo()
str_repr = ("{:03d} "*len(a)).format(*a)
print(str_repr)  # prints: 001 002 003
于 2018-02-20T14:13:32.683 回答