mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
update the tutorial to use str.format
This commit is contained in:
parent
c15205e939
commit
f9ef9881d7
7 changed files with 81 additions and 32 deletions
|
@ -445,8 +445,8 @@ called with an arbitrary number of arguments. These arguments will be wrapped
|
||||||
up in a tuple. Before the variable number of arguments, zero or more normal
|
up in a tuple. Before the variable number of arguments, zero or more normal
|
||||||
arguments may occur. ::
|
arguments may occur. ::
|
||||||
|
|
||||||
def fprintf(file, format, *args):
|
def fprintf(file, template, *args):
|
||||||
file.write(format % args)
|
file.write(template.format(args))
|
||||||
|
|
||||||
|
|
||||||
.. _tut-unpacking-arguments:
|
.. _tut-unpacking-arguments:
|
||||||
|
|
|
@ -550,7 +550,7 @@ with the :func:`zip` function. ::
|
||||||
>>> questions = ['name', 'quest', 'favorite color']
|
>>> questions = ['name', 'quest', 'favorite color']
|
||||||
>>> answers = ['lancelot', 'the holy grail', 'blue']
|
>>> answers = ['lancelot', 'the holy grail', 'blue']
|
||||||
>>> for q, a in zip(questions, answers):
|
>>> for q, a in zip(questions, answers):
|
||||||
... print 'What is your %s? It is %s.' % (q, a)
|
... print 'What is your {0}? It is {1}.'.format(q, a)
|
||||||
...
|
...
|
||||||
What is your name? It is lancelot.
|
What is your name? It is lancelot.
|
||||||
What is your quest? It is the holy grail.
|
What is your quest? It is the holy grail.
|
||||||
|
|
|
@ -132,7 +132,7 @@ the exception (allowing a caller to handle the exception as well)::
|
||||||
s = f.readline()
|
s = f.readline()
|
||||||
i = int(s.strip())
|
i = int(s.strip())
|
||||||
except IOError as (errno, strerror):
|
except IOError as (errno, strerror):
|
||||||
print "I/O error(%s): %s" % (errno, strerror)
|
print "I/O error({0}): {1}".format(errno, strerror)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
print "Could not convert data to an integer."
|
print "Could not convert data to an integer."
|
||||||
except:
|
except:
|
||||||
|
|
|
@ -132,9 +132,8 @@ that every float operation can suffer a new rounding error.
|
||||||
While pathological cases do exist, for most casual use of floating-point
|
While pathological cases do exist, for most casual use of floating-point
|
||||||
arithmetic you'll see the result you expect in the end if you simply round the
|
arithmetic you'll see the result you expect in the end if you simply round the
|
||||||
display of your final results to the number of decimal digits you expect.
|
display of your final results to the number of decimal digits you expect.
|
||||||
:func:`str` usually suffices, and for finer control see the discussion of
|
:func:`str` usually suffices, and for finer control see the :meth:`str.format`
|
||||||
Python's ``%`` format operator: the ``%g``, ``%f`` and ``%e`` format codes
|
method's format specifiers in :ref:`formatstrings`.
|
||||||
supply flexible and easy ways to round float results for display.
|
|
||||||
|
|
||||||
|
|
||||||
.. _tut-fp-error:
|
.. _tut-fp-error:
|
||||||
|
|
|
@ -27,16 +27,13 @@ first way is to do all the string handling yourself; using string slicing and
|
||||||
concatenation operations you can create any layout you can imagine. The
|
concatenation operations you can create any layout you can imagine. The
|
||||||
standard module :mod:`string` contains some useful operations for padding
|
standard module :mod:`string` contains some useful operations for padding
|
||||||
strings to a given column width; these will be discussed shortly. The second
|
strings to a given column width; these will be discussed shortly. The second
|
||||||
way is to use the ``%`` operator with a string as the left argument. The ``%``
|
way is to use the :meth:`str.format` method.
|
||||||
operator interprets the left argument much like a :cfunc:`sprintf`\ -style
|
|
||||||
format string to be applied to the right argument, and returns the string
|
|
||||||
resulting from this formatting operation.
|
|
||||||
|
|
||||||
One question remains, of course: how do you convert values to strings? Luckily,
|
One question remains, of course: how do you convert values to strings? Luckily,
|
||||||
Python has ways to convert any value to a string: pass it to the :func:`repr`
|
Python has ways to convert any value to a string: pass it to the :func:`repr`
|
||||||
or :func:`str` functions. Reverse quotes (``````) are equivalent to
|
or :func:`str` functions. Reverse quotes (``````) are equivalent to
|
||||||
:func:`repr`, but they are no longer used in modern Python code and will likely
|
:func:`repr`, but they are no longer used in modern Python code and are removed
|
||||||
not be in future versions of the language.
|
in future versions of the language.
|
||||||
|
|
||||||
The :func:`str` function is meant to return representations of values which are
|
The :func:`str` function is meant to return representations of values which are
|
||||||
fairly human-readable, while :func:`repr` is meant to generate representations
|
fairly human-readable, while :func:`repr` is meant to generate representations
|
||||||
|
@ -94,7 +91,7 @@ Here are two ways to write a table of squares and cubes::
|
||||||
10 100 1000
|
10 100 1000
|
||||||
|
|
||||||
>>> for x in range(1,11):
|
>>> for x in range(1,11):
|
||||||
... print '%2d %3d %4d' % (x, x*x, x*x*x)
|
... print '{0:2d} {1:3d} {2:4d}'.format(x, x*x, x*x*x)
|
||||||
...
|
...
|
||||||
1 1 1
|
1 1 1
|
||||||
2 4 8
|
2 4 8
|
||||||
|
@ -129,42 +126,91 @@ with zeros. It understands about plus and minus signs::
|
||||||
>>> '3.14159265359'.zfill(5)
|
>>> '3.14159265359'.zfill(5)
|
||||||
'3.14159265359'
|
'3.14159265359'
|
||||||
|
|
||||||
Using the ``%`` operator looks like this::
|
Basic usage of the :meth:`str.format` method looks like this::
|
||||||
|
|
||||||
|
>>> print 'We are the {0} who say "{1}!"'.format('knights', 'Ni')
|
||||||
|
We are the knights who say "Ni!"
|
||||||
|
|
||||||
|
The brackets and characters within them (called format fields) are replaced with
|
||||||
|
the objects passed into the format method. The number in the brackets refers to
|
||||||
|
the position of the object passed into the format method. ::
|
||||||
|
|
||||||
|
>>> print '{0} and {1}'.format('spam', 'eggs')
|
||||||
|
spam and eggs
|
||||||
|
>>> print '{1} and {0}'.format('spam', 'eggs')
|
||||||
|
eggs and spam
|
||||||
|
|
||||||
|
If keyword arguments are used in the format method, their values are referred to
|
||||||
|
by using the name of the argument. ::
|
||||||
|
|
||||||
|
>>> print 'This {food} is {adjective}.'.format(food='spam', adjective='absolutely horrible')
|
||||||
|
This spam is absolutely horrible.
|
||||||
|
|
||||||
|
Positional and keyword arguments can be arbitrarily combined::
|
||||||
|
|
||||||
|
>>> print 'The story of {0}, {1}, and {other}.'.format('Bill', 'Manfred', other='Georg')
|
||||||
|
The story of Bill, Manfred, and Georg.
|
||||||
|
|
||||||
|
An optional ``':``` and format specifier can follow the field name. This also
|
||||||
|
greater control over how the value is formatted. The following example
|
||||||
|
truncates the Pi to three places after the decimal.
|
||||||
|
|
||||||
>>> import math
|
>>> import math
|
||||||
>>> print 'The value of PI is approximately %5.3f.' % math.pi
|
>>> print 'The value of PI is approximately {0:.3f}.'.format(math.pi)
|
||||||
The value of PI is approximately 3.142.
|
The value of PI is approximately 3.142.
|
||||||
|
|
||||||
If there is more than one format in the string, you need to pass a tuple as
|
Passing an integer after the ``':'`` will cause that field to be a minimum
|
||||||
right operand, as in this example::
|
number of characters wide. This is useful for making tables pretty.::
|
||||||
|
|
||||||
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
|
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 7678}
|
||||||
>>> for name, phone in table.items():
|
>>> for name, phone in table.items():
|
||||||
... print '%-10s ==> %10d' % (name, phone)
|
... print '{0:10} ==> {1:10d}'.format(name, phone)
|
||||||
...
|
...
|
||||||
Jack ==> 4098
|
Jack ==> 4098
|
||||||
Dcab ==> 7678
|
Dcab ==> 7678
|
||||||
Sjoerd ==> 4127
|
Sjoerd ==> 4127
|
||||||
|
|
||||||
Most formats work exactly as in C and require that you pass the proper type;
|
|
||||||
however, if you don't you get an exception, not a core dump. The ``%s`` format
|
|
||||||
is more relaxed: if the corresponding argument is not a string object, it is
|
|
||||||
converted to string using the :func:`str` built-in function. Using ``*`` to
|
|
||||||
pass the width or precision in as a separate (integer) argument is supported.
|
|
||||||
The C formats ``%n`` and ``%p`` are not supported.
|
|
||||||
|
|
||||||
If you have a really long format string that you don't want to split up, it
|
If you have a really long format string that you don't want to split up, it
|
||||||
would be nice if you could reference the variables to be formatted by name
|
would be nice if you could reference the variables to be formatted by name
|
||||||
instead of by position. This can be done by using form ``%(name)format``, as
|
instead of by position. This can be done by simply passing the dict and using
|
||||||
shown here::
|
square brackets ``'[]'`` to access the keys ::
|
||||||
|
|
||||||
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
|
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
|
||||||
>>> print 'Jack: %(Jack)d; Sjoerd: %(Sjoerd)d; Dcab: %(Dcab)d' % table
|
>>> print 'Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d}; Dcab: {0[Dcab]:d}'.format(table)
|
||||||
|
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
|
||||||
|
|
||||||
|
This could also be done by passing the table as keyword arguments with the '**'
|
||||||
|
notation.::
|
||||||
|
|
||||||
|
>>> table = {'Sjoerd': 4127, 'Jack': 4098, 'Dcab': 8637678}
|
||||||
|
>>> print 'Jack: {Jack:d}; Sjoerd: {Sjoerd:d}; Dcab: {Dcab:d}'.format(**table)
|
||||||
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
|
Jack: 4098; Sjoerd: 4127; Dcab: 8637678
|
||||||
|
|
||||||
This is particularly useful in combination with the new built-in :func:`vars`
|
This is particularly useful in combination with the new built-in :func:`vars`
|
||||||
function, which returns a dictionary containing all local variables.
|
function, which returns a dictionary containing all local variables.
|
||||||
|
|
||||||
|
For a complete overview of string formating with :meth:`str.format`, see
|
||||||
|
:ref:`formatstrings`.
|
||||||
|
|
||||||
|
|
||||||
|
Old string formatting
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
The ``%`` operator can also be used for string formatting. It interprets the
|
||||||
|
left argument much like a :cfunc:`sprintf`\ -style format string to be applied
|
||||||
|
to the right argument, and returns the string resulting from this formatting
|
||||||
|
operation. For example::
|
||||||
|
|
||||||
|
>>> import math
|
||||||
|
>>> print 'The value of PI is approximately %5.3f.' % math.pi
|
||||||
|
The value of PI is approximately 3.142.
|
||||||
|
|
||||||
|
Since :meth:`str.format` is quite new, a lot of Python code still uses the ``%``
|
||||||
|
operator. However, because this old style of formatting will eventually removed
|
||||||
|
from the language :meth:`str.format` should generally be used.
|
||||||
|
|
||||||
|
More information can be found in the :ref:`string-formatting` section.
|
||||||
|
|
||||||
|
|
||||||
.. _tut-files:
|
.. _tut-files:
|
||||||
|
|
||||||
|
|
|
@ -372,9 +372,13 @@ The built-in function :func:`len` returns the length of a string::
|
||||||
Both strings and Unicode strings support a large number of methods for
|
Both strings and Unicode strings support a large number of methods for
|
||||||
basic transformations and searching.
|
basic transformations and searching.
|
||||||
|
|
||||||
|
:ref:`new-string-formatting`
|
||||||
|
Information about string formatting with :meth:`str.format` is described
|
||||||
|
here.
|
||||||
|
|
||||||
:ref:`string-formatting`
|
:ref:`string-formatting`
|
||||||
The formatting operations invoked when strings and Unicode strings are the
|
The old formatting operations invoked when strings and Unicode strings are
|
||||||
left operand of the ``%`` operator are described in more detail here.
|
the left operand of the ``%`` operator are described in more detail here.
|
||||||
|
|
||||||
|
|
||||||
.. _tut-unicodestrings:
|
.. _tut-unicodestrings:
|
||||||
|
|
|
@ -116,7 +116,7 @@ placeholders such as the current date, image sequence number, or file format::
|
||||||
>>> for i, filename in enumerate(photofiles):
|
>>> for i, filename in enumerate(photofiles):
|
||||||
... base, ext = os.path.splitext(filename)
|
... base, ext = os.path.splitext(filename)
|
||||||
... newname = t.substitute(d=date, n=i, f=ext)
|
... newname = t.substitute(d=date, n=i, f=ext)
|
||||||
... print '%s --> %s' % (filename, newname)
|
... print '{0} --> {1}'.format(filename, newname)
|
||||||
|
|
||||||
img_1074.jpg --> Ashley_0.jpg
|
img_1074.jpg --> Ashley_0.jpg
|
||||||
img_1076.jpg --> Ashley_1.jpg
|
img_1076.jpg --> Ashley_1.jpg
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue