In Python2, print was a keyword which introduced a statement:
print "Hi"
In Python3, print is a function which may be invoked:
print ("Hi")
In both versions, % is an operator which requires a string on the left-hand side and a value or a tuple of values or a mapping object (like dict) on the right-hand side.
So, your line ought to look like this:
print("a=%d,b=%d" % (f(x,n),g(x,n)))
Also, the recommendation for Python3 and newer is to use {}-style formatting instead of %-style formatting:
print('a={:d}, b={:d}'.format(f(x,n),g(x,n)))
Python 3.6 introduces yet another string-formatting paradigm: f-strings.
print(f'a={f(x,n):d}, b={g(x,n):d}')
Answer from Robᵩ on Stack OverflowIn Python2, print was a keyword which introduced a statement:
print "Hi"
In Python3, print is a function which may be invoked:
print ("Hi")
In both versions, % is an operator which requires a string on the left-hand side and a value or a tuple of values or a mapping object (like dict) on the right-hand side.
So, your line ought to look like this:
print("a=%d,b=%d" % (f(x,n),g(x,n)))
Also, the recommendation for Python3 and newer is to use {}-style formatting instead of %-style formatting:
print('a={:d}, b={:d}'.format(f(x,n),g(x,n)))
Python 3.6 introduces yet another string-formatting paradigm: f-strings.
print(f'a={f(x,n):d}, b={g(x,n):d}')
The most recommended way to do is to use format method. Read more about it here
a, b = 1, 2
print("a={0},b={1}".format(a, b))
If you want to print a variable in C, you have to have a format code, much like formatted printing in python.
printf("%lli", total);
where "%lli" is the format specifier for a long long int.
long long p; { printf("%lli\n", p); }
when you need to print long long you must use %lli to represent long long
c - What is the conversion specifier for printf that formats a long? - Stack Overflow
python - What is print(f"...") - Stack Overflow
how to do printf with unsigned short long data type?
string - Wrap long lines in Python - Stack Overflow
Videos
The f means Formatted string literals and it's new in Python 3.6.
A formatted string literal or f-string is a string literal that is prefixed with
forF. These strings may contain replacement fields, which are expressions delimited by curly braces{}. While other string literals always have a constant value, formatted strings are really expressions evaluated at run time.
Some examples of formatted string literals:
>>> name = "Fred"
>>> f"He said his name is {name}."
"He said his name is Fred."
>>> name = "Fred"
>>> f"He said his name is {name!r}."
"He said his name is Fred."
>>> f"He said his name is {repr(name)}." # repr() is equivalent to !r
"He said his name is Fred."
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}" # nested fields
result: 12.35
>>> today = datetime(year=2023, month=1, day=27)
>>> f"{today:%B %d, %Y}" # using date format specifier
January 27, 2023
>>> number = 1024
>>> f"{number:#0x}" # using integer format specifier
0x400
In Python 3.6, the f-string, formatted string literal, was introduced(PEP 498). In short, it is a way to format your string that is more readable and fast.
Example:
agent_name = 'James Bond'
kill_count = 9
# old ways
print("%s has killed %d enemies" % (agent_name,kill_count))
print('{} has killed {} enemies'.format(agent_name,kill_count))
print('{name} has killed {kill} enemies'.format(name=agent_name,kill=kill_count))
# f-strings way
print(f'{agent_name} has killed {kill_count} enemies')
The f or F in front of strings tell Python to look at the values , expressions or instance inside {} and substitute them with the variables values or results if exists. The best thing about f-formatting is that you can do cool stuff in {}, e.g. {kill_count * 100}.
You can use it to debug using print e.g.
print(f'the {agent_name=}.')
# the agent_name='James Bond'
Formatting, such as zero-padding, float and percentage rounding is made easier:
print(f'{agent_name} shoot with {9/11 : .2f} or {9/11: .1%} accuracy')
# James Bond shoot with 0.82 or 81.8% accuracy
Even cooler is the ability to nest and format. Example date
from datetime import datetime
lookup = {
'1': 'st',
'21': 'st',
'31': 'st',
'2': 'nd',
'22': 'nd',
'3': 'rd',
'23': 'rd'
}
dato = datetime.now()
print(f"{dato: %B %-d{lookup.get(f'{dato:%-d}', 'th')} %Y}")
# April 23rd 2022
Pretty formatting is also easier
tax = 1234
print(f'{tax:,}') # separate 1k \w comma
# 1,234
print(f'{tax:,.2f}') # all two decimals
# 1,234.00
print(f'{tax:~>8}') # pad left with ~ to fill eight characters or < other direction
# ~~~~1234
print(f'{tax:~^20}') # centre and pad
# ~~~~~~~~1234~~~~~~~~
The __format__ allows you to funk with this feature. Example
class Money:
def __init__(self, value, currency='€'):
self.currency = currency
self.value = value
def __repr__(self):
return f'Money(value={self.value}, currency={self.currency})'
def __format__(self, *_):
return f"{self.currency}{float(self.value):.2f}"
tax = 12.3446
money = Money(tax, currency='$')
print(f'{money}')
# $12.34
print(money)
# Money(value=12.3446, currency=$)
There is much more. Readings:
- PEP 498 Literal String Interpolation
- Python String Formatting
def fun():
print(('{0} Here is a really long '
'sentence with {1}').format(3, 5))
Adjacent string literals are concatenated at compile time, just as in C. 2.4.2. String literal concatenation is a good place to start for more information.
Using concatenation of adjacent string literals, together with formatted string literals is the way to go:
x = 2
sep = 2 * '\n'
print(
'This message is so long that it requires '
f'more than {x} lines.{sep}'
'And more lines may be needed.')
This approach complies with PEP 8 and allows better use of space.
No + operators needed, no backslashes for line continuation, no irregularities of indentation, no error-prone += to an accumulator string variable (which can be mistyped as =, resulting in a silent error), no stray parenthesis hanging below the print (the arguments are placed in their own level of indentation, and the next element at the indentation level of print is the next statement).
Starting the strings on the line below the line that contains the print( reduces indentation, and is more readable. Readability stems from both print( standing out, by being on its own line, and by the uniform alignment of consecutive statements of this form.
The reduction in indentation from this approach becomes more evident when raising exceptions:
raise ModuleNotFoundError(
'aaaaaaaaaaaaaaaaaaaaaaaa'
'aaaaaaaaaaaaaaaaaaaaaaaa'
f'aaaaa {x} aaaaa')
Regarding formatted string literals (signified by the prefix "f", as in f'...'), raw strings can be formatted string literals, by combining the prefixes "r" and "f":
rf'This is a formatted raw string, {sep}here is a backslash \.'
Note that raw strings are necessary for including literal backslashes without writing \\. Otherwise, in a future CPython version, a SyntaxError will be raised. As of Python 3.9, a DeprecationWarning is raised:
python -X dev -c '"\q"'
outputs:
<string>:1: DeprecationWarning: invalid escape sequence \q
The replacements are very readable. In particular, this approach makes writing code that generates code or mathematical formulas a very pleasant task.
Rarely, the method str.format may be suitable, due to what substitutions are needed. It can be used as follows:
print((
'This message is so long that it requires '
'more than {x} lines.{sep}'
'And more lines may be needed.'
).format(x=x, sep=sep))