{ "q1": { "type": "blank", "question": "\n
In the functional programming paradigm, functions should be ____, meaning\nfunctions only rely on their given inputs to produce an output. \n\nSuch functions should avoid modifying ____ or mutable data, thus limiting\nthe amount of observable ____.\n
\n\nTo enable the functional programming paradigm, functions in Python are\n____ citizens. This means you can assign functions to variables and pass\nthem as arguments to other functions, which allows for function ____.
\n\nTwo common higher-order functions in Python are:
\n\nTo create anonymous functions that we can pass to the higher-order\nfunctions above, we can use ____ expressions.
\n\nBecause the two higher-order functions above return iterables rather\nthan lists, we can re-write them using ____, which are a more Pythonic\nway of making lists.
\n\nRather than materializing or populating a whole list, we can produce\nitems one-by-one using a ____ function that contains the\nyield keyword.
\n" } }