xref: /third_party/python/Doc/howto/functional.rst (revision 7db96d56)
17db96d56Sopenharmony_ci********************************
27db96d56Sopenharmony_ci  Functional Programming HOWTO
37db96d56Sopenharmony_ci********************************
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ci:Author: A. M. Kuchling
67db96d56Sopenharmony_ci:Release: 0.32
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ciIn this document, we'll take a tour of Python's features suitable for
97db96d56Sopenharmony_ciimplementing programs in a functional style.  After an introduction to the
107db96d56Sopenharmony_ciconcepts of functional programming, we'll look at language features such as
117db96d56Sopenharmony_ci:term:`iterator`\s and :term:`generator`\s and relevant library modules such as
127db96d56Sopenharmony_ci:mod:`itertools` and :mod:`functools`.
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ciIntroduction
167db96d56Sopenharmony_ci============
177db96d56Sopenharmony_ci
187db96d56Sopenharmony_ciThis section explains the basic concept of functional programming; if
197db96d56Sopenharmony_ciyou're just interested in learning about Python language features,
207db96d56Sopenharmony_ciskip to the next section on :ref:`functional-howto-iterators`.
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ciProgramming languages support decomposing problems in several different ways:
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci* Most programming languages are **procedural**: programs are lists of
257db96d56Sopenharmony_ci  instructions that tell the computer what to do with the program's input.  C,
267db96d56Sopenharmony_ci  Pascal, and even Unix shells are procedural languages.
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci* In **declarative** languages, you write a specification that describes the
297db96d56Sopenharmony_ci  problem to be solved, and the language implementation figures out how to
307db96d56Sopenharmony_ci  perform the computation efficiently.  SQL is the declarative language you're
317db96d56Sopenharmony_ci  most likely to be familiar with; a SQL query describes the data set you want
327db96d56Sopenharmony_ci  to retrieve, and the SQL engine decides whether to scan tables or use indexes,
337db96d56Sopenharmony_ci  which subclauses should be performed first, etc.
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci* **Object-oriented** programs manipulate collections of objects.  Objects have
367db96d56Sopenharmony_ci  internal state and support methods that query or modify this internal state in
377db96d56Sopenharmony_ci  some way. Smalltalk and Java are object-oriented languages.  C++ and Python
387db96d56Sopenharmony_ci  are languages that support object-oriented programming, but don't force the
397db96d56Sopenharmony_ci  use of object-oriented features.
407db96d56Sopenharmony_ci
417db96d56Sopenharmony_ci* **Functional** programming decomposes a problem into a set of functions.
427db96d56Sopenharmony_ci  Ideally, functions only take inputs and produce outputs, and don't have any
437db96d56Sopenharmony_ci  internal state that affects the output produced for a given input.  Well-known
447db96d56Sopenharmony_ci  functional languages include the ML family (Standard ML, OCaml, and other
457db96d56Sopenharmony_ci  variants) and Haskell.
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ciThe designers of some computer languages choose to emphasize one
487db96d56Sopenharmony_ciparticular approach to programming.  This often makes it difficult to
497db96d56Sopenharmony_ciwrite programs that use a different approach.  Other languages are
507db96d56Sopenharmony_cimulti-paradigm languages that support several different approaches.
517db96d56Sopenharmony_ciLisp, C++, and Python are multi-paradigm; you can write programs or
527db96d56Sopenharmony_cilibraries that are largely procedural, object-oriented, or functional
537db96d56Sopenharmony_ciin all of these languages.  In a large program, different sections
547db96d56Sopenharmony_cimight be written using different approaches; the GUI might be
557db96d56Sopenharmony_ciobject-oriented while the processing logic is procedural or
567db96d56Sopenharmony_cifunctional, for example.
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ciIn a functional program, input flows through a set of functions. Each function
597db96d56Sopenharmony_cioperates on its input and produces some output.  Functional style discourages
607db96d56Sopenharmony_cifunctions with side effects that modify internal state or make other changes
617db96d56Sopenharmony_cithat aren't visible in the function's return value.  Functions that have no side
627db96d56Sopenharmony_cieffects at all are called **purely functional**.  Avoiding side effects means
637db96d56Sopenharmony_cinot using data structures that get updated as a program runs; every function's
647db96d56Sopenharmony_cioutput must only depend on its input.
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ciSome languages are very strict about purity and don't even have assignment
677db96d56Sopenharmony_cistatements such as ``a=3`` or ``c = a + b``, but it's difficult to avoid all
687db96d56Sopenharmony_ciside effects, such as printing to the screen or writing to a disk file. Another
697db96d56Sopenharmony_ciexample is a call to the :func:`print` or :func:`time.sleep` function, neither
707db96d56Sopenharmony_ciof which returns a useful value. Both are called only for their side effects
717db96d56Sopenharmony_ciof sending some text to the screen or pausing execution for a second.
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ciPython programs written in functional style usually won't go to the extreme of
747db96d56Sopenharmony_ciavoiding all I/O or all assignments; instead, they'll provide a
757db96d56Sopenharmony_cifunctional-appearing interface but will use non-functional features internally.
767db96d56Sopenharmony_ciFor example, the implementation of a function will still use assignments to
777db96d56Sopenharmony_cilocal variables, but won't modify global variables or have other side effects.
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ciFunctional programming can be considered the opposite of object-oriented
807db96d56Sopenharmony_ciprogramming.  Objects are little capsules containing some internal state along
817db96d56Sopenharmony_ciwith a collection of method calls that let you modify this state, and programs
827db96d56Sopenharmony_ciconsist of making the right set of state changes.  Functional programming wants
837db96d56Sopenharmony_cito avoid state changes as much as possible and works with data flowing between
847db96d56Sopenharmony_cifunctions.  In Python you might combine the two approaches by writing functions
857db96d56Sopenharmony_cithat take and return instances representing objects in your application (e-mail
867db96d56Sopenharmony_cimessages, transactions, etc.).
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ciFunctional design may seem like an odd constraint to work under.  Why should you
897db96d56Sopenharmony_ciavoid objects and side effects?  There are theoretical and practical advantages
907db96d56Sopenharmony_cito the functional style:
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci* Formal provability.
937db96d56Sopenharmony_ci* Modularity.
947db96d56Sopenharmony_ci* Composability.
957db96d56Sopenharmony_ci* Ease of debugging and testing.
967db96d56Sopenharmony_ci
977db96d56Sopenharmony_ci
987db96d56Sopenharmony_ciFormal provability
997db96d56Sopenharmony_ci------------------
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ciA theoretical benefit is that it's easier to construct a mathematical proof that
1027db96d56Sopenharmony_cia functional program is correct.
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_ciFor a long time researchers have been interested in finding ways to
1057db96d56Sopenharmony_cimathematically prove programs correct.  This is different from testing a program
1067db96d56Sopenharmony_cion numerous inputs and concluding that its output is usually correct, or reading
1077db96d56Sopenharmony_cia program's source code and concluding that the code looks right; the goal is
1087db96d56Sopenharmony_ciinstead a rigorous proof that a program produces the right result for all
1097db96d56Sopenharmony_cipossible inputs.
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ciThe technique used to prove programs correct is to write down **invariants**,
1127db96d56Sopenharmony_ciproperties of the input data and of the program's variables that are always
1137db96d56Sopenharmony_citrue.  For each line of code, you then show that if invariants X and Y are true
1147db96d56Sopenharmony_ci**before** the line is executed, the slightly different invariants X' and Y' are
1157db96d56Sopenharmony_citrue **after** the line is executed.  This continues until you reach the end of
1167db96d56Sopenharmony_cithe program, at which point the invariants should match the desired conditions
1177db96d56Sopenharmony_cion the program's output.
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ciFunctional programming's avoidance of assignments arose because assignments are
1207db96d56Sopenharmony_cidifficult to handle with this technique; assignments can break invariants that
1217db96d56Sopenharmony_ciwere true before the assignment without producing any new invariants that can be
1227db96d56Sopenharmony_cipropagated onward.
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ciUnfortunately, proving programs correct is largely impractical and not relevant
1257db96d56Sopenharmony_cito Python software. Even trivial programs require proofs that are several pages
1267db96d56Sopenharmony_cilong; the proof of correctness for a moderately complicated program would be
1277db96d56Sopenharmony_cienormous, and few or none of the programs you use daily (the Python interpreter,
1287db96d56Sopenharmony_ciyour XML parser, your web browser) could be proven correct.  Even if you wrote
1297db96d56Sopenharmony_cidown or generated a proof, there would then be the question of verifying the
1307db96d56Sopenharmony_ciproof; maybe there's an error in it, and you wrongly believe you've proved the
1317db96d56Sopenharmony_ciprogram correct.
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ciModularity
1357db96d56Sopenharmony_ci----------
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_ciA more practical benefit of functional programming is that it forces you to
1387db96d56Sopenharmony_cibreak apart your problem into small pieces.  Programs are more modular as a
1397db96d56Sopenharmony_ciresult.  It's easier to specify and write a small function that does one thing
1407db96d56Sopenharmony_cithan a large function that performs a complicated transformation.  Small
1417db96d56Sopenharmony_cifunctions are also easier to read and to check for errors.
1427db96d56Sopenharmony_ci
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ciEase of debugging and testing
1457db96d56Sopenharmony_ci-----------------------------
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ciTesting and debugging a functional-style program is easier.
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ciDebugging is simplified because functions are generally small and clearly
1507db96d56Sopenharmony_cispecified.  When a program doesn't work, each function is an interface point
1517db96d56Sopenharmony_ciwhere you can check that the data are correct.  You can look at the intermediate
1527db96d56Sopenharmony_ciinputs and outputs to quickly isolate the function that's responsible for a bug.
1537db96d56Sopenharmony_ci
1547db96d56Sopenharmony_ciTesting is easier because each function is a potential subject for a unit test.
1557db96d56Sopenharmony_ciFunctions don't depend on system state that needs to be replicated before
1567db96d56Sopenharmony_cirunning a test; instead you only have to synthesize the right input and then
1577db96d56Sopenharmony_cicheck that the output matches expectations.
1587db96d56Sopenharmony_ci
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ciComposability
1617db96d56Sopenharmony_ci-------------
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ciAs you work on a functional-style program, you'll write a number of functions
1647db96d56Sopenharmony_ciwith varying inputs and outputs.  Some of these functions will be unavoidably
1657db96d56Sopenharmony_cispecialized to a particular application, but others will be useful in a wide
1667db96d56Sopenharmony_civariety of programs.  For example, a function that takes a directory path and
1677db96d56Sopenharmony_cireturns all the XML files in the directory, or a function that takes a filename
1687db96d56Sopenharmony_ciand returns its contents, can be applied to many different situations.
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ciOver time you'll form a personal library of utilities.  Often you'll assemble
1717db96d56Sopenharmony_cinew programs by arranging existing functions in a new configuration and writing
1727db96d56Sopenharmony_cia few functions specialized for the current task.
1737db96d56Sopenharmony_ci
1747db96d56Sopenharmony_ci
1757db96d56Sopenharmony_ci.. _functional-howto-iterators:
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_ciIterators
1787db96d56Sopenharmony_ci=========
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ciI'll start by looking at a Python language feature that's an important
1817db96d56Sopenharmony_cifoundation for writing functional-style programs: iterators.
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ciAn iterator is an object representing a stream of data; this object returns the
1847db96d56Sopenharmony_cidata one element at a time.  A Python iterator must support a method called
1857db96d56Sopenharmony_ci:meth:`~iterator.__next__` that takes no arguments and always returns the next
1867db96d56Sopenharmony_cielement of the stream.  If there are no more elements in the stream,
1877db96d56Sopenharmony_ci:meth:`~iterator.__next__` must raise the :exc:`StopIteration` exception.
1887db96d56Sopenharmony_ciIterators don't have to be finite, though; it's perfectly reasonable to write
1897db96d56Sopenharmony_cian iterator that produces an infinite stream of data.
1907db96d56Sopenharmony_ci
1917db96d56Sopenharmony_ciThe built-in :func:`iter` function takes an arbitrary object and tries to return
1927db96d56Sopenharmony_cian iterator that will return the object's contents or elements, raising
1937db96d56Sopenharmony_ci:exc:`TypeError` if the object doesn't support iteration.  Several of Python's
1947db96d56Sopenharmony_cibuilt-in data types support iteration, the most common being lists and
1957db96d56Sopenharmony_cidictionaries.  An object is called :term:`iterable` if you can get an iterator
1967db96d56Sopenharmony_cifor it.
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ciYou can experiment with the iteration interface manually:
1997db96d56Sopenharmony_ci
2007db96d56Sopenharmony_ci    >>> L = [1, 2, 3]
2017db96d56Sopenharmony_ci    >>> it = iter(L)
2027db96d56Sopenharmony_ci    >>> it  #doctest: +ELLIPSIS
2037db96d56Sopenharmony_ci    <...iterator object at ...>
2047db96d56Sopenharmony_ci    >>> it.__next__()  # same as next(it)
2057db96d56Sopenharmony_ci    1
2067db96d56Sopenharmony_ci    >>> next(it)
2077db96d56Sopenharmony_ci    2
2087db96d56Sopenharmony_ci    >>> next(it)
2097db96d56Sopenharmony_ci    3
2107db96d56Sopenharmony_ci    >>> next(it)
2117db96d56Sopenharmony_ci    Traceback (most recent call last):
2127db96d56Sopenharmony_ci      File "<stdin>", line 1, in <module>
2137db96d56Sopenharmony_ci    StopIteration
2147db96d56Sopenharmony_ci    >>>
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ciPython expects iterable objects in several different contexts, the most
2177db96d56Sopenharmony_ciimportant being the :keyword:`for` statement.  In the statement ``for X in Y``,
2187db96d56Sopenharmony_ciY must be an iterator or some object for which :func:`iter` can create an
2197db96d56Sopenharmony_ciiterator.  These two statements are equivalent::
2207db96d56Sopenharmony_ci
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci    for i in iter(obj):
2237db96d56Sopenharmony_ci        print(i)
2247db96d56Sopenharmony_ci
2257db96d56Sopenharmony_ci    for i in obj:
2267db96d56Sopenharmony_ci        print(i)
2277db96d56Sopenharmony_ci
2287db96d56Sopenharmony_ciIterators can be materialized as lists or tuples by using the :func:`list` or
2297db96d56Sopenharmony_ci:func:`tuple` constructor functions:
2307db96d56Sopenharmony_ci
2317db96d56Sopenharmony_ci    >>> L = [1, 2, 3]
2327db96d56Sopenharmony_ci    >>> iterator = iter(L)
2337db96d56Sopenharmony_ci    >>> t = tuple(iterator)
2347db96d56Sopenharmony_ci    >>> t
2357db96d56Sopenharmony_ci    (1, 2, 3)
2367db96d56Sopenharmony_ci
2377db96d56Sopenharmony_ciSequence unpacking also supports iterators: if you know an iterator will return
2387db96d56Sopenharmony_ciN elements, you can unpack them into an N-tuple:
2397db96d56Sopenharmony_ci
2407db96d56Sopenharmony_ci    >>> L = [1, 2, 3]
2417db96d56Sopenharmony_ci    >>> iterator = iter(L)
2427db96d56Sopenharmony_ci    >>> a, b, c = iterator
2437db96d56Sopenharmony_ci    >>> a, b, c
2447db96d56Sopenharmony_ci    (1, 2, 3)
2457db96d56Sopenharmony_ci
2467db96d56Sopenharmony_ciBuilt-in functions such as :func:`max` and :func:`min` can take a single
2477db96d56Sopenharmony_ciiterator argument and will return the largest or smallest element.  The ``"in"``
2487db96d56Sopenharmony_ciand ``"not in"`` operators also support iterators: ``X in iterator`` is true if
2497db96d56Sopenharmony_ciX is found in the stream returned by the iterator.  You'll run into obvious
2507db96d56Sopenharmony_ciproblems if the iterator is infinite; :func:`max`, :func:`min`
2517db96d56Sopenharmony_ciwill never return, and if the element X never appears in the stream, the
2527db96d56Sopenharmony_ci``"in"`` and ``"not in"`` operators won't return either.
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ciNote that you can only go forward in an iterator; there's no way to get the
2557db96d56Sopenharmony_ciprevious element, reset the iterator, or make a copy of it.  Iterator objects
2567db96d56Sopenharmony_cican optionally provide these additional capabilities, but the iterator protocol
2577db96d56Sopenharmony_cionly specifies the :meth:`~iterator.__next__` method.  Functions may therefore
2587db96d56Sopenharmony_ciconsume all of the iterator's output, and if you need to do something different
2597db96d56Sopenharmony_ciwith the same stream, you'll have to create a new iterator.
2607db96d56Sopenharmony_ci
2617db96d56Sopenharmony_ci
2627db96d56Sopenharmony_ci
2637db96d56Sopenharmony_ciData Types That Support Iterators
2647db96d56Sopenharmony_ci---------------------------------
2657db96d56Sopenharmony_ci
2667db96d56Sopenharmony_ciWe've already seen how lists and tuples support iterators.  In fact, any Python
2677db96d56Sopenharmony_cisequence type, such as strings, will automatically support creation of an
2687db96d56Sopenharmony_ciiterator.
2697db96d56Sopenharmony_ci
2707db96d56Sopenharmony_ciCalling :func:`iter` on a dictionary returns an iterator that will loop over the
2717db96d56Sopenharmony_cidictionary's keys::
2727db96d56Sopenharmony_ci
2737db96d56Sopenharmony_ci    >>> m = {'Jan': 1, 'Feb': 2, 'Mar': 3, 'Apr': 4, 'May': 5, 'Jun': 6,
2747db96d56Sopenharmony_ci    ...      'Jul': 7, 'Aug': 8, 'Sep': 9, 'Oct': 10, 'Nov': 11, 'Dec': 12}
2757db96d56Sopenharmony_ci    >>> for key in m:
2767db96d56Sopenharmony_ci    ...     print(key, m[key])
2777db96d56Sopenharmony_ci    Jan 1
2787db96d56Sopenharmony_ci    Feb 2
2797db96d56Sopenharmony_ci    Mar 3
2807db96d56Sopenharmony_ci    Apr 4
2817db96d56Sopenharmony_ci    May 5
2827db96d56Sopenharmony_ci    Jun 6
2837db96d56Sopenharmony_ci    Jul 7
2847db96d56Sopenharmony_ci    Aug 8
2857db96d56Sopenharmony_ci    Sep 9
2867db96d56Sopenharmony_ci    Oct 10
2877db96d56Sopenharmony_ci    Nov 11
2887db96d56Sopenharmony_ci    Dec 12
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ciNote that starting with Python 3.7, dictionary iteration order is guaranteed
2917db96d56Sopenharmony_cito be the same as the insertion order. In earlier versions, the behaviour was
2927db96d56Sopenharmony_ciunspecified and could vary between implementations.
2937db96d56Sopenharmony_ci
2947db96d56Sopenharmony_ciApplying :func:`iter` to a dictionary always loops over the keys, but
2957db96d56Sopenharmony_cidictionaries have methods that return other iterators.  If you want to iterate
2967db96d56Sopenharmony_ciover values or key/value pairs, you can explicitly call the
2977db96d56Sopenharmony_ci:meth:`~dict.values` or :meth:`~dict.items` methods to get an appropriate
2987db96d56Sopenharmony_ciiterator.
2997db96d56Sopenharmony_ci
3007db96d56Sopenharmony_ciThe :func:`dict` constructor can accept an iterator that returns a finite stream
3017db96d56Sopenharmony_ciof ``(key, value)`` tuples:
3027db96d56Sopenharmony_ci
3037db96d56Sopenharmony_ci    >>> L = [('Italy', 'Rome'), ('France', 'Paris'), ('US', 'Washington DC')]
3047db96d56Sopenharmony_ci    >>> dict(iter(L))
3057db96d56Sopenharmony_ci    {'Italy': 'Rome', 'France': 'Paris', 'US': 'Washington DC'}
3067db96d56Sopenharmony_ci
3077db96d56Sopenharmony_ciFiles also support iteration by calling the :meth:`~io.TextIOBase.readline`
3087db96d56Sopenharmony_cimethod until there are no more lines in the file.  This means you can read each
3097db96d56Sopenharmony_ciline of a file like this::
3107db96d56Sopenharmony_ci
3117db96d56Sopenharmony_ci    for line in file:
3127db96d56Sopenharmony_ci        # do something for each line
3137db96d56Sopenharmony_ci        ...
3147db96d56Sopenharmony_ci
3157db96d56Sopenharmony_ciSets can take their contents from an iterable and let you iterate over the set's
3167db96d56Sopenharmony_cielements::
3177db96d56Sopenharmony_ci
3187db96d56Sopenharmony_ci    >>> S = {2, 3, 5, 7, 11, 13}
3197db96d56Sopenharmony_ci    >>> for i in S:
3207db96d56Sopenharmony_ci    ...     print(i)
3217db96d56Sopenharmony_ci    2
3227db96d56Sopenharmony_ci    3
3237db96d56Sopenharmony_ci    5
3247db96d56Sopenharmony_ci    7
3257db96d56Sopenharmony_ci    11
3267db96d56Sopenharmony_ci    13
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci
3297db96d56Sopenharmony_ci
3307db96d56Sopenharmony_ciGenerator expressions and list comprehensions
3317db96d56Sopenharmony_ci=============================================
3327db96d56Sopenharmony_ci
3337db96d56Sopenharmony_ciTwo common operations on an iterator's output are 1) performing some operation
3347db96d56Sopenharmony_cifor every element, 2) selecting a subset of elements that meet some condition.
3357db96d56Sopenharmony_ciFor example, given a list of strings, you might want to strip off trailing
3367db96d56Sopenharmony_ciwhitespace from each line or extract all the strings containing a given
3377db96d56Sopenharmony_cisubstring.
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ciList comprehensions and generator expressions (short form: "listcomps" and
3407db96d56Sopenharmony_ci"genexps") are a concise notation for such operations, borrowed from the
3417db96d56Sopenharmony_cifunctional programming language Haskell (https://www.haskell.org/).  You can strip
3427db96d56Sopenharmony_ciall the whitespace from a stream of strings with the following code::
3437db96d56Sopenharmony_ci
3447db96d56Sopenharmony_ci    >>> line_list = ['  line 1\n', 'line 2  \n', ' \n', '']
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ci    >>> # Generator expression -- returns iterator
3477db96d56Sopenharmony_ci    >>> stripped_iter = (line.strip() for line in line_list)
3487db96d56Sopenharmony_ci
3497db96d56Sopenharmony_ci    >>> # List comprehension -- returns list
3507db96d56Sopenharmony_ci    >>> stripped_list = [line.strip() for line in line_list]
3517db96d56Sopenharmony_ci
3527db96d56Sopenharmony_ciYou can select only certain elements by adding an ``"if"`` condition::
3537db96d56Sopenharmony_ci
3547db96d56Sopenharmony_ci    >>> stripped_list = [line.strip() for line in line_list
3557db96d56Sopenharmony_ci    ...                  if line != ""]
3567db96d56Sopenharmony_ci
3577db96d56Sopenharmony_ciWith a list comprehension, you get back a Python list; ``stripped_list`` is a
3587db96d56Sopenharmony_cilist containing the resulting lines, not an iterator.  Generator expressions
3597db96d56Sopenharmony_cireturn an iterator that computes the values as necessary, not needing to
3607db96d56Sopenharmony_cimaterialize all the values at once.  This means that list comprehensions aren't
3617db96d56Sopenharmony_ciuseful if you're working with iterators that return an infinite stream or a very
3627db96d56Sopenharmony_cilarge amount of data.  Generator expressions are preferable in these situations.
3637db96d56Sopenharmony_ci
3647db96d56Sopenharmony_ciGenerator expressions are surrounded by parentheses ("()") and list
3657db96d56Sopenharmony_cicomprehensions are surrounded by square brackets ("[]").  Generator expressions
3667db96d56Sopenharmony_cihave the form::
3677db96d56Sopenharmony_ci
3687db96d56Sopenharmony_ci    ( expression for expr in sequence1
3697db96d56Sopenharmony_ci                 if condition1
3707db96d56Sopenharmony_ci                 for expr2 in sequence2
3717db96d56Sopenharmony_ci                 if condition2
3727db96d56Sopenharmony_ci                 for expr3 in sequence3
3737db96d56Sopenharmony_ci                 ...
3747db96d56Sopenharmony_ci                 if condition3
3757db96d56Sopenharmony_ci                 for exprN in sequenceN
3767db96d56Sopenharmony_ci                 if conditionN )
3777db96d56Sopenharmony_ci
3787db96d56Sopenharmony_ciAgain, for a list comprehension only the outside brackets are different (square
3797db96d56Sopenharmony_cibrackets instead of parentheses).
3807db96d56Sopenharmony_ci
3817db96d56Sopenharmony_ciThe elements of the generated output will be the successive values of
3827db96d56Sopenharmony_ci``expression``.  The ``if`` clauses are all optional; if present, ``expression``
3837db96d56Sopenharmony_ciis only evaluated and added to the result when ``condition`` is true.
3847db96d56Sopenharmony_ci
3857db96d56Sopenharmony_ciGenerator expressions always have to be written inside parentheses, but the
3867db96d56Sopenharmony_ciparentheses signalling a function call also count.  If you want to create an
3877db96d56Sopenharmony_ciiterator that will be immediately passed to a function you can write::
3887db96d56Sopenharmony_ci
3897db96d56Sopenharmony_ci    obj_total = sum(obj.count for obj in list_all_objects())
3907db96d56Sopenharmony_ci
3917db96d56Sopenharmony_ciThe ``for...in`` clauses contain the sequences to be iterated over.  The
3927db96d56Sopenharmony_cisequences do not have to be the same length, because they are iterated over from
3937db96d56Sopenharmony_cileft to right, **not** in parallel.  For each element in ``sequence1``,
3947db96d56Sopenharmony_ci``sequence2`` is looped over from the beginning.  ``sequence3`` is then looped
3957db96d56Sopenharmony_ciover for each resulting pair of elements from ``sequence1`` and ``sequence2``.
3967db96d56Sopenharmony_ci
3977db96d56Sopenharmony_ciTo put it another way, a list comprehension or generator expression is
3987db96d56Sopenharmony_ciequivalent to the following Python code::
3997db96d56Sopenharmony_ci
4007db96d56Sopenharmony_ci    for expr1 in sequence1:
4017db96d56Sopenharmony_ci        if not (condition1):
4027db96d56Sopenharmony_ci            continue   # Skip this element
4037db96d56Sopenharmony_ci        for expr2 in sequence2:
4047db96d56Sopenharmony_ci            if not (condition2):
4057db96d56Sopenharmony_ci                continue   # Skip this element
4067db96d56Sopenharmony_ci            ...
4077db96d56Sopenharmony_ci            for exprN in sequenceN:
4087db96d56Sopenharmony_ci                if not (conditionN):
4097db96d56Sopenharmony_ci                    continue   # Skip this element
4107db96d56Sopenharmony_ci
4117db96d56Sopenharmony_ci                # Output the value of
4127db96d56Sopenharmony_ci                # the expression.
4137db96d56Sopenharmony_ci
4147db96d56Sopenharmony_ciThis means that when there are multiple ``for...in`` clauses but no ``if``
4157db96d56Sopenharmony_ciclauses, the length of the resulting output will be equal to the product of the
4167db96d56Sopenharmony_cilengths of all the sequences.  If you have two lists of length 3, the output
4177db96d56Sopenharmony_cilist is 9 elements long:
4187db96d56Sopenharmony_ci
4197db96d56Sopenharmony_ci    >>> seq1 = 'abc'
4207db96d56Sopenharmony_ci    >>> seq2 = (1, 2, 3)
4217db96d56Sopenharmony_ci    >>> [(x, y) for x in seq1 for y in seq2]  #doctest: +NORMALIZE_WHITESPACE
4227db96d56Sopenharmony_ci    [('a', 1), ('a', 2), ('a', 3),
4237db96d56Sopenharmony_ci     ('b', 1), ('b', 2), ('b', 3),
4247db96d56Sopenharmony_ci     ('c', 1), ('c', 2), ('c', 3)]
4257db96d56Sopenharmony_ci
4267db96d56Sopenharmony_ciTo avoid introducing an ambiguity into Python's grammar, if ``expression`` is
4277db96d56Sopenharmony_cicreating a tuple, it must be surrounded with parentheses.  The first list
4287db96d56Sopenharmony_cicomprehension below is a syntax error, while the second one is correct::
4297db96d56Sopenharmony_ci
4307db96d56Sopenharmony_ci    # Syntax error
4317db96d56Sopenharmony_ci    [x, y for x in seq1 for y in seq2]
4327db96d56Sopenharmony_ci    # Correct
4337db96d56Sopenharmony_ci    [(x, y) for x in seq1 for y in seq2]
4347db96d56Sopenharmony_ci
4357db96d56Sopenharmony_ci
4367db96d56Sopenharmony_ciGenerators
4377db96d56Sopenharmony_ci==========
4387db96d56Sopenharmony_ci
4397db96d56Sopenharmony_ciGenerators are a special class of functions that simplify the task of writing
4407db96d56Sopenharmony_ciiterators.  Regular functions compute a value and return it, but generators
4417db96d56Sopenharmony_cireturn an iterator that returns a stream of values.
4427db96d56Sopenharmony_ci
4437db96d56Sopenharmony_ciYou're doubtless familiar with how regular function calls work in Python or C.
4447db96d56Sopenharmony_ciWhen you call a function, it gets a private namespace where its local variables
4457db96d56Sopenharmony_ciare created.  When the function reaches a ``return`` statement, the local
4467db96d56Sopenharmony_civariables are destroyed and the value is returned to the caller.  A later call
4477db96d56Sopenharmony_cito the same function creates a new private namespace and a fresh set of local
4487db96d56Sopenharmony_civariables. But, what if the local variables weren't thrown away on exiting a
4497db96d56Sopenharmony_cifunction?  What if you could later resume the function where it left off?  This
4507db96d56Sopenharmony_ciis what generators provide; they can be thought of as resumable functions.
4517db96d56Sopenharmony_ci
4527db96d56Sopenharmony_ciHere's the simplest example of a generator function:
4537db96d56Sopenharmony_ci
4547db96d56Sopenharmony_ci    >>> def generate_ints(N):
4557db96d56Sopenharmony_ci    ...    for i in range(N):
4567db96d56Sopenharmony_ci    ...        yield i
4577db96d56Sopenharmony_ci
4587db96d56Sopenharmony_ciAny function containing a :keyword:`yield` keyword is a generator function;
4597db96d56Sopenharmony_cithis is detected by Python's :term:`bytecode` compiler which compiles the
4607db96d56Sopenharmony_cifunction specially as a result.
4617db96d56Sopenharmony_ci
4627db96d56Sopenharmony_ciWhen you call a generator function, it doesn't return a single value; instead it
4637db96d56Sopenharmony_cireturns a generator object that supports the iterator protocol.  On executing
4647db96d56Sopenharmony_cithe ``yield`` expression, the generator outputs the value of ``i``, similar to a
4657db96d56Sopenharmony_ci``return`` statement.  The big difference between ``yield`` and a ``return``
4667db96d56Sopenharmony_cistatement is that on reaching a ``yield`` the generator's state of execution is
4677db96d56Sopenharmony_cisuspended and local variables are preserved.  On the next call to the
4687db96d56Sopenharmony_cigenerator's :meth:`~generator.__next__` method, the function will resume
4697db96d56Sopenharmony_ciexecuting.
4707db96d56Sopenharmony_ci
4717db96d56Sopenharmony_ciHere's a sample usage of the ``generate_ints()`` generator:
4727db96d56Sopenharmony_ci
4737db96d56Sopenharmony_ci    >>> gen = generate_ints(3)
4747db96d56Sopenharmony_ci    >>> gen  #doctest: +ELLIPSIS
4757db96d56Sopenharmony_ci    <generator object generate_ints at ...>
4767db96d56Sopenharmony_ci    >>> next(gen)
4777db96d56Sopenharmony_ci    0
4787db96d56Sopenharmony_ci    >>> next(gen)
4797db96d56Sopenharmony_ci    1
4807db96d56Sopenharmony_ci    >>> next(gen)
4817db96d56Sopenharmony_ci    2
4827db96d56Sopenharmony_ci    >>> next(gen)
4837db96d56Sopenharmony_ci    Traceback (most recent call last):
4847db96d56Sopenharmony_ci      File "stdin", line 1, in <module>
4857db96d56Sopenharmony_ci      File "stdin", line 2, in generate_ints
4867db96d56Sopenharmony_ci    StopIteration
4877db96d56Sopenharmony_ci
4887db96d56Sopenharmony_ciYou could equally write ``for i in generate_ints(5)``, or ``a, b, c =
4897db96d56Sopenharmony_cigenerate_ints(3)``.
4907db96d56Sopenharmony_ci
4917db96d56Sopenharmony_ciInside a generator function, ``return value`` causes ``StopIteration(value)``
4927db96d56Sopenharmony_cito be raised from the :meth:`~generator.__next__` method.  Once this happens, or
4937db96d56Sopenharmony_cithe bottom of the function is reached, the procession of values ends and the
4947db96d56Sopenharmony_cigenerator cannot yield any further values.
4957db96d56Sopenharmony_ci
4967db96d56Sopenharmony_ciYou could achieve the effect of generators manually by writing your own class
4977db96d56Sopenharmony_ciand storing all the local variables of the generator as instance variables.  For
4987db96d56Sopenharmony_ciexample, returning a list of integers could be done by setting ``self.count`` to
4997db96d56Sopenharmony_ci0, and having the :meth:`~iterator.__next__` method increment ``self.count`` and
5007db96d56Sopenharmony_cireturn it.
5017db96d56Sopenharmony_ciHowever, for a moderately complicated generator, writing a corresponding class
5027db96d56Sopenharmony_cican be much messier.
5037db96d56Sopenharmony_ci
5047db96d56Sopenharmony_ciThe test suite included with Python's library,
5057db96d56Sopenharmony_ci:source:`Lib/test/test_generators.py`, contains
5067db96d56Sopenharmony_cia number of more interesting examples.  Here's one generator that implements an
5077db96d56Sopenharmony_ciin-order traversal of a tree using generators recursively. ::
5087db96d56Sopenharmony_ci
5097db96d56Sopenharmony_ci    # A recursive generator that generates Tree leaves in in-order.
5107db96d56Sopenharmony_ci    def inorder(t):
5117db96d56Sopenharmony_ci        if t:
5127db96d56Sopenharmony_ci            for x in inorder(t.left):
5137db96d56Sopenharmony_ci                yield x
5147db96d56Sopenharmony_ci
5157db96d56Sopenharmony_ci            yield t.label
5167db96d56Sopenharmony_ci
5177db96d56Sopenharmony_ci            for x in inorder(t.right):
5187db96d56Sopenharmony_ci                yield x
5197db96d56Sopenharmony_ci
5207db96d56Sopenharmony_ciTwo other examples in ``test_generators.py`` produce solutions for the N-Queens
5217db96d56Sopenharmony_ciproblem (placing N queens on an NxN chess board so that no queen threatens
5227db96d56Sopenharmony_cianother) and the Knight's Tour (finding a route that takes a knight to every
5237db96d56Sopenharmony_cisquare of an NxN chessboard without visiting any square twice).
5247db96d56Sopenharmony_ci
5257db96d56Sopenharmony_ci
5267db96d56Sopenharmony_ci
5277db96d56Sopenharmony_ciPassing values into a generator
5287db96d56Sopenharmony_ci-------------------------------
5297db96d56Sopenharmony_ci
5307db96d56Sopenharmony_ciIn Python 2.4 and earlier, generators only produced output.  Once a generator's
5317db96d56Sopenharmony_cicode was invoked to create an iterator, there was no way to pass any new
5327db96d56Sopenharmony_ciinformation into the function when its execution is resumed.  You could hack
5337db96d56Sopenharmony_citogether this ability by making the generator look at a global variable or by
5347db96d56Sopenharmony_cipassing in some mutable object that callers then modify, but these approaches
5357db96d56Sopenharmony_ciare messy.
5367db96d56Sopenharmony_ci
5377db96d56Sopenharmony_ciIn Python 2.5 there's a simple way to pass values into a generator.
5387db96d56Sopenharmony_ci:keyword:`yield` became an expression, returning a value that can be assigned to
5397db96d56Sopenharmony_cia variable or otherwise operated on::
5407db96d56Sopenharmony_ci
5417db96d56Sopenharmony_ci    val = (yield i)
5427db96d56Sopenharmony_ci
5437db96d56Sopenharmony_ciI recommend that you **always** put parentheses around a ``yield`` expression
5447db96d56Sopenharmony_ciwhen you're doing something with the returned value, as in the above example.
5457db96d56Sopenharmony_ciThe parentheses aren't always necessary, but it's easier to always add them
5467db96d56Sopenharmony_ciinstead of having to remember when they're needed.
5477db96d56Sopenharmony_ci
5487db96d56Sopenharmony_ci(:pep:`342` explains the exact rules, which are that a ``yield``-expression must
5497db96d56Sopenharmony_cialways be parenthesized except when it occurs at the top-level expression on the
5507db96d56Sopenharmony_ciright-hand side of an assignment.  This means you can write ``val = yield i``
5517db96d56Sopenharmony_cibut have to use parentheses when there's an operation, as in ``val = (yield i)
5527db96d56Sopenharmony_ci+ 12``.)
5537db96d56Sopenharmony_ci
5547db96d56Sopenharmony_ciValues are sent into a generator by calling its :meth:`send(value)
5557db96d56Sopenharmony_ci<generator.send>` method.  This method resumes the generator's code and the
5567db96d56Sopenharmony_ci``yield`` expression returns the specified value.  If the regular
5577db96d56Sopenharmony_ci:meth:`~generator.__next__` method is called, the ``yield`` returns ``None``.
5587db96d56Sopenharmony_ci
5597db96d56Sopenharmony_ciHere's a simple counter that increments by 1 and allows changing the value of
5607db96d56Sopenharmony_cithe internal counter.
5617db96d56Sopenharmony_ci
5627db96d56Sopenharmony_ci.. testcode::
5637db96d56Sopenharmony_ci
5647db96d56Sopenharmony_ci    def counter(maximum):
5657db96d56Sopenharmony_ci        i = 0
5667db96d56Sopenharmony_ci        while i < maximum:
5677db96d56Sopenharmony_ci            val = (yield i)
5687db96d56Sopenharmony_ci            # If value provided, change counter
5697db96d56Sopenharmony_ci            if val is not None:
5707db96d56Sopenharmony_ci                i = val
5717db96d56Sopenharmony_ci            else:
5727db96d56Sopenharmony_ci                i += 1
5737db96d56Sopenharmony_ci
5747db96d56Sopenharmony_ciAnd here's an example of changing the counter:
5757db96d56Sopenharmony_ci
5767db96d56Sopenharmony_ci    >>> it = counter(10)  #doctest: +SKIP
5777db96d56Sopenharmony_ci    >>> next(it)  #doctest: +SKIP
5787db96d56Sopenharmony_ci    0
5797db96d56Sopenharmony_ci    >>> next(it)  #doctest: +SKIP
5807db96d56Sopenharmony_ci    1
5817db96d56Sopenharmony_ci    >>> it.send(8)  #doctest: +SKIP
5827db96d56Sopenharmony_ci    8
5837db96d56Sopenharmony_ci    >>> next(it)  #doctest: +SKIP
5847db96d56Sopenharmony_ci    9
5857db96d56Sopenharmony_ci    >>> next(it)  #doctest: +SKIP
5867db96d56Sopenharmony_ci    Traceback (most recent call last):
5877db96d56Sopenharmony_ci      File "t.py", line 15, in <module>
5887db96d56Sopenharmony_ci        it.next()
5897db96d56Sopenharmony_ci    StopIteration
5907db96d56Sopenharmony_ci
5917db96d56Sopenharmony_ciBecause ``yield`` will often be returning ``None``, you should always check for
5927db96d56Sopenharmony_cithis case.  Don't just use its value in expressions unless you're sure that the
5937db96d56Sopenharmony_ci:meth:`~generator.send` method will be the only method used to resume your
5947db96d56Sopenharmony_cigenerator function.
5957db96d56Sopenharmony_ci
5967db96d56Sopenharmony_ciIn addition to :meth:`~generator.send`, there are two other methods on
5977db96d56Sopenharmony_cigenerators:
5987db96d56Sopenharmony_ci
5997db96d56Sopenharmony_ci* :meth:`throw(value) <generator.throw>` is used to
6007db96d56Sopenharmony_ci  raise an exception inside the generator; the exception is raised by the
6017db96d56Sopenharmony_ci  ``yield`` expression where the generator's execution is paused.
6027db96d56Sopenharmony_ci
6037db96d56Sopenharmony_ci* :meth:`~generator.close` raises a :exc:`GeneratorExit` exception inside the
6047db96d56Sopenharmony_ci  generator to terminate the iteration.  On receiving this exception, the
6057db96d56Sopenharmony_ci  generator's code must either raise :exc:`GeneratorExit` or
6067db96d56Sopenharmony_ci  :exc:`StopIteration`; catching the exception and doing anything else is
6077db96d56Sopenharmony_ci  illegal and will trigger a :exc:`RuntimeError`.  :meth:`~generator.close`
6087db96d56Sopenharmony_ci  will also be called by Python's garbage collector when the generator is
6097db96d56Sopenharmony_ci  garbage-collected.
6107db96d56Sopenharmony_ci
6117db96d56Sopenharmony_ci  If you need to run cleanup code when a :exc:`GeneratorExit` occurs, I suggest
6127db96d56Sopenharmony_ci  using a ``try: ... finally:`` suite instead of catching :exc:`GeneratorExit`.
6137db96d56Sopenharmony_ci
6147db96d56Sopenharmony_ciThe cumulative effect of these changes is to turn generators from one-way
6157db96d56Sopenharmony_ciproducers of information into both producers and consumers.
6167db96d56Sopenharmony_ci
6177db96d56Sopenharmony_ciGenerators also become **coroutines**, a more generalized form of subroutines.
6187db96d56Sopenharmony_ciSubroutines are entered at one point and exited at another point (the top of the
6197db96d56Sopenharmony_cifunction, and a ``return`` statement), but coroutines can be entered, exited,
6207db96d56Sopenharmony_ciand resumed at many different points (the ``yield`` statements).
6217db96d56Sopenharmony_ci
6227db96d56Sopenharmony_ci
6237db96d56Sopenharmony_ciBuilt-in functions
6247db96d56Sopenharmony_ci==================
6257db96d56Sopenharmony_ci
6267db96d56Sopenharmony_ciLet's look in more detail at built-in functions often used with iterators.
6277db96d56Sopenharmony_ci
6287db96d56Sopenharmony_ciTwo of Python's built-in functions, :func:`map` and :func:`filter` duplicate the
6297db96d56Sopenharmony_cifeatures of generator expressions:
6307db96d56Sopenharmony_ci
6317db96d56Sopenharmony_ci:func:`map(f, iterA, iterB, ...) <map>` returns an iterator over the sequence
6327db96d56Sopenharmony_ci ``f(iterA[0], iterB[0]), f(iterA[1], iterB[1]), f(iterA[2], iterB[2]), ...``.
6337db96d56Sopenharmony_ci
6347db96d56Sopenharmony_ci    >>> def upper(s):
6357db96d56Sopenharmony_ci    ...     return s.upper()
6367db96d56Sopenharmony_ci
6377db96d56Sopenharmony_ci    >>> list(map(upper, ['sentence', 'fragment']))
6387db96d56Sopenharmony_ci    ['SENTENCE', 'FRAGMENT']
6397db96d56Sopenharmony_ci    >>> [upper(s) for s in ['sentence', 'fragment']]
6407db96d56Sopenharmony_ci    ['SENTENCE', 'FRAGMENT']
6417db96d56Sopenharmony_ci
6427db96d56Sopenharmony_ciYou can of course achieve the same effect with a list comprehension.
6437db96d56Sopenharmony_ci
6447db96d56Sopenharmony_ci:func:`filter(predicate, iter) <filter>` returns an iterator over all the
6457db96d56Sopenharmony_cisequence elements that meet a certain condition, and is similarly duplicated by
6467db96d56Sopenharmony_cilist comprehensions.  A **predicate** is a function that returns the truth
6477db96d56Sopenharmony_civalue of some condition; for use with :func:`filter`, the predicate must take a
6487db96d56Sopenharmony_cisingle value.
6497db96d56Sopenharmony_ci
6507db96d56Sopenharmony_ci    >>> def is_even(x):
6517db96d56Sopenharmony_ci    ...     return (x % 2) == 0
6527db96d56Sopenharmony_ci
6537db96d56Sopenharmony_ci    >>> list(filter(is_even, range(10)))
6547db96d56Sopenharmony_ci    [0, 2, 4, 6, 8]
6557db96d56Sopenharmony_ci
6567db96d56Sopenharmony_ci
6577db96d56Sopenharmony_ciThis can also be written as a list comprehension:
6587db96d56Sopenharmony_ci
6597db96d56Sopenharmony_ci    >>> list(x for x in range(10) if is_even(x))
6607db96d56Sopenharmony_ci    [0, 2, 4, 6, 8]
6617db96d56Sopenharmony_ci
6627db96d56Sopenharmony_ci
6637db96d56Sopenharmony_ci:func:`enumerate(iter, start=0) <enumerate>` counts off the elements in the
6647db96d56Sopenharmony_ciiterable returning 2-tuples containing the count (from *start*) and
6657db96d56Sopenharmony_cieach element. ::
6667db96d56Sopenharmony_ci
6677db96d56Sopenharmony_ci    >>> for item in enumerate(['subject', 'verb', 'object']):
6687db96d56Sopenharmony_ci    ...     print(item)
6697db96d56Sopenharmony_ci    (0, 'subject')
6707db96d56Sopenharmony_ci    (1, 'verb')
6717db96d56Sopenharmony_ci    (2, 'object')
6727db96d56Sopenharmony_ci
6737db96d56Sopenharmony_ci:func:`enumerate` is often used when looping through a list and recording the
6747db96d56Sopenharmony_ciindexes at which certain conditions are met::
6757db96d56Sopenharmony_ci
6767db96d56Sopenharmony_ci    f = open('data.txt', 'r')
6777db96d56Sopenharmony_ci    for i, line in enumerate(f):
6787db96d56Sopenharmony_ci        if line.strip() == '':
6797db96d56Sopenharmony_ci            print('Blank line at line #%i' % i)
6807db96d56Sopenharmony_ci
6817db96d56Sopenharmony_ci:func:`sorted(iterable, key=None, reverse=False) <sorted>` collects all the
6827db96d56Sopenharmony_cielements of the iterable into a list, sorts the list, and returns the sorted
6837db96d56Sopenharmony_ciresult.  The *key* and *reverse* arguments are passed through to the
6847db96d56Sopenharmony_ciconstructed list's :meth:`~list.sort` method. ::
6857db96d56Sopenharmony_ci
6867db96d56Sopenharmony_ci    >>> import random
6877db96d56Sopenharmony_ci    >>> # Generate 8 random numbers between [0, 10000)
6887db96d56Sopenharmony_ci    >>> rand_list = random.sample(range(10000), 8)
6897db96d56Sopenharmony_ci    >>> rand_list  #doctest: +SKIP
6907db96d56Sopenharmony_ci    [769, 7953, 9828, 6431, 8442, 9878, 6213, 2207]
6917db96d56Sopenharmony_ci    >>> sorted(rand_list)  #doctest: +SKIP
6927db96d56Sopenharmony_ci    [769, 2207, 6213, 6431, 7953, 8442, 9828, 9878]
6937db96d56Sopenharmony_ci    >>> sorted(rand_list, reverse=True)  #doctest: +SKIP
6947db96d56Sopenharmony_ci    [9878, 9828, 8442, 7953, 6431, 6213, 2207, 769]
6957db96d56Sopenharmony_ci
6967db96d56Sopenharmony_ci(For a more detailed discussion of sorting, see the :ref:`sortinghowto`.)
6977db96d56Sopenharmony_ci
6987db96d56Sopenharmony_ci
6997db96d56Sopenharmony_ciThe :func:`any(iter) <any>` and :func:`all(iter) <all>` built-ins look at the
7007db96d56Sopenharmony_citruth values of an iterable's contents.  :func:`any` returns ``True`` if any element
7017db96d56Sopenharmony_ciin the iterable is a true value, and :func:`all` returns ``True`` if all of the
7027db96d56Sopenharmony_cielements are true values:
7037db96d56Sopenharmony_ci
7047db96d56Sopenharmony_ci    >>> any([0, 1, 0])
7057db96d56Sopenharmony_ci    True
7067db96d56Sopenharmony_ci    >>> any([0, 0, 0])
7077db96d56Sopenharmony_ci    False
7087db96d56Sopenharmony_ci    >>> any([1, 1, 1])
7097db96d56Sopenharmony_ci    True
7107db96d56Sopenharmony_ci    >>> all([0, 1, 0])
7117db96d56Sopenharmony_ci    False
7127db96d56Sopenharmony_ci    >>> all([0, 0, 0])
7137db96d56Sopenharmony_ci    False
7147db96d56Sopenharmony_ci    >>> all([1, 1, 1])
7157db96d56Sopenharmony_ci    True
7167db96d56Sopenharmony_ci
7177db96d56Sopenharmony_ci
7187db96d56Sopenharmony_ci:func:`zip(iterA, iterB, ...) <zip>` takes one element from each iterable and
7197db96d56Sopenharmony_cireturns them in a tuple::
7207db96d56Sopenharmony_ci
7217db96d56Sopenharmony_ci    zip(['a', 'b', 'c'], (1, 2, 3)) =>
7227db96d56Sopenharmony_ci      ('a', 1), ('b', 2), ('c', 3)
7237db96d56Sopenharmony_ci
7247db96d56Sopenharmony_ciIt doesn't construct an in-memory list and exhaust all the input iterators
7257db96d56Sopenharmony_cibefore returning; instead tuples are constructed and returned only if they're
7267db96d56Sopenharmony_cirequested.  (The technical term for this behaviour is `lazy evaluation
7277db96d56Sopenharmony_ci<https://en.wikipedia.org/wiki/Lazy_evaluation>`__.)
7287db96d56Sopenharmony_ci
7297db96d56Sopenharmony_ciThis iterator is intended to be used with iterables that are all of the same
7307db96d56Sopenharmony_cilength.  If the iterables are of different lengths, the resulting stream will be
7317db96d56Sopenharmony_cithe same length as the shortest iterable. ::
7327db96d56Sopenharmony_ci
7337db96d56Sopenharmony_ci    zip(['a', 'b'], (1, 2, 3)) =>
7347db96d56Sopenharmony_ci      ('a', 1), ('b', 2)
7357db96d56Sopenharmony_ci
7367db96d56Sopenharmony_ciYou should avoid doing this, though, because an element may be taken from the
7377db96d56Sopenharmony_cilonger iterators and discarded.  This means you can't go on to use the iterators
7387db96d56Sopenharmony_cifurther because you risk skipping a discarded element.
7397db96d56Sopenharmony_ci
7407db96d56Sopenharmony_ci
7417db96d56Sopenharmony_ciThe itertools module
7427db96d56Sopenharmony_ci====================
7437db96d56Sopenharmony_ci
7447db96d56Sopenharmony_ciThe :mod:`itertools` module contains a number of commonly used iterators as well
7457db96d56Sopenharmony_cias functions for combining several iterators.  This section will introduce the
7467db96d56Sopenharmony_cimodule's contents by showing small examples.
7477db96d56Sopenharmony_ci
7487db96d56Sopenharmony_ciThe module's functions fall into a few broad classes:
7497db96d56Sopenharmony_ci
7507db96d56Sopenharmony_ci* Functions that create a new iterator based on an existing iterator.
7517db96d56Sopenharmony_ci* Functions for treating an iterator's elements as function arguments.
7527db96d56Sopenharmony_ci* Functions for selecting portions of an iterator's output.
7537db96d56Sopenharmony_ci* A function for grouping an iterator's output.
7547db96d56Sopenharmony_ci
7557db96d56Sopenharmony_ciCreating new iterators
7567db96d56Sopenharmony_ci----------------------
7577db96d56Sopenharmony_ci
7587db96d56Sopenharmony_ci:func:`itertools.count(start, step) <itertools.count>` returns an infinite
7597db96d56Sopenharmony_cistream of evenly spaced values.  You can optionally supply the starting number,
7607db96d56Sopenharmony_ciwhich defaults to 0, and the interval between numbers, which defaults to 1::
7617db96d56Sopenharmony_ci
7627db96d56Sopenharmony_ci    itertools.count() =>
7637db96d56Sopenharmony_ci      0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...
7647db96d56Sopenharmony_ci    itertools.count(10) =>
7657db96d56Sopenharmony_ci      10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ...
7667db96d56Sopenharmony_ci    itertools.count(10, 5) =>
7677db96d56Sopenharmony_ci      10, 15, 20, 25, 30, 35, 40, 45, 50, 55, ...
7687db96d56Sopenharmony_ci
7697db96d56Sopenharmony_ci:func:`itertools.cycle(iter) <itertools.cycle>` saves a copy of the contents of
7707db96d56Sopenharmony_cia provided iterable and returns a new iterator that returns its elements from
7717db96d56Sopenharmony_cifirst to last.  The new iterator will repeat these elements infinitely. ::
7727db96d56Sopenharmony_ci
7737db96d56Sopenharmony_ci    itertools.cycle([1, 2, 3, 4, 5]) =>
7747db96d56Sopenharmony_ci      1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
7757db96d56Sopenharmony_ci
7767db96d56Sopenharmony_ci:func:`itertools.repeat(elem, [n]) <itertools.repeat>` returns the provided
7777db96d56Sopenharmony_cielement *n* times, or returns the element endlessly if *n* is not provided. ::
7787db96d56Sopenharmony_ci
7797db96d56Sopenharmony_ci    itertools.repeat('abc') =>
7807db96d56Sopenharmony_ci      abc, abc, abc, abc, abc, abc, abc, abc, abc, abc, ...
7817db96d56Sopenharmony_ci    itertools.repeat('abc', 5) =>
7827db96d56Sopenharmony_ci      abc, abc, abc, abc, abc
7837db96d56Sopenharmony_ci
7847db96d56Sopenharmony_ci:func:`itertools.chain(iterA, iterB, ...) <itertools.chain>` takes an arbitrary
7857db96d56Sopenharmony_cinumber of iterables as input, and returns all the elements of the first
7867db96d56Sopenharmony_ciiterator, then all the elements of the second, and so on, until all of the
7877db96d56Sopenharmony_ciiterables have been exhausted. ::
7887db96d56Sopenharmony_ci
7897db96d56Sopenharmony_ci    itertools.chain(['a', 'b', 'c'], (1, 2, 3)) =>
7907db96d56Sopenharmony_ci      a, b, c, 1, 2, 3
7917db96d56Sopenharmony_ci
7927db96d56Sopenharmony_ci:func:`itertools.islice(iter, [start], stop, [step]) <itertools.islice>` returns
7937db96d56Sopenharmony_cia stream that's a slice of the iterator.  With a single *stop* argument, it
7947db96d56Sopenharmony_ciwill return the first *stop* elements.  If you supply a starting index, you'll
7957db96d56Sopenharmony_ciget *stop-start* elements, and if you supply a value for *step*, elements
7967db96d56Sopenharmony_ciwill be skipped accordingly.  Unlike Python's string and list slicing, you can't
7977db96d56Sopenharmony_ciuse negative values for *start*, *stop*, or *step*. ::
7987db96d56Sopenharmony_ci
7997db96d56Sopenharmony_ci    itertools.islice(range(10), 8) =>
8007db96d56Sopenharmony_ci      0, 1, 2, 3, 4, 5, 6, 7
8017db96d56Sopenharmony_ci    itertools.islice(range(10), 2, 8) =>
8027db96d56Sopenharmony_ci      2, 3, 4, 5, 6, 7
8037db96d56Sopenharmony_ci    itertools.islice(range(10), 2, 8, 2) =>
8047db96d56Sopenharmony_ci      2, 4, 6
8057db96d56Sopenharmony_ci
8067db96d56Sopenharmony_ci:func:`itertools.tee(iter, [n]) <itertools.tee>` replicates an iterator; it
8077db96d56Sopenharmony_cireturns *n* independent iterators that will all return the contents of the
8087db96d56Sopenharmony_cisource iterator.
8097db96d56Sopenharmony_ciIf you don't supply a value for *n*, the default is 2.  Replicating iterators
8107db96d56Sopenharmony_cirequires saving some of the contents of the source iterator, so this can consume
8117db96d56Sopenharmony_cisignificant memory if the iterator is large and one of the new iterators is
8127db96d56Sopenharmony_ciconsumed more than the others. ::
8137db96d56Sopenharmony_ci
8147db96d56Sopenharmony_ci        itertools.tee( itertools.count() ) =>
8157db96d56Sopenharmony_ci           iterA, iterB
8167db96d56Sopenharmony_ci
8177db96d56Sopenharmony_ci        where iterA ->
8187db96d56Sopenharmony_ci           0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...
8197db96d56Sopenharmony_ci
8207db96d56Sopenharmony_ci        and   iterB ->
8217db96d56Sopenharmony_ci           0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...
8227db96d56Sopenharmony_ci
8237db96d56Sopenharmony_ci
8247db96d56Sopenharmony_ciCalling functions on elements
8257db96d56Sopenharmony_ci-----------------------------
8267db96d56Sopenharmony_ci
8277db96d56Sopenharmony_ciThe :mod:`operator` module contains a set of functions corresponding to Python's
8287db96d56Sopenharmony_cioperators.  Some examples are :func:`operator.add(a, b) <operator.add>` (adds
8297db96d56Sopenharmony_citwo values), :func:`operator.ne(a, b)  <operator.ne>` (same as ``a != b``), and
8307db96d56Sopenharmony_ci:func:`operator.attrgetter('id') <operator.attrgetter>`
8317db96d56Sopenharmony_ci(returns a callable that fetches the ``.id`` attribute).
8327db96d56Sopenharmony_ci
8337db96d56Sopenharmony_ci:func:`itertools.starmap(func, iter) <itertools.starmap>` assumes that the
8347db96d56Sopenharmony_ciiterable will return a stream of tuples, and calls *func* using these tuples as
8357db96d56Sopenharmony_cithe arguments::
8367db96d56Sopenharmony_ci
8377db96d56Sopenharmony_ci    itertools.starmap(os.path.join,
8387db96d56Sopenharmony_ci                      [('/bin', 'python'), ('/usr', 'bin', 'java'),
8397db96d56Sopenharmony_ci                       ('/usr', 'bin', 'perl'), ('/usr', 'bin', 'ruby')])
8407db96d56Sopenharmony_ci    =>
8417db96d56Sopenharmony_ci      /bin/python, /usr/bin/java, /usr/bin/perl, /usr/bin/ruby
8427db96d56Sopenharmony_ci
8437db96d56Sopenharmony_ci
8447db96d56Sopenharmony_ciSelecting elements
8457db96d56Sopenharmony_ci------------------
8467db96d56Sopenharmony_ci
8477db96d56Sopenharmony_ciAnother group of functions chooses a subset of an iterator's elements based on a
8487db96d56Sopenharmony_cipredicate.
8497db96d56Sopenharmony_ci
8507db96d56Sopenharmony_ci:func:`itertools.filterfalse(predicate, iter) <itertools.filterfalse>` is the
8517db96d56Sopenharmony_ciopposite of :func:`filter`, returning all elements for which the predicate
8527db96d56Sopenharmony_cireturns false::
8537db96d56Sopenharmony_ci
8547db96d56Sopenharmony_ci    itertools.filterfalse(is_even, itertools.count()) =>
8557db96d56Sopenharmony_ci      1, 3, 5, 7, 9, 11, 13, 15, ...
8567db96d56Sopenharmony_ci
8577db96d56Sopenharmony_ci:func:`itertools.takewhile(predicate, iter) <itertools.takewhile>` returns
8587db96d56Sopenharmony_cielements for as long as the predicate returns true.  Once the predicate returns
8597db96d56Sopenharmony_cifalse, the iterator will signal the end of its results. ::
8607db96d56Sopenharmony_ci
8617db96d56Sopenharmony_ci    def less_than_10(x):
8627db96d56Sopenharmony_ci        return x < 10
8637db96d56Sopenharmony_ci
8647db96d56Sopenharmony_ci    itertools.takewhile(less_than_10, itertools.count()) =>
8657db96d56Sopenharmony_ci      0, 1, 2, 3, 4, 5, 6, 7, 8, 9
8667db96d56Sopenharmony_ci
8677db96d56Sopenharmony_ci    itertools.takewhile(is_even, itertools.count()) =>
8687db96d56Sopenharmony_ci      0
8697db96d56Sopenharmony_ci
8707db96d56Sopenharmony_ci:func:`itertools.dropwhile(predicate, iter) <itertools.dropwhile>` discards
8717db96d56Sopenharmony_cielements while the predicate returns true, and then returns the rest of the
8727db96d56Sopenharmony_ciiterable's results. ::
8737db96d56Sopenharmony_ci
8747db96d56Sopenharmony_ci    itertools.dropwhile(less_than_10, itertools.count()) =>
8757db96d56Sopenharmony_ci      10, 11, 12, 13, 14, 15, 16, 17, 18, 19, ...
8767db96d56Sopenharmony_ci
8777db96d56Sopenharmony_ci    itertools.dropwhile(is_even, itertools.count()) =>
8787db96d56Sopenharmony_ci      1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...
8797db96d56Sopenharmony_ci
8807db96d56Sopenharmony_ci:func:`itertools.compress(data, selectors) <itertools.compress>` takes two
8817db96d56Sopenharmony_ciiterators and returns only those elements of *data* for which the corresponding
8827db96d56Sopenharmony_cielement of *selectors* is true, stopping whenever either one is exhausted::
8837db96d56Sopenharmony_ci
8847db96d56Sopenharmony_ci    itertools.compress([1, 2, 3, 4, 5], [True, True, False, False, True]) =>
8857db96d56Sopenharmony_ci       1, 2, 5
8867db96d56Sopenharmony_ci
8877db96d56Sopenharmony_ci
8887db96d56Sopenharmony_ciCombinatoric functions
8897db96d56Sopenharmony_ci----------------------
8907db96d56Sopenharmony_ci
8917db96d56Sopenharmony_ciThe :func:`itertools.combinations(iterable, r) <itertools.combinations>`
8927db96d56Sopenharmony_cireturns an iterator giving all possible *r*-tuple combinations of the
8937db96d56Sopenharmony_cielements contained in *iterable*.  ::
8947db96d56Sopenharmony_ci
8957db96d56Sopenharmony_ci    itertools.combinations([1, 2, 3, 4, 5], 2) =>
8967db96d56Sopenharmony_ci      (1, 2), (1, 3), (1, 4), (1, 5),
8977db96d56Sopenharmony_ci      (2, 3), (2, 4), (2, 5),
8987db96d56Sopenharmony_ci      (3, 4), (3, 5),
8997db96d56Sopenharmony_ci      (4, 5)
9007db96d56Sopenharmony_ci
9017db96d56Sopenharmony_ci    itertools.combinations([1, 2, 3, 4, 5], 3) =>
9027db96d56Sopenharmony_ci      (1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5),
9037db96d56Sopenharmony_ci      (2, 3, 4), (2, 3, 5), (2, 4, 5),
9047db96d56Sopenharmony_ci      (3, 4, 5)
9057db96d56Sopenharmony_ci
9067db96d56Sopenharmony_ciThe elements within each tuple remain in the same order as
9077db96d56Sopenharmony_ci*iterable* returned them.  For example, the number 1 is always before
9087db96d56Sopenharmony_ci2, 3, 4, or 5 in the examples above.  A similar function,
9097db96d56Sopenharmony_ci:func:`itertools.permutations(iterable, r=None) <itertools.permutations>`,
9107db96d56Sopenharmony_ciremoves this constraint on the order, returning all possible
9117db96d56Sopenharmony_ciarrangements of length *r*::
9127db96d56Sopenharmony_ci
9137db96d56Sopenharmony_ci    itertools.permutations([1, 2, 3, 4, 5], 2) =>
9147db96d56Sopenharmony_ci      (1, 2), (1, 3), (1, 4), (1, 5),
9157db96d56Sopenharmony_ci      (2, 1), (2, 3), (2, 4), (2, 5),
9167db96d56Sopenharmony_ci      (3, 1), (3, 2), (3, 4), (3, 5),
9177db96d56Sopenharmony_ci      (4, 1), (4, 2), (4, 3), (4, 5),
9187db96d56Sopenharmony_ci      (5, 1), (5, 2), (5, 3), (5, 4)
9197db96d56Sopenharmony_ci
9207db96d56Sopenharmony_ci    itertools.permutations([1, 2, 3, 4, 5]) =>
9217db96d56Sopenharmony_ci      (1, 2, 3, 4, 5), (1, 2, 3, 5, 4), (1, 2, 4, 3, 5),
9227db96d56Sopenharmony_ci      ...
9237db96d56Sopenharmony_ci      (5, 4, 3, 2, 1)
9247db96d56Sopenharmony_ci
9257db96d56Sopenharmony_ciIf you don't supply a value for *r* the length of the iterable is used,
9267db96d56Sopenharmony_cimeaning that all the elements are permuted.
9277db96d56Sopenharmony_ci
9287db96d56Sopenharmony_ciNote that these functions produce all of the possible combinations by
9297db96d56Sopenharmony_ciposition and don't require that the contents of *iterable* are unique::
9307db96d56Sopenharmony_ci
9317db96d56Sopenharmony_ci    itertools.permutations('aba', 3) =>
9327db96d56Sopenharmony_ci      ('a', 'b', 'a'), ('a', 'a', 'b'), ('b', 'a', 'a'),
9337db96d56Sopenharmony_ci      ('b', 'a', 'a'), ('a', 'a', 'b'), ('a', 'b', 'a')
9347db96d56Sopenharmony_ci
9357db96d56Sopenharmony_ciThe identical tuple ``('a', 'a', 'b')`` occurs twice, but the two 'a'
9367db96d56Sopenharmony_cistrings came from different positions.
9377db96d56Sopenharmony_ci
9387db96d56Sopenharmony_ciThe :func:`itertools.combinations_with_replacement(iterable, r) <itertools.combinations_with_replacement>`
9397db96d56Sopenharmony_cifunction relaxes a different constraint: elements can be repeated
9407db96d56Sopenharmony_ciwithin a single tuple.  Conceptually an element is selected for the
9417db96d56Sopenharmony_cifirst position of each tuple and then is replaced before the second
9427db96d56Sopenharmony_cielement is selected.  ::
9437db96d56Sopenharmony_ci
9447db96d56Sopenharmony_ci    itertools.combinations_with_replacement([1, 2, 3, 4, 5], 2) =>
9457db96d56Sopenharmony_ci      (1, 1), (1, 2), (1, 3), (1, 4), (1, 5),
9467db96d56Sopenharmony_ci      (2, 2), (2, 3), (2, 4), (2, 5),
9477db96d56Sopenharmony_ci      (3, 3), (3, 4), (3, 5),
9487db96d56Sopenharmony_ci      (4, 4), (4, 5),
9497db96d56Sopenharmony_ci      (5, 5)
9507db96d56Sopenharmony_ci
9517db96d56Sopenharmony_ci
9527db96d56Sopenharmony_ciGrouping elements
9537db96d56Sopenharmony_ci-----------------
9547db96d56Sopenharmony_ci
9557db96d56Sopenharmony_ciThe last function I'll discuss, :func:`itertools.groupby(iter, key_func=None)
9567db96d56Sopenharmony_ci<itertools.groupby>`, is the most complicated.  ``key_func(elem)`` is a function
9577db96d56Sopenharmony_cithat can compute a key value for each element returned by the iterable.  If you
9587db96d56Sopenharmony_cidon't supply a key function, the key is simply each element itself.
9597db96d56Sopenharmony_ci
9607db96d56Sopenharmony_ci:func:`~itertools.groupby` collects all the consecutive elements from the
9617db96d56Sopenharmony_ciunderlying iterable that have the same key value, and returns a stream of
9627db96d56Sopenharmony_ci2-tuples containing a key value and an iterator for the elements with that key.
9637db96d56Sopenharmony_ci
9647db96d56Sopenharmony_ci::
9657db96d56Sopenharmony_ci
9667db96d56Sopenharmony_ci    city_list = [('Decatur', 'AL'), ('Huntsville', 'AL'), ('Selma', 'AL'),
9677db96d56Sopenharmony_ci                 ('Anchorage', 'AK'), ('Nome', 'AK'),
9687db96d56Sopenharmony_ci                 ('Flagstaff', 'AZ'), ('Phoenix', 'AZ'), ('Tucson', 'AZ'),
9697db96d56Sopenharmony_ci                 ...
9707db96d56Sopenharmony_ci                ]
9717db96d56Sopenharmony_ci
9727db96d56Sopenharmony_ci    def get_state(city_state):
9737db96d56Sopenharmony_ci        return city_state[1]
9747db96d56Sopenharmony_ci
9757db96d56Sopenharmony_ci    itertools.groupby(city_list, get_state) =>
9767db96d56Sopenharmony_ci      ('AL', iterator-1),
9777db96d56Sopenharmony_ci      ('AK', iterator-2),
9787db96d56Sopenharmony_ci      ('AZ', iterator-3), ...
9797db96d56Sopenharmony_ci
9807db96d56Sopenharmony_ci    where
9817db96d56Sopenharmony_ci    iterator-1 =>
9827db96d56Sopenharmony_ci      ('Decatur', 'AL'), ('Huntsville', 'AL'), ('Selma', 'AL')
9837db96d56Sopenharmony_ci    iterator-2 =>
9847db96d56Sopenharmony_ci      ('Anchorage', 'AK'), ('Nome', 'AK')
9857db96d56Sopenharmony_ci    iterator-3 =>
9867db96d56Sopenharmony_ci      ('Flagstaff', 'AZ'), ('Phoenix', 'AZ'), ('Tucson', 'AZ')
9877db96d56Sopenharmony_ci
9887db96d56Sopenharmony_ci:func:`~itertools.groupby` assumes that the underlying iterable's contents will
9897db96d56Sopenharmony_cialready be sorted based on the key.  Note that the returned iterators also use
9907db96d56Sopenharmony_cithe underlying iterable, so you have to consume the results of iterator-1 before
9917db96d56Sopenharmony_cirequesting iterator-2 and its corresponding key.
9927db96d56Sopenharmony_ci
9937db96d56Sopenharmony_ci
9947db96d56Sopenharmony_ciThe functools module
9957db96d56Sopenharmony_ci====================
9967db96d56Sopenharmony_ci
9977db96d56Sopenharmony_ciThe :mod:`functools` module contains some higher-order functions.
9987db96d56Sopenharmony_ciA **higher-order function** takes one or more functions as input and returns a
9997db96d56Sopenharmony_cinew function.  The most useful tool in this module is the
10007db96d56Sopenharmony_ci:func:`functools.partial` function.
10017db96d56Sopenharmony_ci
10027db96d56Sopenharmony_ciFor programs written in a functional style, you'll sometimes want to construct
10037db96d56Sopenharmony_civariants of existing functions that have some of the parameters filled in.
10047db96d56Sopenharmony_ciConsider a Python function ``f(a, b, c)``; you may wish to create a new function
10057db96d56Sopenharmony_ci``g(b, c)`` that's equivalent to ``f(1, b, c)``; you're filling in a value for
10067db96d56Sopenharmony_cione of ``f()``'s parameters.  This is called "partial function application".
10077db96d56Sopenharmony_ci
10087db96d56Sopenharmony_ciThe constructor for :func:`~functools.partial` takes the arguments
10097db96d56Sopenharmony_ci``(function, arg1, arg2, ..., kwarg1=value1, kwarg2=value2)``.  The resulting
10107db96d56Sopenharmony_ciobject is callable, so you can just call it to invoke ``function`` with the
10117db96d56Sopenharmony_cifilled-in arguments.
10127db96d56Sopenharmony_ci
10137db96d56Sopenharmony_ciHere's a small but realistic example::
10147db96d56Sopenharmony_ci
10157db96d56Sopenharmony_ci    import functools
10167db96d56Sopenharmony_ci
10177db96d56Sopenharmony_ci    def log(message, subsystem):
10187db96d56Sopenharmony_ci        """Write the contents of 'message' to the specified subsystem."""
10197db96d56Sopenharmony_ci        print('%s: %s' % (subsystem, message))
10207db96d56Sopenharmony_ci        ...
10217db96d56Sopenharmony_ci
10227db96d56Sopenharmony_ci    server_log = functools.partial(log, subsystem='server')
10237db96d56Sopenharmony_ci    server_log('Unable to open socket')
10247db96d56Sopenharmony_ci
10257db96d56Sopenharmony_ci:func:`functools.reduce(func, iter, [initial_value]) <functools.reduce>`
10267db96d56Sopenharmony_cicumulatively performs an operation on all the iterable's elements and,
10277db96d56Sopenharmony_citherefore, can't be applied to infinite iterables. *func* must be a function
10287db96d56Sopenharmony_cithat takes two elements and returns a single value.  :func:`functools.reduce`
10297db96d56Sopenharmony_citakes the first two elements A and B returned by the iterator and calculates
10307db96d56Sopenharmony_ci``func(A, B)``.  It then requests the third element, C, calculates
10317db96d56Sopenharmony_ci``func(func(A, B), C)``, combines this result with the fourth element returned,
10327db96d56Sopenharmony_ciand continues until the iterable is exhausted.  If the iterable returns no
10337db96d56Sopenharmony_civalues at all, a :exc:`TypeError` exception is raised.  If the initial value is
10347db96d56Sopenharmony_cisupplied, it's used as a starting point and ``func(initial_value, A)`` is the
10357db96d56Sopenharmony_cifirst calculation. ::
10367db96d56Sopenharmony_ci
10377db96d56Sopenharmony_ci    >>> import operator, functools
10387db96d56Sopenharmony_ci    >>> functools.reduce(operator.concat, ['A', 'BB', 'C'])
10397db96d56Sopenharmony_ci    'ABBC'
10407db96d56Sopenharmony_ci    >>> functools.reduce(operator.concat, [])
10417db96d56Sopenharmony_ci    Traceback (most recent call last):
10427db96d56Sopenharmony_ci      ...
10437db96d56Sopenharmony_ci    TypeError: reduce() of empty sequence with no initial value
10447db96d56Sopenharmony_ci    >>> functools.reduce(operator.mul, [1, 2, 3], 1)
10457db96d56Sopenharmony_ci    6
10467db96d56Sopenharmony_ci    >>> functools.reduce(operator.mul, [], 1)
10477db96d56Sopenharmony_ci    1
10487db96d56Sopenharmony_ci
10497db96d56Sopenharmony_ciIf you use :func:`operator.add` with :func:`functools.reduce`, you'll add up all the
10507db96d56Sopenharmony_cielements of the iterable.  This case is so common that there's a special
10517db96d56Sopenharmony_cibuilt-in called :func:`sum` to compute it:
10527db96d56Sopenharmony_ci
10537db96d56Sopenharmony_ci    >>> import functools, operator
10547db96d56Sopenharmony_ci    >>> functools.reduce(operator.add, [1, 2, 3, 4], 0)
10557db96d56Sopenharmony_ci    10
10567db96d56Sopenharmony_ci    >>> sum([1, 2, 3, 4])
10577db96d56Sopenharmony_ci    10
10587db96d56Sopenharmony_ci    >>> sum([])
10597db96d56Sopenharmony_ci    0
10607db96d56Sopenharmony_ci
10617db96d56Sopenharmony_ciFor many uses of :func:`functools.reduce`, though, it can be clearer to just
10627db96d56Sopenharmony_ciwrite the obvious :keyword:`for` loop::
10637db96d56Sopenharmony_ci
10647db96d56Sopenharmony_ci   import functools
10657db96d56Sopenharmony_ci   # Instead of:
10667db96d56Sopenharmony_ci   product = functools.reduce(operator.mul, [1, 2, 3], 1)
10677db96d56Sopenharmony_ci
10687db96d56Sopenharmony_ci   # You can write:
10697db96d56Sopenharmony_ci   product = 1
10707db96d56Sopenharmony_ci   for i in [1, 2, 3]:
10717db96d56Sopenharmony_ci       product *= i
10727db96d56Sopenharmony_ci
10737db96d56Sopenharmony_ciA related function is :func:`itertools.accumulate(iterable, func=operator.add)
10747db96d56Sopenharmony_ci<itertools.accumulate>`.  It performs the same calculation, but instead of
10757db96d56Sopenharmony_cireturning only the final result, :func:`accumulate` returns an iterator that
10767db96d56Sopenharmony_cialso yields each partial result::
10777db96d56Sopenharmony_ci
10787db96d56Sopenharmony_ci    itertools.accumulate([1, 2, 3, 4, 5]) =>
10797db96d56Sopenharmony_ci      1, 3, 6, 10, 15
10807db96d56Sopenharmony_ci
10817db96d56Sopenharmony_ci    itertools.accumulate([1, 2, 3, 4, 5], operator.mul) =>
10827db96d56Sopenharmony_ci      1, 2, 6, 24, 120
10837db96d56Sopenharmony_ci
10847db96d56Sopenharmony_ci
10857db96d56Sopenharmony_ciThe operator module
10867db96d56Sopenharmony_ci-------------------
10877db96d56Sopenharmony_ci
10887db96d56Sopenharmony_ciThe :mod:`operator` module was mentioned earlier.  It contains a set of
10897db96d56Sopenharmony_cifunctions corresponding to Python's operators.  These functions are often useful
10907db96d56Sopenharmony_ciin functional-style code because they save you from writing trivial functions
10917db96d56Sopenharmony_cithat perform a single operation.
10927db96d56Sopenharmony_ci
10937db96d56Sopenharmony_ciSome of the functions in this module are:
10947db96d56Sopenharmony_ci
10957db96d56Sopenharmony_ci* Math operations: ``add()``, ``sub()``, ``mul()``, ``floordiv()``, ``abs()``, ...
10967db96d56Sopenharmony_ci* Logical operations: ``not_()``, ``truth()``.
10977db96d56Sopenharmony_ci* Bitwise operations: ``and_()``, ``or_()``, ``invert()``.
10987db96d56Sopenharmony_ci* Comparisons: ``eq()``, ``ne()``, ``lt()``, ``le()``, ``gt()``, and ``ge()``.
10997db96d56Sopenharmony_ci* Object identity: ``is_()``, ``is_not()``.
11007db96d56Sopenharmony_ci
11017db96d56Sopenharmony_ciConsult the operator module's documentation for a complete list.
11027db96d56Sopenharmony_ci
11037db96d56Sopenharmony_ci
11047db96d56Sopenharmony_ciSmall functions and the lambda expression
11057db96d56Sopenharmony_ci=========================================
11067db96d56Sopenharmony_ci
11077db96d56Sopenharmony_ciWhen writing functional-style programs, you'll often need little functions that
11087db96d56Sopenharmony_ciact as predicates or that combine elements in some way.
11097db96d56Sopenharmony_ci
11107db96d56Sopenharmony_ciIf there's a Python built-in or a module function that's suitable, you don't
11117db96d56Sopenharmony_cineed to define a new function at all::
11127db96d56Sopenharmony_ci
11137db96d56Sopenharmony_ci    stripped_lines = [line.strip() for line in lines]
11147db96d56Sopenharmony_ci    existing_files = filter(os.path.exists, file_list)
11157db96d56Sopenharmony_ci
11167db96d56Sopenharmony_ciIf the function you need doesn't exist, you need to write it.  One way to write
11177db96d56Sopenharmony_cismall functions is to use the :keyword:`lambda` expression.  ``lambda`` takes a
11187db96d56Sopenharmony_cinumber of parameters and an expression combining these parameters, and creates
11197db96d56Sopenharmony_cian anonymous function that returns the value of the expression::
11207db96d56Sopenharmony_ci
11217db96d56Sopenharmony_ci    adder = lambda x, y: x+y
11227db96d56Sopenharmony_ci
11237db96d56Sopenharmony_ci    print_assign = lambda name, value: name + '=' + str(value)
11247db96d56Sopenharmony_ci
11257db96d56Sopenharmony_ciAn alternative is to just use the ``def`` statement and define a function in the
11267db96d56Sopenharmony_ciusual way::
11277db96d56Sopenharmony_ci
11287db96d56Sopenharmony_ci    def adder(x, y):
11297db96d56Sopenharmony_ci        return x + y
11307db96d56Sopenharmony_ci
11317db96d56Sopenharmony_ci    def print_assign(name, value):
11327db96d56Sopenharmony_ci        return name + '=' + str(value)
11337db96d56Sopenharmony_ci
11347db96d56Sopenharmony_ciWhich alternative is preferable?  That's a style question; my usual course is to
11357db96d56Sopenharmony_ciavoid using ``lambda``.
11367db96d56Sopenharmony_ci
11377db96d56Sopenharmony_ciOne reason for my preference is that ``lambda`` is quite limited in the
11387db96d56Sopenharmony_cifunctions it can define.  The result has to be computable as a single
11397db96d56Sopenharmony_ciexpression, which means you can't have multiway ``if... elif... else``
11407db96d56Sopenharmony_cicomparisons or ``try... except`` statements.  If you try to do too much in a
11417db96d56Sopenharmony_ci``lambda`` statement, you'll end up with an overly complicated expression that's
11427db96d56Sopenharmony_cihard to read.  Quick, what's the following code doing? ::
11437db96d56Sopenharmony_ci
11447db96d56Sopenharmony_ci    import functools
11457db96d56Sopenharmony_ci    total = functools.reduce(lambda a, b: (0, a[1] + b[1]), items)[1]
11467db96d56Sopenharmony_ci
11477db96d56Sopenharmony_ciYou can figure it out, but it takes time to disentangle the expression to figure
11487db96d56Sopenharmony_ciout what's going on.  Using a short nested ``def`` statements makes things a
11497db96d56Sopenharmony_cilittle bit better::
11507db96d56Sopenharmony_ci
11517db96d56Sopenharmony_ci    import functools
11527db96d56Sopenharmony_ci    def combine(a, b):
11537db96d56Sopenharmony_ci        return 0, a[1] + b[1]
11547db96d56Sopenharmony_ci
11557db96d56Sopenharmony_ci    total = functools.reduce(combine, items)[1]
11567db96d56Sopenharmony_ci
11577db96d56Sopenharmony_ciBut it would be best of all if I had simply used a ``for`` loop::
11587db96d56Sopenharmony_ci
11597db96d56Sopenharmony_ci     total = 0
11607db96d56Sopenharmony_ci     for a, b in items:
11617db96d56Sopenharmony_ci         total += b
11627db96d56Sopenharmony_ci
11637db96d56Sopenharmony_ciOr the :func:`sum` built-in and a generator expression::
11647db96d56Sopenharmony_ci
11657db96d56Sopenharmony_ci     total = sum(b for a, b in items)
11667db96d56Sopenharmony_ci
11677db96d56Sopenharmony_ciMany uses of :func:`functools.reduce` are clearer when written as ``for`` loops.
11687db96d56Sopenharmony_ci
11697db96d56Sopenharmony_ciFredrik Lundh once suggested the following set of rules for refactoring uses of
11707db96d56Sopenharmony_ci``lambda``:
11717db96d56Sopenharmony_ci
11727db96d56Sopenharmony_ci1. Write a lambda function.
11737db96d56Sopenharmony_ci2. Write a comment explaining what the heck that lambda does.
11747db96d56Sopenharmony_ci3. Study the comment for a while, and think of a name that captures the essence
11757db96d56Sopenharmony_ci   of the comment.
11767db96d56Sopenharmony_ci4. Convert the lambda to a def statement, using that name.
11777db96d56Sopenharmony_ci5. Remove the comment.
11787db96d56Sopenharmony_ci
11797db96d56Sopenharmony_ciI really like these rules, but you're free to disagree
11807db96d56Sopenharmony_ciabout whether this lambda-free style is better.
11817db96d56Sopenharmony_ci
11827db96d56Sopenharmony_ci
11837db96d56Sopenharmony_ciRevision History and Acknowledgements
11847db96d56Sopenharmony_ci=====================================
11857db96d56Sopenharmony_ci
11867db96d56Sopenharmony_ciThe author would like to thank the following people for offering suggestions,
11877db96d56Sopenharmony_cicorrections and assistance with various drafts of this article: Ian Bicking,
11887db96d56Sopenharmony_ciNick Coghlan, Nick Efford, Raymond Hettinger, Jim Jewett, Mike Krell, Leandro
11897db96d56Sopenharmony_ciLameiro, Jussi Salmela, Collin Winter, Blake Winton.
11907db96d56Sopenharmony_ci
11917db96d56Sopenharmony_ciVersion 0.1: posted June 30 2006.
11927db96d56Sopenharmony_ci
11937db96d56Sopenharmony_ciVersion 0.11: posted July 1 2006.  Typo fixes.
11947db96d56Sopenharmony_ci
11957db96d56Sopenharmony_ciVersion 0.2: posted July 10 2006.  Merged genexp and listcomp sections into one.
11967db96d56Sopenharmony_ciTypo fixes.
11977db96d56Sopenharmony_ci
11987db96d56Sopenharmony_ciVersion 0.21: Added more references suggested on the tutor mailing list.
11997db96d56Sopenharmony_ci
12007db96d56Sopenharmony_ciVersion 0.30: Adds a section on the ``functional`` module written by Collin
12017db96d56Sopenharmony_ciWinter; adds short section on the operator module; a few other edits.
12027db96d56Sopenharmony_ci
12037db96d56Sopenharmony_ci
12047db96d56Sopenharmony_ciReferences
12057db96d56Sopenharmony_ci==========
12067db96d56Sopenharmony_ci
12077db96d56Sopenharmony_ciGeneral
12087db96d56Sopenharmony_ci-------
12097db96d56Sopenharmony_ci
12107db96d56Sopenharmony_ci**Structure and Interpretation of Computer Programs**, by Harold Abelson and
12117db96d56Sopenharmony_ciGerald Jay Sussman with Julie Sussman.  The book can be found at
12127db96d56Sopenharmony_cihttps://mitpress.mit.edu/sicp.  In this classic textbook of computer science,
12137db96d56Sopenharmony_cichapters 2 and 3 discuss the use of sequences and streams to organize the data
12147db96d56Sopenharmony_ciflow inside a program.  The book uses Scheme for its examples, but many of the
12157db96d56Sopenharmony_cidesign approaches described in these chapters are applicable to functional-style
12167db96d56Sopenharmony_ciPython code.
12177db96d56Sopenharmony_ci
12187db96d56Sopenharmony_cihttps://www.defmacro.org/ramblings/fp.html: A general introduction to functional
12197db96d56Sopenharmony_ciprogramming that uses Java examples and has a lengthy historical introduction.
12207db96d56Sopenharmony_ci
12217db96d56Sopenharmony_cihttps://en.wikipedia.org/wiki/Functional_programming: General Wikipedia entry
12227db96d56Sopenharmony_cidescribing functional programming.
12237db96d56Sopenharmony_ci
12247db96d56Sopenharmony_cihttps://en.wikipedia.org/wiki/Coroutine: Entry for coroutines.
12257db96d56Sopenharmony_ci
12267db96d56Sopenharmony_cihttps://en.wikipedia.org/wiki/Currying: Entry for the concept of currying.
12277db96d56Sopenharmony_ci
12287db96d56Sopenharmony_ciPython-specific
12297db96d56Sopenharmony_ci---------------
12307db96d56Sopenharmony_ci
12317db96d56Sopenharmony_cihttps://gnosis.cx/TPiP/: The first chapter of David Mertz's book
12327db96d56Sopenharmony_ci:title-reference:`Text Processing in Python` discusses functional programming
12337db96d56Sopenharmony_cifor text processing, in the section titled "Utilizing Higher-Order Functions in
12347db96d56Sopenharmony_ciText Processing".
12357db96d56Sopenharmony_ci
12367db96d56Sopenharmony_ciMertz also wrote a 3-part series of articles on functional programming
12377db96d56Sopenharmony_cifor IBM's DeveloperWorks site; see
12387db96d56Sopenharmony_ci`part 1 <https://developer.ibm.com/articles/l-prog/>`__,
12397db96d56Sopenharmony_ci`part 2 <https://developer.ibm.com/tutorials/l-prog2/>`__, and
12407db96d56Sopenharmony_ci`part 3 <https://developer.ibm.com/tutorials/l-prog3/>`__,
12417db96d56Sopenharmony_ci
12427db96d56Sopenharmony_ci
12437db96d56Sopenharmony_ciPython documentation
12447db96d56Sopenharmony_ci--------------------
12457db96d56Sopenharmony_ci
12467db96d56Sopenharmony_ciDocumentation for the :mod:`itertools` module.
12477db96d56Sopenharmony_ci
12487db96d56Sopenharmony_ciDocumentation for the :mod:`functools` module.
12497db96d56Sopenharmony_ci
12507db96d56Sopenharmony_ciDocumentation for the :mod:`operator` module.
12517db96d56Sopenharmony_ci
12527db96d56Sopenharmony_ci:pep:`289`: "Generator Expressions"
12537db96d56Sopenharmony_ci
12547db96d56Sopenharmony_ci:pep:`342`: "Coroutines via Enhanced Generators" describes the new generator
12557db96d56Sopenharmony_cifeatures in Python 2.5.
12567db96d56Sopenharmony_ci
12577db96d56Sopenharmony_ci.. comment
12587db96d56Sopenharmony_ci
12597db96d56Sopenharmony_ci    Handy little function for printing part of an iterator -- used
12607db96d56Sopenharmony_ci    while writing this document.
12617db96d56Sopenharmony_ci
12627db96d56Sopenharmony_ci    import itertools
12637db96d56Sopenharmony_ci    def print_iter(it):
12647db96d56Sopenharmony_ci         slice = itertools.islice(it, 10)
12657db96d56Sopenharmony_ci         for elem in slice[:-1]:
12667db96d56Sopenharmony_ci             sys.stdout.write(str(elem))
12677db96d56Sopenharmony_ci             sys.stdout.write(', ')
12687db96d56Sopenharmony_ci        print(elem[-1])
1269