19

For printing some numbers to their binary formats, we simply use the .format() method, like so:

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

Output:

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

Similar is for printing in other formats (hex and octal) which just requires replacing the latter braces to the digits we want to print. But is there a way to use the new f"" string to replace the .format() command? I know this might seem trivial but I stumped over this while playing around with the new feature, besides f"" makes the code shorter and more readable.

for i in range(5+1):
    print(f'{0:>2} in binary is {0:>08b}')
# This prints out just 0s
1
  • 6
    Shouldn't you change 0 to i here? Commented Oct 17, 2018 at 8:17

2 Answers 2

34

Your f-string should have expressions in it rather than indices:

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

Anywhere you had 0 in the original format string should be replaced by the actual first argument: in this case i.

Caveat

The expression in the f-string is evaluated twice, but the argument to format is only evaluated once when you access it by index. This matters for more complicated expressions. For example:

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

Here the addition i + 10 only happens once. On the other hand

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

does the addition twice because it is equivalent to

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

Or

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

The workaround is to pre-compute the results of expressions that appear in your f-string more than once:

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

Now j is evaluated multiple times, but it's just a simple reference.

Sign up to request clarification or add additional context in comments.

Comments

1

Here is my take:

In the old .format() the 0 represented the 1st element passed to the format function. "{0:>2} in binary is {0:>08b}".format(i). 0 was used twice to access the first variable twice. Another way of writing it would be: "{:>2} in binary is {:>08b}".format(i,i) omitting the indices.

In the new f'' format we pass variables/expressions instead.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.