Skip to content

Instantly share code, notes, and snippets.

@Gijs-Koot
Last active March 18, 2017 11:02
Show Gist options
  • Save Gijs-Koot/8b5f7cdcc3398bedf137b5b86592beca to your computer and use it in GitHub Desktop.
Save Gijs-Koot/8b5f7cdcc3398bedf137b5b86592beca to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Some advanced python tricks\n",
"\n",
"* Using `yield`, `yield from`\n",
"* Using `**kwargs`, `*args`\n",
"* Using decorators\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"### `yield` and `yield from`\n",
"\n",
"* `yield` is a keyword that is related to `return` \n",
"* It turns the function into a generator"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"data": {
"text/plain": [
"<generator object generate_even_numbers at 0x7fc28c655f68>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def generate_even_numbers(until=10):\n",
" for i in range(until):\n",
" if not(i % 2):\n",
" yield i\n",
" \n",
"generate_even_numbers(10)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0\n",
"2\n",
"4\n",
"6\n",
"8\n"
]
}
],
"source": [
"for n in generate_even_numbers(10):\n",
" print(n)"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10\n",
"10\n",
"10\n",
"10\n",
"10\n",
"10\n",
"10\n",
"10\n",
"10\n",
"10\n"
]
}
],
"source": [
"from itertools import islice\n",
"\n",
"for i in islice(range(100), 10):\n",
" print(10)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10\n",
"10\n",
"10\n",
"10\n",
"10\n",
"10\n",
"10\n",
"10\n",
"10\n",
"10\n"
]
}
],
"source": [
"## Exercise 1: reimplement islice\n",
"\n",
"from itertools import islice\n",
"\n",
"for i in islice(range(100), 10):\n",
" print(10)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"## Exercise\n",
"\n",
"* Implement `fibonacci`: a generator for fibonacci numbers"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0\n",
"1\n",
"2\n",
"0\n",
"1\n",
"2\n"
]
}
],
"source": [
"def range_twice(x):\n",
" yield from range(x)\n",
" yield from range(x)\n",
" \n",
"for i in range_twice(3):\n",
" print(i)"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [],
"source": [
"## Exercise 3: flattening\n",
"\n",
"d = {\n",
" \"first\": {\n",
" \"second\": {\n",
" \"a\": \"b\",\n",
" \"x\": \"y\"\n",
" },\n",
" \"second_other\": \"c\"\n",
" }\n",
"}\n",
"\n",
"a = {\n",
" \"first.second.a\": \"b\",\n",
" \"first.second_other.x\": \"y\",\n",
" \"first.second_other\": \"c\"\n",
"}"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Unpacking arguments with `*` and `**`\n",
"\n",
"* You can use `*` to unpack lists that are meant as single arguments"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"data": {
"text/plain": [
"'/home/gijs/Desktop'"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import os\n",
"\n",
"os.path.join(\"/\", \"home/\", \"gijs\", \"Desktop\")"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"ename": "TypeError",
"evalue": "join() argument must be str or bytes, not 'list'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-22-d74f0b1bcfa4>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mpath\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;34m\"home\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"gijs\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"Desktop\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mos\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mpath\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/usr/share/anaconda/anaconda/lib/python3.5/posixpath.py\u001b[0m in \u001b[0;36mjoin\u001b[1;34m(a, *p)\u001b[0m\n\u001b[0;32m 87\u001b[0m \u001b[0mpath\u001b[0m \u001b[1;33m+=\u001b[0m \u001b[0msep\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mb\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 88\u001b[0m \u001b[1;32mexcept\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mTypeError\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mAttributeError\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mBytesWarning\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 89\u001b[1;33m \u001b[0mgenericpath\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_check_arg_types\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'join'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0mp\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 90\u001b[0m \u001b[1;32mraise\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 91\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mpath\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m/usr/share/anaconda/anaconda/lib/python3.5/genericpath.py\u001b[0m in \u001b[0;36m_check_arg_types\u001b[1;34m(funcname, *args)\u001b[0m\n\u001b[0;32m 141\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 142\u001b[0m raise TypeError('%s() argument must be str or bytes, not %r' %\n\u001b[1;32m--> 143\u001b[1;33m (funcname, s.__class__.__name__)) from None\n\u001b[0m\u001b[0;32m 144\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mhasstr\u001b[0m \u001b[1;32mand\u001b[0m \u001b[0mhasbytes\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 145\u001b[0m \u001b[1;32mraise\u001b[0m \u001b[0mTypeError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"Can't mix strings and bytes in path components\"\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mTypeError\u001b[0m: join() argument must be str or bytes, not 'list'"
]
}
],
"source": [
"path = [\"home\", \"gijs\", \"Desktop\"]\n",
"os.path.join(path)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"data": {
"text/plain": [
"'home/gijs/Desktop'"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"path = [\"home\", \"gijs\", \"Desktop\"]\n",
"os.path.join(*path)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "slide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n"
]
},
{
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x7fc252a3dc88>"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc252b1e5c0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%pylab inline\n",
"\n",
"x = stats.norm().rvs(100)\n",
"y = .7 * stats.norm().rvs(100) + .3 * x\n",
"\n",
"plt.scatter(x=x, y=y)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"collapsed": false,
"scrolled": true,
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.collections.PathCollection at 0x7fc252a0a3c8>"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc252b15fd0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"data = {\n",
" \"x\": x,\n",
" \"y\": y\n",
"}\n",
"\n",
"plt.scatter(**data)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## `**kwargs` and `*args` as function arguments\n",
"\n",
"* These work the other way around; `kwargs` will be a `dict` of keyword arguments, and `args` a `tuple`"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"('a', 'b')\n"
]
}
],
"source": [
"def f(*args):\n",
" print(args)\n",
" \n",
"f(\"a\", \"b\")"
]
},
{
"cell_type": "code",
"execution_count": 60,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'x': 'x', 'y': 'y'}\n"
]
}
],
"source": [
"def g(**kwargs):\n",
" print(kwargs)\n",
" \n",
"g(x=\"x\", y=\"y\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"## Exercises\n",
"\n",
"* Write a function takes multiple lists and prints them all on a new line separated by pipes"
]
},
{
"cell_type": "code",
"execution_count": 61,
"metadata": {
"collapsed": true,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [],
"source": [
"# print_lists([1, 2, 3], [3, 4, 5, 6])\n",
"\n",
"# > 1 | 2 | 3\n",
"# > 3 | 4 | 5 | 6"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"* Write a function that takes multiple keywords and prints a markdown table\n",
"\n",
" md_table(x=[3, 4, 5], y=[3, 2, 1], z=[5, 3, 2])\n",
" \n",
"x | y | z\n",
"--- | --- | ---\n",
"3 | 3 | 5\n",
"4 | 2 | 3\n",
"5 | 1 | 2\n"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAhAAAAFyCAYAAACk1ONFAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3Xu4JGV57/3vjyWiEh1OCkKIRphBdqLoWoiiAiqDM2A8\nxmyzRgPBxMQT+o5Xom+MO0bzKooHEH2JJCYqMa5ITNxwsYcZHDwQVCSuJWoMuDh45iiDg4J4mLn3\nH0819OrpQ1V3V3dV9+9zXX3NrOqq7qerD3XX89zPXYoIzMzMzIrYbdwNMDMzs/pxAGFmZmaFOYAw\nMzOzwhxAmJmZWWEOIMzMzKwwBxBmZmZWmAMIMzMzK8wBhJmZmRXmAMLMzMwKcwBhZmZmhTmAsJGT\ndKSkD0j6L0k/lfRdSZ+QtLrNuo+WtFnSTyTdLuk8Sfu1We8Vks7PHmunpH/s8Nyfze5vd/t5gdfw\nHEmLkn6WPedfS5rp93V2eI4HSnqVpC2SbpR0p6QlSS+XtFvLug+X9DFJ12Tr3SHpy5JOblrnuC6v\nvfm2o5/2532vOmzbqW07JB3VZbv7SfrvbN3X5XyuPSW9RdLFWTt3Nu+nlnX/WNLnJN0s6R5JN0j6\nR0mPyPNc2WPsLumNkq7OPi83S7pI0oFN6/R8/5rWfYGkf5F0vaS7sm3eLWlVj3Y8KnsNOyXN9lj3\nL7P1vl7GPrHJcL9xN8Cm0huAJwP/CnwdOAA4DViS9MSI+G8ASQcB/wHcAfy/wIOBPwd+W9JREfGr\npsd8PfBrwJXZ43Xy/wF/37JsT+BcYEuexks6EfgU8Bng1cBjgDcBDwVeVfR1dvEo4GxgK/Ae4E5g\nHXAO8ETg1KZ19wMOzJ7re8DuwAnARyStiYg3AVcDL2l5jncAPyHtF2XLGhfIyd3+gu9VN2cBX2lZ\ndl2X9V8DHNzU5jz2A/4X8F3gKuBpXdZ9PHADcAHptf0m8CfAsyQdERE3d3siSfcDNgFPIn3uvg7s\nTXr/VgE3NrWp1/vXcC7wQ+CfsnUfQ/ocnihpNiI6BcJnAb/IHrtbmw8C/gL4aYdVBtonNkEiwjff\nRnoj/Zjer2XZocDPgPOalp1D+hE7qGnZ8cBO4I9btj+46f8/Af6xQHtenD3mi3Ku/01gEditadnf\nAL8C1hR9nV2eZ1/g8DbL/wHYATwqx2NcSAo81OH+bwCfGeR9KvpedXiu47J1X1DgfXsY6QD2l9m2\nr8u53e7Aw7L/z2XbnlzgeWezbV6fY93XA/cAc3kfv9f7BxzbZr0/yNr00g6Psy57396SfXZmuzzn\nvwCfBj4LfH3Y+8S3ybl5CMNGLiKuiJYz0oi4jnRgPrxp8QuAiyLih03rXQosA/+zZfvvD9CkF5MO\nfhf2WlHS4Vkb/y4idjbddQ5pSPCFTW3K+zrbiojbI+LqNnd9Kvu352OQzrIfBNw/x7qtz1+k/bnf\nK0kHSzqs0/NK+jW1DAd18A5Sr8o/d3msXZ4rIn4ZEbfmePxOvpv9u1e3lSSJ1EPy7xGxKGlG0gP7\neK4V719EXNZmvY6fiawX5KzsdkOPNh9Lei//nz7aCT32iU0WBxBWJfsDPwLIxocfxq7d2ZCGKR4/\njCfMxujXAp+KiJ/l2OTxpO7yxeaFEXET8IOc7br3dfbp4dm/uzyGpAdI2lfSIySdAvwh8MXo3K3d\njxXt7+O9+ifSgb+dD5POuO+R9BlJc+1WyvIiTiYd6LoNX3R7rtwk7SPpoZKOzNoYwKU9NvsfpGGJ\nb0j6O+Au4C5JX5P0tA7P0+/71/EzAWwkHdjf1u0BlPJqzgb+PiK+2eP5+t0nNkGcA2GVIOklwEGk\nXAK47wfxpjar3wTsI2n3iPjlgE/9+8AMXc5iW/Rq14Ftlt+rzessRNLupIPmDcB/tlnltcDpTX9v\nZWWuxEA6tL/oexWk7u5mvwA+ScoX+BHp4PtnwGWSnhwRX2tZ//3AQkRc2SN5r91z9eOHwB7Z/38E\nvCbrYemmkWz6OuB24GWkPJM3AhdLekJE/FfLNv2+f28gDaF9snmhpANI79XrIuKnqVOko1cAvwE8\nI8fzQX/7xCaIAwgbO0mPBj4AfAE4L1vc6Optd+Z1T9M6gwYQG4DbSD/UefRq14M7bdjhdRb1/wOP\nBk5qGUJp+DgpsHgo8Duk3oIH9flcK3Rpf6H3KiKe3rpSRHwJ+FLToosk/Rsp6fB04KSmdpwK/Bbw\n/F5tbvdcfVoPPIA0RPASUuJtL7/W9O8REXEjpJlApMTQ15N6UZoVfv8kbQBeCrwjIq5vufudwPUR\n8Q89HmMfUn7EWyNiW4/X1dDPPrEJ4gDCxkrS/sD/ISXD/V5ENLqjG8MJe7TZ7AEt6/T73L9JShQ8\nu/VgLGlvVuYN/Cwi7szRrrZt6vI6kfQQ7jsIA/wiIu5o8xh/Dvwx8JcR0XbGSJYL0sgH+YSkc4Gt\nWSZ/38MY3dpPSe9VRFwv6QLg+ZIUESHpwcDbgTMaB+RRiIjPZ//dIulC4L8k/TQizumyWeM1f6G5\nrRHxfUmXk2a4tD5PofdP0jHAh4CLaenVkvQkUn5Pnh6Ft5F6ST6QY91GW/vZJzZBnANhY5MdODcD\nDwHWx8rpX43u8IfvsmFatm0IwxcvJnVxf7zNff+eteEm0lS7s3K2a5eDWo/XCfC+pue6Cfi3No/x\nh6SkwXMi4vTW+7v4JPDrwLEFtml97l7tL/O9+j4pkGuc3f45aRbF+VmewCNI0zgB9s6WdZ2mOKiI\nuAH4Kunz003js3BLm/tuJU3n7KXj+yfpCNJUyq+TgrrWHqkzSFNrv9u0rx6a3XegpIOzxzmUNLxy\nNnBQtu4jScHf7tnfXdtaYJ/YBHEPhI2FpD2Ai0jTAo+PiG813x8RN0q6DTiyzeZHkebvD2qe1L17\nZZv7XsfKH/jGweAq0jj2kTQlDUp6OOmH/oPND9LrdWbeSUr2a1jR+yDpuaQaAp+MiFf3flkrPDBr\nb9ciQ53kaX/J79UhwD0R0ahJcDDpfWmtoRGk6ZxvJCVt7lIAacgeSO+ZLd8gDdsc1Oa+A0lDZ3me\nZ5f3T9IhpKDuZtJw1t1ttj2YlNPw7ZblQZpx9GNgn6x9IgUQ72/zODeQgtxehbry7BObIA4gbOSy\nbO/zScV0ntPhAA7pTPxkSQc1pgdKOh5YQyqsNEgbHkcau31Lu/sj4qsdlv+3pGuAP5F0blNX/itJ\nyXr39h7kfZ0RcQ1wTYd2HgssAJ9j1yJQzevtFxHtMvD/OGvXUqdtuzxm3vcJCrxX2Znvg5qDkXbt\nz86wn00aOml4H/dNWWx4GPB3pJkA/5umA2a758orm0r64Ij4ccvyo0jFmz7Wsvww4O7GlOIsaXET\nqcDSmohYztY7nDR88bdN2+Z+/7LhpEtISZPru+QsvIxd8yeOJxWdeh3Q2Cf/Rft8kreR8jdeQzb9\ns+g+scmmlUOZZuWTdBbpR+lCUuW9FSLin7P1fp30w7mddOB4MCkz/3vAUc3d4pJ+BziCdCb1JlKt\ngn/P7r6gNdtd0rtJ09seHRHXFmz/s0hdx58jFd15DKkC5d9HxCuKvs4uz/MbpDPp+5G67u9sWeXr\nEfGNbN0zgaeQzkq/Rzqz/F1Sr8DZEbGxw3N8A7gtInYZJy/S/oLv1edIxZB2a1p2KSln4Iuk7v3f\nIh0Afw48uVsAkHXNfxv4s4h4b8t9uzxXtvxVpKmNBwEvJ31WGkHj2RHxE6XS0D8APkH6PN0FPJY0\ntfJu4OjmpEVJO4HPNe/LLFj4Mqm42dmkz+dppOHj2Wz6b6H3T9JVpM/cGaSDf7NbIqJjQnA2NfTD\nwJER0TWozJI9942IxzYtK7RPbMJFBapZ+TZdN1KFux2dbi3rHk5KEPsJKcnro8BD2zzmh7s85skt\n64o0tn7lAK/hOaRaEHeTiuj8NTDT7+vs8BzHddse+KumdY8nBTXfJ818+DFwGfAHPZ7jG8Clg75P\nBd+rzwK/aln2atIsjNtIQcMPgI+Qr9rmI7I27VKJst1zZcu/3eW1/Ua2zu7Ae0mBxR3Zfr2BVEr6\nN9o85o52+xJ4HKlM+p3Z+/JvwCEt6+R+/3p8JtpWFW3a9hR6VKJs2Xdfa1lWaJ/4Ntk390CYmZlZ\nYaXOwpD0F5KuVLq63C2SPiVpTY7tnqZ0pcN7JC1n3W5mZmZWEWVP4zyGlNX7RFK54N2BS9SlHnw2\nfegiUknUI0jjqR+SdELJbTUzM7OcRjqEoXTdgVtJSU2Xd1jnncCJsTJxZwFYFREntdvGzMzMRmvU\nhaT2Is1B7lYq9UnsWlZ4C3B0WY0yMzOzYkZWB0LpKi5nAZdHRGsRmGYHsGvltluAh0jaI1rKuUra\nl3St++9wX919MzMz6+0BwCOBLRFxe5ENR1lI6hzSFfaeMuTHXUf+KymamZnZrl5M+7L+HY0kgJD0\nAdLV9I6JrHBKFzeTrkDXbH/gztbeh8x3AD72sY9x+OGHD9rUqbJx40bOPPPMcTejVrzP+uP9Vpz3\nWX+834q5+uqreclLXgLZsbSI0gOILHh4LnBcRHwvxyZfAk5sWfZMVl7qt9k9AIcffjizs7N9t3Ma\nrVq1yvusIO+z/ni/Fed91h/vt74VTgEouw7EOaRukQ3AXZL2z24PaFrn7ZI+2rTZB4FHSXqnpMMk\nvRJ4Ian6mZmZmVVA2bMwXk66BPDnSFczbNz+Z9M6D+e+y/ESEd8BnkWqG3EV6XoFfxRd6rubmZnZ\naJU6hBEtF7DpsM6pbZZdBsyV0igzMzMb2KjrQFiFzM/Pj7sJteN91h/vt+K8z/rj/TY6tb+YlqRZ\nYHFxcdGJM2ZmZgUsLS0xNzcHMBc9LvHeyj0QZmZmVpgDCDMzMyvMAYSZmZkV5gDCzMzMCnMAYWZm\nZoU5gDAzM7PCHECYmZlZYQ4gzMzMrDAHEGZmZlaYAwgzMzMrzAGEmZmZFeYAwszMzApzAGFmZmaF\nOYAwMzOzwhxAmJmZWWEOIMzMzKwwBxBmZmZWmAMIMzMzK+x+426AmVnlLS/D9dfDoYfC6tXjbo1Z\nJbgHwsysk23bYP16OOwwOOkkWLMm/X3HHeNumdnYOYAwM+tkwwbYunXlsq1bYX5+PO0xqxAHEGZm\n7Swvw5YtsGPHyuU7dqTl1147nnaZVYQDCDOzdq6/vvv91103mnaYVZQDCDOzdg45pPv9hx46mnaY\nVZQDCDOzdtasgXXrYGZm5fKZmbTcszFsyjmAMDPrZGEB1q5duWzt2rTcbMqVGkBIOkbShZJ+KGmn\npOf0WP+4bL3m2w5JDyuznWZmbe29N2zenBIqN21K/27enJabTbmyC0ntCVwF/APw7zm3CWAN8JN7\nF0TcOvymmZnltHq1hyzMWpQaQETEZmAzgCQV2PS2iLiznFaZmZnZoKqYAyHgKkk3SrpE0pPH3SAz\nMzNbqWoBxE3AnwK/C7wA+D7wOUmPG2urzMzMbIVKXUwrIpaB5aZFV0g6BNgInNJt240bN7Jq1aoV\ny+bn55l3yVkzMzMWFhZYaJlBtH379r4fTxExaJvyPZG0E3heRFxYcLszgKdExFM63D8LLC4uLjI7\nOzuElpqZmU2HpaUl5ubmAOYiYqnItlUbwmjncaShDTMzM6uIUocwJO0JHEpKjAR4lKQjgG0R8X1J\npwMHRsQp2fqvBb4NfBN4APAy4OnACWW208yssOXldL2MQw/1FE+bSmXnQBwJfJZU2yGA92TLPwq8\nFDgAOLhp/ftn6xwI3A18HTg+Ii4ruZ1mZvls25Yu871ly33L1q1L1SldYMqmSNl1ID5Pl2GSiDi1\n5e93Ae8qs01mZgPZsAG2bl25bOtWmJ9PVSrNpkQdciDMzKpheTn1POzYsXL5jh1p+bXXjqddZmPg\nAMLMLK/rr+9+/3XXjaYdZhXgAMLMLK9DDul+/6GHjqYdZhXgAMLMLK81a1LC5MzMyuUzM2m5Z2PY\nFHEAYWZWxMICrF27ctnatWm52RSpVClrM7PK23vvNNvi2mtTzoPrQEwH1/3YhQMIM7N+rF7tA8k0\ncN2PjjyEYWZm1km3uh9TzgGEmZlZO6770ZUDCDMzs3Zc96MrBxBmZmbtuO5HVw4gzMzM2nHdj64c\nQJiZmXXiuh8deRqnmZlZJ6770ZEDCDMbLxfosTpw3Y9deAjDzMZj2zZYvx4OOwxOOimNN69fD3fc\nMe6WmVkODiDMbDxcoMes1hxAmNnouUCPWe05gDCz0XOBHrPacxKlmY3eqAr0OEHTrDTugTCz0Su7\nQI8TNM1K5wDCzMajzAI9TtA0K52HMMxsPMoq0NNI0GzVnKDp4QyzgTmAMLPxGnaBnjwJmg4gzAbm\nIQwzmyy+gqLZSDiAMLP8lpfh4ourXafBV1A0GwkHEGZlqcPBNq+6zWrwFRTNSldqACHpGEkXSvqh\npJ2SnpNjm6dJWpR0j6RlSaeU2UazoavbwTaPus1qaCRoLi/Dpk3p382b03IzG4qyeyD2BK4CXglE\nr5UlPRK4CLgUOAJ4H/AhSSeU10SzIavbwbaXQctOj7MnZvVqOPFED1uYlaDUWRgRsRnYDCBJOTZ5\nBXBDRLw++/tbkp4KbAQ+XU4rzYZoEqcQ9jurYdu2FEw1749169IwgnsCzGqvajkQTwJaTt3YAhw9\nhraYFTeKazyM+oy+31kNk9YTY2YrVC2AOAC4pWXZLcBDJO0xhvaYFVPmFMJx5Vb0M6vBV9ucPpOU\nNGy5VC2AMKu3MqcQjvOMvuisBl9tc3pMYtKw5VK1SpQ3A/u3LNsfuDMift5tw40bN7Jq1aoVy+bn\n55l3d6mN2sJCOqg3j/0POoVwnLkVjStavv/96e88ZaddzGl6dAtsN28eT5usrYWFBRZafoe2b9/e\n9+MpoufkiKGQtBN4XkRc2GWddwAnRsQRTcs+DuwVESd12GYWWFxcXGR2dnbYzTbr3zCv8XDxxens\nrpNNm9Jsg2EaNAly/fp0IGkexpiZScGUDyyTYXk59Tx0u79uScNTZmlpibm5OYC5iFgqsm3ZdSD2\nlHSEpMdlix6V/X1wdv/pkj7atMkHs3XeKekwSa8EXgi8t8x2mpVimFMIx3FGP+iQiYs5TT4PVU21\nsnMgjgS+CiyS6kC8B1gC3pLdfwBwcGPliPgO8CxgLal+xEbgjyKidWaG2XQZdXnmYSRBupjTfSY1\nwdBDVVOt7DoQn6dLkBIRp7ZZdhkwV2a7zGqpjNyKToZ5RcthX22zTia9FkYjsO00VNXpfW/k1Qzr\nEu42Fp6FYVYXozyj95nlcExDLYwiQ1WesTFRHECY1c0oyjP7ipaDm5ZaGEUC22kIqKaIAwgza89J\nkIOZtgTDXoHttARUU6RqdSDMrCoaZ5bDnI46TTwMtNIw82qsEhxAmFl305wEOYh+EwwnlQOqieMh\nDDOzsngY6D7Oq5k47oEwMyuLh4FWGuVUZCudAwgzs7J5GChxQDVRHECYmdloOaCaCA4gzMxsfFyV\nsracRGlmZqPnqpS15wDCzGwaVO2CXq5KWXsOIMzMJlkVz/RdlXIiOIAwM+tH1c7oO6nimf60lfme\nUA4gzMyKqOIZfSdVPdN3VcqJ4ADCzKyIKp7Rd1LVM31XpZwIDiDMzPKq6hl9J1U+03eZ79pzAGFm\nlldVz+g7qfKZfqMq5fIybNqU/t28OS23WnAAYWaWV5XP6Dup+pn+6tVw4oketqghV6I0M8trzRrY\nd1+4/fZd79t332oeBH39CSuJAwgzs7yWl9sHD5CWX3ttdQ/Ovv6EDZmHMMzM8qpbDoRZiRxAmJnl\nVcccCLOSOIAws6QulRXHqcqzGmzyVPw76QDCbBiKfNGr9qNQp8qKVVD1WQ1WfzX5TjqAMBtEkS96\nVX8U6lRZsQpcv8DKVpPvpAMIs0EU+aJX8UehbpUVq8T1C6wMNfpOOoAw61eRL3pVfxQ8q8CsWmr0\nnSw9gJD0KknflvQzSVdIekKXdY+TtLPltkPSw8pup1lhRb7oVf1R8KwCs2qp0Xey1ABC0ouA9wBv\nBh4PfA3YImm/LpsFsBo4ILs9PCJuLbOdZn0p8kWv6o9CWbMKqpYoalYXNZrpU3YPxEbg3Ig4LyKu\nAV4O3A28tMd2t0XErY1byW0060+RL3qVfxSGOaugqomiZnVSk5k+pQUQknYH5oBLG8siIoCtwNHd\nNgWuknSjpEskPbmsNpoNrMgXvao/CsOcVVDFRFGzuqnJTJ8yr4WxHzAD3NKy/BbgsA7b3AT8KfAV\nYA/gZcDnJB0VEVeV1VCzvhW5UNHee8PZZ8Nll6W/jzuuUt2RA18roZEo2qo5UbRKr7fKlpdT3owv\nfDXdKn79kkpdTCsiloHlpkVXSDqENBRyynhaZZZDry/6tm3p7Lz5ALtuXep9qNhZRd/yJIpW+Mew\nEqbhc2ITo8wA4kfADmD/luX7AzcXeJwrgaf0Wmnjxo2sWrVqxbL5+Xnm3XVqVdCta3/z5vG0adiq\nmihaJ9PwObGxWVhYYKFlyHT79u19P55SWkI5JF0BfDkiXpv9LeB7wNkR8a6cj3EJcGdEvLDD/bPA\n4uLiIrOzs0NqudkQLS+npMJu90/Kmfn69emA11zvYmYm5Xr4ANjdNH1Omnm4ZqyWlpaYm5sDmIuI\npSLblj0L473AyySdLOnRwAeBBwEfAZB0uqSPNlaW9FpJz5F0iKTfknQW8HTgAyW306w8Va0BUYaq\nJorWwTR9TsAzdiZAqTkQEXF+VvPhraShi6uAdRFxW7bKAcDBTZvcn1Q34kDSdM+vA8dHxGVlttOs\nVNPUtV8kqbRuhnWm3OlxpulzAh6umQClDmGMgocwrBbctV9fw0pszPM40/I5mdbhmgqq8hCGmYG7\n9utsWLUt8jzOtHxOpm24ZkJVahqnWWUN2n09yV37k2xYtS3yPs60fE6mbbhmQrkHwqybYSd6+RLQ\n9TKsM+WijzPpn5Mql3a33BxAmHXj0szTbVhnyj7j3tW0DNdMMAcQZp00up2bE9pgZbezTbZhnSn7\njHtX7a73cPbZcMUV/m7VhAMIs07qnOjly2kPz7DOlH3G3d7q1fDEJ8Jpp7kmRM04idKskzp2O/ta\nCsM3rMTGaUmQ7IdrQtSSeyDMOqljt7NzNsozrMTGSU+QLMpDhbXlAMKsmzp1O/uH2OqozkOFU85D\nGGbd1Knbue6X0/ZFlaZTHYcKDXAPhFk+deh2rusPsS+qNN3qOFRogAMIs8lR1x9i521Uwzhn7tRp\nqNDu5QDCrC7y/MDX7YfYeRvjV4UeoHY1ITZv9syhinMOhFnVFZmaWaecDah/3sYkqNIUytWr/X7X\niHsgzKquny7+OuRsQHl5Gy6klY97gGwADiDMqmzUP/CjPvAOO2+jCt3xRY0z2PEUShuAAwizKhvV\nD/w4D7zDzNuoS0Lm8jKcfz4ce+x4g526ztyxSnAOhFmVjeoHfpzj4MPK22j01rRq7q0Z95BOu3yW\nZqPMPdi2DV7zmvb3zcykIG7c+8sqzT0QZlU2iqmZVRkHHzRvow7d8e0CtWaj3Ofd2lLlmTtWGQ4g\nzKqu7KmZZRx4xzGuX/Xu+E6BWjtlBzu92vL+93sKpfXkAMKs6sqeIz/MA2+7XIpjjknj/WUHE1Uv\npNUrUGtWdrBTh94aqzwHEGZ1UdbUzGEeeNt1i19+ObzoRaNJEqxyIa1egRqMJtjZtg3e/vbu64y7\nt8ZqwQGEWT8mrc7AMA68ebroy54RUfWKhrOzsFuXn91RBDsbNsCXvtT+vqr01lgteBaGWRFFqkLW\nyTBmQuTpoh/VjIgqVTTsNfPiqU+F006Dxz++/DZ3mqnScPTR1eitsVpwAGFWRJXK/pZhkANvni76\nhmkqUd3uMzMzA0ccAf/yL6PdD72CvDe+sd6BsI2UhzDM8qrKdMcyDTI00ymXop1pGWPv9plZWhp9\ne6o+U8VqxQGEWV6TnLk+rEqU7XIpmk3bGHvVPjPdEmaf+tTUnkkIhG0kHECY5TXJZ2/DKgG9997w\n8Y+nqZvtVGVGxKhU8TPTLsjba680W6Yu1w+xSig9gJD0KknflvQzSVdIekKP9Z8maVHSPZKWJZ1S\ndhvNcql6nYF+DXtoZsMG+OIXVy7bbbd0hlulGRGjUMXPTOtMlac+FX7845XrVPH6IVY5pQYQkl4E\nvAd4M/B44GvAFkn7dVj/kcBFwKXAEcD7gA9JOqHMdprlVuU6A/0aZjd7p2Bk5850hjuN3eNV/cys\nXp16SC6/fLLzeqw0Zc/C2AicGxHnAUh6OfAs4KXAGW3WfwVwQ0S8Pvv7W5Kemj3Op0tuq1lvw7rw\nU5UMs5s9TzBS9/1VVJU/M36/bAClBRCSdgfmgHtLnkVESNoKHN1hsycBrVd32QKcWUojzfpVpToD\ng2p0s2/duvJMtJ8rMlZxzL8qqviZ8ftlAyhzCGM/YAa4pWX5LcABHbY5oMP6D5G0x3CbZ2b3GlY3\nexXH/K0zv182gIkpJLVx40ZWrVq1Ytn8/DzzTgQy622Y3ewLCykBr7niYWswsrycus+r1J0/rfK8\nXzYRFhYWWGh5X7dv39734ykiBm1T+wdOQxh3A78bERc2Lf8IsCoint9mm88DixHxuqZlfwicGRFt\nU7clzQKLi4uLzM7ODvdFmFn/2gUjk1oKfBJUMUfDSre0tMTc3BzAXEQUqm5WWg9ERPxS0iJwPHAh\ngCRlf5/dYbMvASe2LHtmttzM6qTdmP/v/R589rMrl11yCbzwhXDppaNrm+2qijkaVmll14F4L/Ay\nSSdLejTwQeBBwEcAJJ0u6aNN638QeJSkd0o6TNIrgRdmj2Nmdba8DJ/5DLT2ekak5Z4yaFYrpeZA\nRMT5Wc2HtwL7A1cB6yLitmyVA4CDm9b/jqRnkWZdvAb4AfBHEdE6M8PMRmVY+Qqf/3zv+30GbFYb\npSdRRsQ5wDkd7ju1zbLLSNM/zWycnK9gZl34Whhm1t6wro/RcNxx/d0/yBVCzaw0DiDMylTXg18Z\nly5fswae8Yz29z3jGbsOXwzrCqFmVgoHEGZlqPvBr6zLUH/yk2kYpNm6dWl5q2H3gJjZUE1MISmz\nSul28NvriafWAAAWu0lEQVS8eTxtKqKsEsftClZFwBVXrEzSbPSAtGruAXHCpdlYuQfC+lfX7vmy\nldH9X6Z272PZJY5Xr4YnPhFOO619L01ZPSBmNjQOIKy4unfPl60uB7927+PcHHzlK+n+si9D/dzn\nwqdbLrLb6KXxRZ6qzScPhgMI64fHprsbx8Gvnx/0du/j0hI84QkpsIA03LC8DJs2pX83bx58Cue2\nbXDMMXD55bBz58r7Gr00ki/yVEU+ebAmDiCsmKp3z1fhzGiUVzjs9we90/vY0BwQrl4NJ544vHZv\n2ABf/GL3da67rvweECvOJw/WxAGEFVOl7vnmYKFqZ0ajOvj1+4Pe630sKyBsBC6tPQ+tDj30voTL\nYfeAWH+qfvJgI+dZGFZMFcam21VI3HffXYOFcc56GOblsTsZZKZCr/ex4brrhtvuXoHLbrvBCSes\nfE5f5Kka8pw8+H2aKu6BsGJG2T3fSbuz7ttv7zyePs4zo2F3/zds29a7l6Fbb1Djfdytx0/AsAPC\nXoHLk5/sIYqqqsLJg1WKAwgrbpxj073G7tupyqyHYdqwAb72te7r9PpBX1hIZ/vtlBUQdgpAd9st\nJVb+x394iKKqqnDyYJXiAMKKG+fYdK9u1HYm7cyoVxC12275ftAb7+N//ifMzq68r8yAsF0AesIJ\ncMEF5TzfIKqQlDuoYb4GJ7ZaE+dAWP/GMTadd+we0pnR2rWTd2bUK4h63OOK/aAfeSQsLpabr9Fs\nFPkhg5qEK5GW8Rrq8N7ZyCgixt2GgUiaBRYXFxeZbT2LsuFYXk4Hrar8WKxfn3Igms/AZ2Zgr71S\nLkRD3X7w81peTrNNut1fhfepzjp9xtaurUcpcuj/NVTt+26lWlpaYm5uDmAuIpaKbOshDOusalMj\nGzp1o1577XRM+fNYdLkmYbpiP6+hqt93qywHENZZVYvGdMvBKGvWQ9VUaSx6EvIEmlWp1km/+nkN\nVf2+W2U5B8Laq8PVEKe5PkAVxqInIU+gnUmYrtjrNdyv5ae/Dt93qxz3QFh7k3AWNg3G2eMyqWes\nVR8iytPj0+k1NDzzmSuHJ/x9tz44gLD2JuEszMozCXkC3VRpiKihaI5Cu9fQrDnY8/fd+uAAwtqr\n+lmYjdekn7FW8TocRXt8Gq+h3dAErAz2/H23PjiAsM6qeBZm1TAtZ6xVScodpMenV9XWRrDn77sV\n5CRK66wKiXpV4znySeOMtVOdgWneN2UY5EJWeYM9f9+tIPdAWG9VOQsbJ8+R35XPWEdnkB6fosMT\n/r5bTg4gzPKY1BkHg6hinsCkGjRHwcGelcBDGJPKXe3D4zny3U1zPY5RWlhIAWvzZzFvEODhCSuB\nA4hJM6nFfcZpkPHnYXNgOL2GEQQ42LMh8hDGpHFX+/BVYcZBlXIwJq10dd04R8EqorQAQtLekv5Z\n0nZJd0j6kKQ9e2zzYUk7W26bymrjxJn04j7j0mv8OaL8A2oVAsMqBTFmNnZl9kB8HDgcOB54FnAs\ncG6O7S4G9gcOyG6Tfeo8zLO5SS/uM07tktCOPRZ++cvyD6hVCQyrEMSYWWWUEkBIejSwDvijiPhK\nRHwROA34fUkH9Nj85xFxW0Tcmt22l9HGsSvjbK4KXe2Tqt2Mg/vfHz7/+ZXrlXFArUJgWJUgxswq\no6weiKOBOyLiq03LtgIBPLHHtk+TdIukaySdI2mfkto4XmWczbkcbfka488RozugViEwHDSIcd6E\n2cQpK4A4ALi1eUFE7AC2Zfd1cjFwMvAM4PXAccAmSSqpneNR5tmc53uPxih7BaoQGPYbxDhvwmxi\nFZrGKel04A1dVglS3kNfIuL8pj+/KekbwPXA04DPdtt248aNrFq1asWy+fl55qs4PlvmtEDP9y6m\n32mRo+4VGKQGwDD0W7q6W0/b5s3ltbcXT4e1KbSwsMBCy2/G9u0DZAlERO4bsC+wpsftfsCpwO0t\n284AvwSeW/A5bwVe1uX+WSAWFxejNr71rYjUCd7+trw87hZOvttvj1i3buV+X7cuYtu2/I+xbl3E\nzMzKx5iZScvLsrwcsWnTeD4j27YV22dV/JwP4303myCLi4tBOvmfjQLH5ogoNoQREbdHxHKP26+A\nLwF7SXp80+bHAwK+nPf5JP16FrTcVKSdlVeFLulp0m78fRg5KOMYLhpnDYCipaurkPzZyjNJ+uMc\nFmunaMSR9wZsAr4CPAF4CvAt4J9a1rmGrEcC2BM4g5Rk+QhSwPEV4Gpg9y7PU78eiIjiZ3NWXKez\nzSuvHO6Z8Th7Baqsaj0QVWtPHbjHZuIN0gNRZinrDcAHSLMvdgKfBF7bss5qoJG4sAN4LCmJci/g\nRmAL8FcR8csS2zkezlUoX6ezzdtu675d0RwUlwdur2qX/K5SSfK6qGoOi1VCaQFERPwYeEmPdWaa\n/n8PsL6s9lSWDz7l6HYBrKWl7tu6XsbwjDv5s1kVpsPWiS8iZz34Whg2mXqdbc7OOgdlFKp0yW/n\nHhVTxRwWqxQHEDaZep1tnntufeplTEICW1UuAOU6Kfm5x8Z68OW8p9Wkz4PvNf5+5JHVz0HxpdmH\nz7lH+VUth8Uqxz0Q02aaKgPmOdusyplxO+OYcjgJvR15VPl9rxL32FgX7oGYNtOUVV3ns81eCWyX\nXJL+P6zX5N4Oa6fO3yErnQOIaTKtWdV1nOnSK4Ft3bqV/x/0QD9IYDnpw2GdTNPrruN3yErnIYxp\n4qzq+uiVwNZs0GGNfi/uNk3DYc2m9XWbtXAAMU2cVV0fnaYctjPoVVz7DSyntSz0tL5usxYOIKaJ\n58HXS7sEtm767UHqJ7As85L0VTatr9usDQcQ08ZZ1fXRWoSpXf5Ks357kPoJLKd1OGxaX7dZG06i\nnDbOqq6f5gS2sublFy05Pa3DYdP6us3acA/EtPI8+HoqqwepaMnpaR0Om9bXbdaGAwizOin72hJF\nAstpHQ6b1tdt1sJDGGZ1VIV5+ZM0HFakpsMkvW6zATiAMLPBVCGY6dcgFTjr/LrNhsBDGGY2vVzT\nwaxvDiDMRiHPRaqm5UJWVeGaDmYDcQBhg/FBr7s8ZY9dGnk8XNPBbCAOIKw/Pujlk6eL3N3o4+Ga\nDmYDcQBh/fFBr7c8XeTuRh8f13QwG4gDCCvOB7188nSRuxt9vFzTwaxvnsZpxeU56PnsLV8XeUTv\ndaw8rulg1jf3QFhxHjvOJ08XubvRq8Gl3c0KcwBhxfmgl1+eLnJ3o5tZDXkIw/pT9OqN0ypPF7m7\n0fMrUnLazErlAML644NeMXnKHrs0cmeDlJw2s1I4gLDB+KBno9Bt2vDmzeNpk9mUKy0HQtIbJX1B\n0l2SthXY7q2SbpR0t6RPS3JGntk087Rhs0oqM4lyd+B84G/zbiDpDcCrgT8BjgLuArZIun8pLTSz\n6nOtDLNKKm0IIyLeAiDplAKbvRb4m4i4KNv2ZOAW4HmkYMTMpo2nDZtVUmWmcUr6TeAA4NLGsoi4\nE/gycPS42mVmY+Zpw+XwhfBsQJUJIEjBQ5B6HJrdkt1nZtOi9eDmWhnD4wvh2ZAUCiAknS5pZ5fb\nDklrymqsmU24Tgc3SLMtlpdh06b07+bNnsLZD18Iz4akaA7Eu4EP91jnhj7bcjMgYH9W9kLsD3y1\n18YbN25k1apVK5bNz88z7y+F2XCMoohTr+manjY8mMaMllbNM1q8fyfWwsICCy29dtu3b+/78RS9\nLuYzoCyJ8syI2CfHujcC74qIM7O/H0IKJk6OiH/tsM0ssLi4uMjs7OwQW25mwOiKOC0vp56Hbvf7\n4DaYiy9OPTudbNqUrgliU2NpaYm5uTmAuYhYKrJtmXUgDpZ0BPAIYEbSEdltz6Z1rpH03KbNzgLe\nJOnZkh4DnAf8ALigrHaaWQ+j6vL2dM3yeUaLDVGZSZRvBZaANwO/lv1/CZhrWmc1cO+4Q0ScAbwf\nOJc0++KBwIkR8YsS22lmnYyyiJMPbuXzjBYbotICiIg4NSJm2twua1pnJiLOa9nuryPiwIh4UESs\niwifdpj1a9CpeqPsFfDBbTQ8o8WGpErTOM1sWIY1VW/UvQI+uJWvcSE8z2ixAfliWmaTaFgXn2r0\nCmzdunIYY2YmHdiH3Svgq7yOjme02IDcA2E2aYadtzCOXoHVq9NsAB/gzCrLPRBmkyZP3kKRA7N7\nBcysDQcQZpOmrLwFd3mbWRMPYZhNGs9mMLMRcABhNok8m8HMSuYhDLNJ5LwFMyuZAwizSea8BTMr\niQMIG81VFs3MbKI4B2KaDataoU2uQUthm9nEcgAxzUZ1lUWrHweXZtaDA4hpNcqrLFr9OLg0sx4c\nQEyrUV5l0erFwaWZ5eAAYlqN+iqLVh8OLs0sBwcQ08rVCq0TB5dmloMDiGnmaoXWjoNLM8vBdSCm\nmasVWicLCylhcsuW+5Y5uDSzJg4gzNUKbVcOLs2sBwcQNrlcYXNwDi7NrAPnQNjkcREkM7PSOYCw\nyeMiSGZmpXMAYZPFRZDMzEbCAYRNFhdBMjMbCQcQNllcBMnMbCQcQNhkcREkM7ORcABhk8cVNs3M\nSuc6EDZ5XATJzKx0pfVASHqjpC9IukvStpzbfFjSzpbbprLaaBNu9Wo48cTxBw/Ly3DxxZ4BYmYT\npcwhjN2B84G/LbjdxcD+wAHZzZP3rZ5c0MrMJlhpAUREvCUi3gd8o+CmP4+I2yLi1uy2vYz2mZXO\nBa3MbIJVMYnyaZJukXSNpHMk7TPuBpkV5oJWZjbhqhZAXAycDDwDeD1wHLBJksbaKrOiXNDKzCZc\noVkYkk4H3tBllQAOj4jlfhoTEec3/flNSd8ArgeeBny2n8c0GwsXtDKzCVd0Gue7gQ/3WOeGPtuy\ni4j4tqQfAYfSI4DYuHEjq1atWrFsfn6eeY832zg0Clpt3bpyGGNmJtWkGPfMEDObOgsLCyy01MPZ\nvr3/NENFxKBt6v4E0inAmRFROJdB0q8D3wWeGxEXdVhnFlhcXFxkdnZ2sMaaDdMdd6SEyS1b7lu2\nbl0qaLX33uNrl5lZZmlpibm5OYC5iFgqsm1phaQkHQzsAzwCmJF0RHbXdRFxV7bONcAbIuICSXsC\nbwb+DbiZ1OvwTmAZ2NL6+GaV54JWZjbByqxE+VZSQmRDI7J5OnBZ9v/VQGPcYQfw2GybvYAbSYHD\nX0XEL0tsp1m5Vq924GBmE6e0ACIiTgVO7bHOTNP/7wHWl9UeMzMzG56qTeM0MzOzGnAAYWZmZoU5\ngDAzM7PCHECYmZlZYQ4gzMzMrDAHEGZmZlaYAwgzMzMrzAGEmZmZFeYAwszMzApzAGFmZmaFlXkt\nDJsGy8tw/fW+UJSZ2ZRxD4T1Z9s2WL8eDjsMTjoJ1qxJf99xx7hbZmZmI+AAwvqzYQNs3bpy2dat\nMD8/nvaYmdlIOYCw4paXYcsW2LFj5fIdO9Lya68dT7vMzGxkHEBYcddf3/3+664bTTusPMvLcPHF\nDgbNrCMHEFbcIYd0v//QQ0fTDhs+57aYWU4OIKy4NWtg3TqYmVm5fGYmLfdsjPpybouZ5eQAwvqz\nsABr165ctnZtWm715NwWMyvAdSCsP3vvDZs3p4PKdde5DsQkyJPb4vfYzDIOIGwwq1f7oDIpnNti\nZgV4CMPMEue2mFkBDiDM7D7ObTGznDyEYWb3cW6LmeXkAMLMduXcFjPrwUMYZmZmVpgDCDMzMyvM\nAYSZmZkV5gBiii04s74w77P+eL8V533WH++30SklgJD0CEkfknSDpLslXSvpryXtnmPbt0q6Mdvu\n05JcvaYk/qIV533WH++34rzP+uP9Njpl9UA8GhDwMuB/ABuBlwNv67aRpDcArwb+BDgKuAvYIun+\nJbXTzMzM+lDKNM6I2AJsaVr0HUnvJgURr++y6WuBv4mIiwAknQzcAjwPOL+MtpqZmVlxo8yB2AvY\n1ulOSb8JHABc2lgWEXcCXwaOLr11ZmZmlttICklleQyvBl7XZbUDgCD1ODS7JbuvkwcAXH311YM0\ncSpt376dpaWlcTejVrzP+uP9Vpz3WX+834ppOnY+oOi2ioj8K0unA2/oskoAh0fEctM2BwGfAz4T\nEX/a5bGPBi4HDoyIW5qWfwLYGRHzHbbbAPxz7hdhZmZmrV4cER8vskHRHoh3Ax/usc4Njf9IOhD4\nDHB5t+AhczMp8XJ/VvZC7A98tct2W4AXA98B7unxHGZmZnafBwCPZGXeYi6FeiAKPXDqefgM8J/A\nH0SOJ5J0I/CuiDgz+/shpGDi5Ij411IaamZmZoWVVQfiQNKwxXdJsy4eJml/Sfu3rHeNpOc2LToL\neJOkZ0t6DHAe8APggjLaaWZmZv0pK4nyBOBR2e372TKRciRmmtZbDaxq/BERZ0h6EHAuadbGfwAn\nRsQvSmqnmZmZ9aG0IQwzMzObXL4WhpmZmRXmAMLMzMwKm7gAQtIFkr4r6WfZRbnOk/Twcberqga5\n8Nm0k/RGSV+QdJekjlVWp5mkV0n6dvZ9vELSE8bdpiqTdIykCyX9UNJOSc8Zd5uqTtJfSLpS0p2S\nbpH0KUlrxt2uqpP0cklfk7Q9u31R0voijzFxAQRp6ujvAWuAFwCHAJ4C2llfFz4zAHYnXaPlb8fd\nkCqS9CLgPcCbgccDXyNdHG+/sTas2vYErgJeSUo6t96OAd4PPBFYS/peXiLpgWNtVfV9n1QYchaY\nIx07L5B0eN4HmPgkSknPBj4F7BERO8bdnjqQ9GfAyyPCl1LPQdIpwJkRsc+421Ilkq4AvhwRr83+\nFulH6+yIOGOsjasBSTuB50XEheNuS51kAeqtwLERcfm421Mnkm4H/iwiehWMBCazB+JekvYhVan8\ngoOHQrpe+Mysl2wIbI6VF8cLYCu+OJ6Vay9S741/w3KStJuk3wceBHwp73YTGUBIeoeknwI/Ag4m\nXQ7ccmi68NkHx90Wq7X9SDVfil4cz6xvWS/XWaTLJ/z3uNtTdZJ+W9JPgJ8D5wDPj4hr8m5fiwBC\n0ulZQlGn246WpJkzgMeRClrtAP5pLA0foz72WaP8+MXAJyLiH8fT8vHqZ7+ZWWWcQ8rl+v1xN6Qm\nrgGOAI4i5XKdJ+nReTeuRQ6EpH2BfXusdkNE/KrNtgeRxl2Pjogvl9G+Kiq6z7Ly458FvhgRp5bd\nvqrq57PmHIhdZUMYdwO/2zyGL+kjwKqIeP642lYXzoEoRtIHgGcDx0TE98bdnjqS9Gnguoh4RZ71\nyyplPVQRcTtwe5+bN0pn7zGk5tRCkX3WcuGzl5bZrqob8LNmmYj4paRF4HjgQri3e/l44Oxxts0m\nTxY8PBc4zsHDQHajwLGyFgFEXpKOAp4AXA7cARwKvBW4lgKJIdOk6cJn3+a+C58BEBGt49fWRNLB\nwD7AI4AZSUdkd10XEXeNr2WV8V7gI1kgcSVpivCDgI+Ms1FVJmlP0u+WskWPyj5X2yLi+523nF6S\nzgHmgecAdzVdtHF7RNwzvpZVm6S3k4asvwc8mDTh4Djgmbkfow5DGHlJ+m3gfcBjSfOpbyLtoLdF\nxE3jbFtVZd3vrfkOIiXNz7TZxDKSPgyc3Oaup0fEZaNuTxVJeiUpMN2fVN/gtIj4ynhbVV2SjiMN\nJbb+MH80Iqa6d7CTbKin3YHs1Ig4b9TtqQtJHwKeATwc2A58HXhHRHwm92NMUgBhZmZmo1GLWRhm\nZmZWLQ4gzMzMrDAHEGZmZlaYAwgzMzMrzAGEmZmZFeYAwszMzApzAGFmZmaFOYAwMzOzwhxAmJmZ\nWWEOIMzMzKwwBxBmZmZW2P8Ff0/ywgx9k78AAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc2527ead30>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import datetime\n",
"\n",
"def scatter_dated(*args, **kwargs):\n",
" plt.scatter(*args, **kwargs)\n",
" plt.title(datetime.datetime.now().isoformat())\n",
" \n",
"scatter_dated(**data, color=\"red\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"## Exercise \n",
"\n",
"Write a function `scatter_enhanced` that takes a filename and figure size"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"ename": "AttributeError",
"evalue": "Unknown property save_as",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-55-596c098cd64c>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mscatter\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfigsize\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m8\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m6\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0msave_as\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"./test.png\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m/usr/share/anaconda/anaconda/lib/python3.5/site-packages/matplotlib/pyplot.py\u001b[0m in \u001b[0;36mscatter\u001b[1;34m(x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, hold, data, **kwargs)\u001b[0m\n\u001b[0;32m 3256\u001b[0m \u001b[0mvmin\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mvmin\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvmax\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mvmax\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0malpha\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0malpha\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3257\u001b[0m \u001b[0mlinewidths\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mlinewidths\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mverts\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mverts\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3258\u001b[1;33m edgecolors=edgecolors, data=data, **kwargs)\n\u001b[0m\u001b[0;32m 3259\u001b[0m \u001b[1;32mfinally\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3260\u001b[0m \u001b[0max\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mhold\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mwashold\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m/usr/share/anaconda/anaconda/lib/python3.5/site-packages/matplotlib/__init__.py\u001b[0m in \u001b[0;36minner\u001b[1;34m(ax, *args, **kwargs)\u001b[0m\n\u001b[0;32m 1817\u001b[0m warnings.warn(msg % (label_namer, func.__name__),\n\u001b[0;32m 1818\u001b[0m RuntimeWarning, stacklevel=2)\n\u001b[1;32m-> 1819\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0max\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m*\u001b[0m\u001b[0margs\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1820\u001b[0m \u001b[0mpre_doc\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0minner\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__doc__\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1821\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mpre_doc\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m/usr/share/anaconda/anaconda/lib/python3.5/site-packages/matplotlib/axes/_axes.py\u001b[0m in \u001b[0;36mscatter\u001b[1;34m(self, x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, verts, edgecolors, **kwargs)\u001b[0m\n\u001b[0;32m 3867\u001b[0m )\n\u001b[0;32m 3868\u001b[0m \u001b[0mcollection\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mset_transform\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmtransforms\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mIdentityTransform\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3869\u001b[1;33m \u001b[0mcollection\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3870\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3871\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mcolors\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m/usr/share/anaconda/anaconda/lib/python3.5/site-packages/matplotlib/artist.py\u001b[0m in \u001b[0;36mupdate\u001b[1;34m(self, props)\u001b[0m\n\u001b[0;32m 857\u001b[0m \u001b[0mfunc\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'set_'\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mk\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 858\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mfunc\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mNone\u001b[0m \u001b[1;32mor\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0msix\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcallable\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfunc\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 859\u001b[1;33m \u001b[1;32mraise\u001b[0m \u001b[0mAttributeError\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'Unknown property %s'\u001b[0m \u001b[1;33m%\u001b[0m \u001b[0mk\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 860\u001b[0m \u001b[0mfunc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mv\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 861\u001b[0m \u001b[0mchanged\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mTrue\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mAttributeError\u001b[0m: Unknown property save_as"
]
},
{
"data": {
"image/png": "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\nAOgSCwBA1/8DBAe+bZJxNlwAAAAASUVORK5CYII=\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7fc25262ac18>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.scatter(x, y, figsize=(8, 6), save_as=\"./test.png\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## decorators\n",
"\n",
"* A decorator is a wrapper for a function"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "fragment"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"I'm f.\n"
]
}
],
"source": [
"def identity(func):\n",
" return func\n",
"\n",
"@identity\n",
"def f(): print(\"I'm f.\")\n",
"\n",
"## is equivalent to\n",
"\n",
"def f(): print(\"I'm f.\")\n",
"wrapped = identity(f)\n",
"\n",
"wrapped()"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {
"collapsed": false,
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Before decorated function\n",
"my function asdf\n",
"After decorated function\n",
"return value\n"
]
}
],
"source": [
"from functools import wraps\n",
"\n",
"def mydecorator(f):\n",
" @wraps(f)\n",
" def wrapped(*args, **kwargs):\n",
" print(\"Before decorated function\")\n",
" r = f(*args, **kwargs)\n",
" print(\"After decorated function\")\n",
" return r\n",
" return wrapped\n",
"\n",
"@mydecorator\n",
"def myfunc(myarg):\n",
" print(\"my function\", myarg)\n",
" return \"return value\"\n",
"\n",
"r = myfunc('asdf')\n",
"print(r)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"## Exercises\n",
"\n",
"* Write a wrapper `twice` that repeats a function call\n",
"* Write a wrapper `debug` that prints all arguments\n",
"* Write a function `retry` that repeats a function until it works"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true,
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [],
"source": [
"## the rabbithole; if you want to add arguments you \n",
"## need three functions\n",
"def mydecorator_not_actually(count):\n",
" def true_decorator(f):\n",
" @wraps(f)\n",
" def wrapped(*args, **kwargs):\n",
" for i in range(count):\n",
" print(\"Before decorated function\")\n",
" r = f(*args, **kwargs)\n",
" for i in range(count):\n",
" print(\"After decorated function\")\n",
" return r\n",
" return wrapped\n",
" return true_decorator\n",
"\n",
"@mydecorator_not_actually(count=5)\n",
"def myfunc(myarg):\n",
" print(\"my function {myarg}\")\n",
" return \"return value\"\n",
"\n",
"r = myfunc('asdf')\n",
"print(r)"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"## Exercises\n",
"\n",
"* Write a wrapper `repeat` that repeats a function `count` times\n",
"* Write a wrapper `memoize` that remembers function calls up to a specified number of calls"
]
}
],
"metadata": {
"celltoolbar": "Slideshow",
"kernelspec": {
"display_name": "Python [conda root]",
"language": "python",
"name": "conda-root-py"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment