如何使用f“”字符串而不是.format()打印二进制数字?

Shi*_*_90 2 python binary python-3.x f-string

要将某些数字打印为二进制格式,我们只需使用.format()方法,如下所示:

# Binary
for i in range(5+1):
    print("{0:>2} in binary is {0:>08b}".format(i))

0 in binary is 00000000
1 in binary is 00000001
2 in binary is 00000010
3 in binary is 00000011
4 in binary is 00000100
5 in binary is 00000101
Run Code Online (Sandbox Code Playgroud)

对于其他格式(十六进制和八进制)的打印也是如此,只需要将后者的花括号替换为我们要打印的数字即可。但是,有没有办法使用新f""字符串替换.format()命令?我知道这看似微不足道,但我在试用新功能时不胜其烦,此外还f""使代码更短,更易读。

for i in range(5+1):
    print(f'{0:>2} in binary is {0:>08b}')
# This prints out just 0s
Run Code Online (Sandbox Code Playgroud)

Mad*_*ist 7

您的f字符串中应该包含表达式而不是索引:

f'{i:>2} in binary is {i:>08b}'
Run Code Online (Sandbox Code Playgroud)

0原始格式字符串中的任何地方都应替换为实际的第一个参数:在这种情况下i

警告

f字符串中的表达式被求值两次,但是format当您通过索引访问它时,to的参数仅被求值一次。这对于更复杂的表达式很重要。例如:

"{0:>2} in binary is {0:>08b}".format(i + 10)
Run Code Online (Sandbox Code Playgroud)

在此,添加i + 10仅发生一次。另一方面

f"{i+10:>2} in binary is {i+10:>08b}"
Run Code Online (Sandbox Code Playgroud)

进行两次加法,因为它等效于

"{:>2} in binary is {:>08b}".format(i + 10, i + 10)
Run Code Online (Sandbox Code Playgroud)

要么

"{0:>2} in binary is {1:>08b}".format(i + 10, i + 10)
Run Code Online (Sandbox Code Playgroud)

解决方法是预先计算多次出现在f字符串中的表达式的结果:

j = i + 10
f"{j:>2} in binary is {j:>08b}"
Run Code Online (Sandbox Code Playgroud)

现在j经过多次评估,但这只是一个简单的参考。