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

时间:2018-10-17 08:15:42

标签: python python-3.x binary 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

类似的格式用于其他格式(十六进制和八进制)的打印,只需要将后者的花括号替换为我们要打印的数字即可。但是,是否可以使用新的f""字符串替换.format()命令?我知道这看似微不足道,但我在使用新功能时遇到了麻烦,除了f""使得代码更短,更易读。

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

2 个答案:

答案 0 :(得分:2)

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

f'{i:>2} in binary is {i:>08b}'

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

注意事项

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

"{0:>2} in binary is {0:>08b}".format(i + 10)

这里的加法i + 10仅发生一次。另一方面

f"{i+10:>2} in binary is {i+10:>08b}"

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

"{:>2} in binary is {:>08b}".format(i + 10, i + 10)

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

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

j = i + 10
f"{j:>2} in binary is {j:>08b}"

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

答案 1 :(得分:0)

这是我的看法:

在旧的from selenium import webdriver from PIL import Image from io import BytesIO url = 'https://mobec.sk/proxy/geo?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&layers=custom%3Avrbovce_elektrina&tiled=true&STYLES=&WIDTH=512&HEIGHT=512&CRS=EPSG%3A3857&FORMAT_OPTIONS=dpi%3A180&BBOX=1947003.9844800085%2C6242153.477880634%2C1949449.969385134%2C6244599.46278576' chrome = webdriver.Chrome('path/to/chromedriver') chrome.get(url) png = chrome.get_screenshot_as_png() im = Image.open(BytesIO(png)) im.save('output.png') chrome.quit() 中,0表示传递给format函数的第一个元素。 .format()。两次使用0两次来访问第一个变量。另一种编写方式是:"{0:>2} in binary is {0:>08b}".format(i)省略索引。

在新的"{:>2} in binary is {:>08b}".format(i,i)格式中,我们改为传递变量/表达式。