RE f-string, the biggest difference for me (if available) is that it is an expression rather than a statement, so that it can be used directly as an actual argument, for example, to pass a filename with numerical data embedded in via {...}. In my codes I have been doing this with my custom to_str() function (maybe similar to fmt() as mentioned above), but I think the code would become much simpler and readable if it can be done with f-string (also no need to prepare such to_stri()). Another point is that f-string can be used directly in another expression (e.g., a ternary/conditional expression), which likely makes the code even shorter (than declaring several temporary variables and using several statements for making IF constructs).
EDIT: Another feature I find useful is this one (which I typically use for echo-ing input values).
>>> long_var_name = 2.0
>>> print( f"{long_var_name = }, {long_var_name**2 = :.6f} " )
long_var_name = 2.0, long_var_name**2 = 4.000000
For another examples, string interpolation (wiki)