{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook was put together by Morgan Fouesneau for UW's [Astro 599](http://www.astro.washington.edu/users/vanderplas/Astr599/) course. Source and license info is on [GitHub](https://github.com/jakevdp/2013_fall_ASTR599/)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Object-oriented programming: Principles in 1h by Examples\n", "-- **M. Fouesneau** \n", "[ morgan.fouesneau@astro.washington.edu ]\n", "\n", "Astro599 ( http://www.astro.washington.edu/users/vanderplas/Astr599/schedule )\n", "\n", "Prezi presentation is available at: http://bit.ly/18FylbC" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# make sure pylab runs inline when using the notebook\n", "%pylab inline \n", "import numpy as np\n", "import pylab as plt" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Populating the interactive namespace from numpy and matplotlib\n" ] } ], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "def ezrc(fontSize=22., lineWidth=2., labelSize=None, tickmajorsize=10, tickminorsize=5):\n", " \"\"\"\n", " slides - Define params to make pretty fig for slides\n", " \"\"\"\n", " from pylab import rc, rcParams\n", " if labelSize is None:\n", " labelSize = fontSize + 5\n", " rc('figure', figsize=(9, 7))\n", " #rc('figure', figsize=(8, 6))\n", " rc('lines', linewidth=lineWidth)\n", " rcParams['grid.linewidth'] = lineWidth\n", " rc('font', size=fontSize, family='serif', weight='small')\n", " rc('axes', linewidth=lineWidth, labelsize=labelSize)\n", " rc('legend', borderpad=0.1, markerscale=1., fancybox=False)\n", " #rc('text', usetex=True)\n", " rc('image', aspect='auto')\n", " #rc('ps', useafm=True, fonttype=3)\n", " rcParams['xtick.major.size'] = tickmajorsize\n", " rcParams['xtick.minor.size'] = tickminorsize\n", " rcParams['ytick.major.size'] = tickmajorsize\n", " rcParams['ytick.minor.size'] = tickminorsize\n", " \n", "ezrc(20) # making figures cleaner for slides" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## In python All is objects" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Text is object**" ] }, { "cell_type": "code", "collapsed": false, "input": [ "s = 'some text'" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "code", "collapsed": false, "input": [ "s.upper()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 4, "text": [ "'SOME TEXT'" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Modules are objects**" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import numpy as np\n", "np" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 5, "text": [ "" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "type(np)" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "module" ] } ], "prompt_number": 6 }, { "cell_type": "code", "collapsed": false, "input": [ "np.__name__" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 7, "text": [ "'numpy'" ] } ], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "np.__class__" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "module" ] } ], "prompt_number": 8 }, { "cell_type": "code", "collapsed": false, "input": [ "print np.__dict__.keys() # we'll see __dict__ later" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "['disp', 'union1d', 'all', 'issubsctype', 'savez', 'atleast_2d', 'restoredot', 'ptp', 'unicode_', 'ix_', 'mirr', 'blackman', 'FLOATING_POINT_SUPPORT', 'busdaycalendar', 'pkgload', 'void', 'unicode0', 'ERR_RAISE', 'void0', 'tri', 'diag_indices', 'array_equal', 'fmod', 'True_', 'indices', 'loads', 'round', 'set_numeric_ops', 'pmt', '_mat', 'cosh', 'object0', 'rate', 'FPE_OVERFLOW', 'index_exp', 'append', 'compat', 'nanargmax', 'hstack', 'typename', 'diag', 'rollaxis', 'ERR_WARN', 'polyfit', 'version', 'memmap', 'nan_to_num', 'complex64', 'fmax', 'spacing', 'sinh', '__git_revision__', 'PackageLoader', 'sinc', 'trunc', 'vstack', 'ERR_PRINT', 'asscalar', 'less_equal', 'BUFSIZE', 'object_', 'divide', 'csingle', 'dtype', 'unsignedinteger', 'fastCopyAndTranspose', 'bitwise_and', 'uintc', 'select', 'deg2rad', 'bytes_', 'eye', 'kron', 'newbuffer', 'negative', 'busday_offset', 'mintypecode', 'MAXDIMS', 'sort', 'einsum', 'uint0', 'zeros_like', 'int_asbuffer', 'uint8', 'chararray', 'linspace', 'resize', 'uint64', 'ma', 'true_divide', 'Inf', 'finfo', 'triu_indices', 'infty', 'add_newdoc', 'seterrcall', 'logical_or', 'minimum', 'WRAP', 'tan', 'absolute', 'array_repr', 'get_array_wrap', 'polymul', 'tile', 'array_str', 'setdiff1d', 'sin', 'longlong', 'product', 'int16', 'str_', 'mat', 'fv', 'max', 'asanyarray', 'uint', 'npv', 'logaddexp', 'flatnonzero', 'short', 'correlate', 'fromstring', 'left_shift', 'searchsorted', 'int64', 'may_share_memory', 'dsplit', 'intersect1d', 'can_cast', 'ppmt', 'show_config', 'cumsum', 'roots', 'outer', 'CLIP', 'fix', 'busday_count', 'timedelta64', 'degrees', 'choose', 'FPE_INVALID', 'recfromcsv', 'fill_diagonal', 'empty_like', 'logaddexp2', 'greater', 'histogram2d', 'polyint', 'rank', 'datetime64', 'complexfloating', 'ndindex', 'ctypeslib', 'PZERO', 'isfortran', 'asfarray', 'radians', 'fliplr', 'alen', 'recarray', 'modf', 'mean', 'square', 'ogrid', 'nanargmin', 'r_', 'diag_indices_from', 'hanning', 's_', 'allclose', 'extract', 'float16', 'ulonglong', 'matrix', 'asarray', 'poly1d', 'promote_types', 'rec', 'datetime_as_string', 'uint32', 'math', 'log2', '__builtins__', 'cumproduct', 'diagonal', 'atleast_1d', 'meshgrid', 'transpose', 'column_stack', 'put', 'byte', 'remainder', 'row_stack', 'expm1', 'nper', 'ndfromtxt', 'place', 'DataSource', 'newaxis', 'arccos', 'signedinteger', 'ndim', 'rint', 'number', 'arctan2', 'little_endian', 'ldexp', 'lookfor', 'array', 'vsplit', 'common_type', 'size', 'logical_xor', 'geterrcall', 'sometrue', 'exp2', 'bool8', 'msort', 'alltrue', 'zeros', 'False_', '__NUMPY_SETUP__', 'nansum', 'bool_', 'inexact', 'broadcast', 'copyto', 'amin', 'arctanh', 'typecodes', 'rot90', 'savetxt', 'sign', 'sctypes', 'std', 'not_equal', 'fromfunction', 'tril_indices_from', '__config__', 'double', 'require', 'typeNA', 'str', 'getbuffer', 'abs', 'clip', 'savez_compressed', 'frompyfunc', 'triu_indices_from', 'conjugate', 'alterdot', 'asfortranarray', 'binary_repr', 'angle', 'lib', 'min', 'unwrap', 'apply_over_axes', 'ERR_LOG', 'right_shift', 'take', 'get_numarray_include', 'trace', 'warnings', 'any', 'who', 'compress', 'histogramdd', 'issubclass_', 'multiply', 'mask_indices', 'amax', 'logical_not', 'average', 'nan', 'nbytes', 'exp', 'result_type', 'dot', 'maximum_sctype', 'longfloat', 'random', 'setxor1d', 'copy', 'FPE_UNDERFLOW', 'frexp', 'errstate', 'nanmin', 'swapaxes', 'SHIFT_OVERFLOW', 'complex256', 'fft', 'digitize', '__file__', 'NZERO', 'ceil', 'ones', 'add_newdoc_ufunc', 'deprecate', 'median', 'geterr', 'convolve', 'isreal', 'where', 'isfinite', 'SHIFT_UNDERFLOW', 'MachAr', 'argmax', 'testing', 'deprecate_with_doc', 'polyder', 'rad2deg', 'isnan', '__all__', 'irr', 'sctypeDict', 'NINF', 'min_scalar_type', 'count_nonzero', 'sort_complex', 'nested_iters', 'concatenate', 'ERR_DEFAULT2', 'vdot', 'bincount', 'copysign', 'array2string', 'corrcoef', 'fromregex', 'vectorize', 'set_printoptions', 'trim_zeros', 'unravel_index', 'cos', 'float64', 'arccosh', 'ushort', 'equal', 'cumprod', 'float_', 'vander', 'geterrobj', 'load', 'fromiter', 'poly', 'bitwise_or', 'polynomial', 'diff', 'iterable', 'array_split', 'get_include', 'pv', 'tensordot', 'piecewise', 'invert', 'UFUNC_PYVALS_NAME', 'SHIFT_INVALID', 'ubyte', 'c_', 'flexible', 'pi', '__doc__', 'empty', 'find_common_type', 'isposinf', 'arcsin', 'sctypeNA', 'imag', 'sctype2char', 'singlecomplex', 'SHIFT_DIVIDEBYZERO', 'matrixlib', 'apply_along_axis', 'reciprocal', 'tanh', 'dstack', 'cov', 'cast', 'logspace', 'packbits', 'issctype', 'mgrid', 'longdouble', 'signbit', 'conj', 'asmatrix', 'inf', 'flatiter', 'bitwise_xor', 'fabs', 'generic', 'reshape', 'NaN', 'cross', 'sqrt', '__package__', 'longcomplex', 'complex', 'pad', 'split', 'floor_divide', '__version__', 'format_parser', 'nextafter', 'polyval', 'flipud', 'i0', 'iscomplexobj', 'mafromtxt', 'bartlett', 'polydiv', 'identity', 'safe_eval', 'greater_equal', 'floor', 'trapz', 'PINF', 'recfromtxt', 'add_newdocs', 'RankWarning', 'ascontiguousarray', 'less', 'putmask', 'UFUNC_BUFSIZE_DEFAULT', 'unicode', 'half', 'NAN', 'typeDict', '__path__', 'shape', 'setbufsize', 'cfloat', 'RAISE', 'isscalar', 'character', 'bench', 'source', 'add', 'uint16', 'bool', 'ufunc', 'save', 'ravel', 'float32', 'real', 'int32', 'tril_indices', 'around', 'lexsort', 'complex_', 'ComplexWarning', 'ipmt', '_import_tools', 'atleast_3d', 'isneginf', 'integer', 'unique', 'mod', 'insert', 'bitwise_not', 'getbufsize', 'array_equiv', 'get_printoptions', 'asarray_chkfinite', 'in1d', 'interp', 'hypot', 'logical_and', 'arange', 'diagflat', 'float128', 'byte_bounds', 'nonzero', 'kaiser', 'polysub', 'fromfile', 'prod', 'nanmax', 'core', 'object', 'seterrobj', 'power', 'nditer', 'percentile', 'FPE_DIVIDEBYZERO', '__name__', 'subtract', 'frombuffer', 'iscomplex', 'add_docstring', 'argsort', 'fmin', 'ones_like', 'is_busday', 'arcsinh', 'intc', 'float', 'ndenumerate', 'intp', 'unpackbits', 'Infinity', 'log', 'cdouble', 'complex128', 'long', 'round_', 'broadcast_arrays', 'inner', 'var', 'int_', 'log10', 'uintp', 'linalg', 'histogram', 'issubdtype', 'int0', 'squeeze', 'int8', 'info', 'seterr', 'argmin', 'genfromtxt', 'maximum', 'record', 'obj2sctype', 'clongdouble', 'sum', 'isrealobj', 'log1p', 'delete', 'tril', 'int', 'ediff1d', 'char', 'single', 'loadtxt', 'ScalarType', 'triu', 'floating', 'expand_dims', 'Tester', 'polyadd', 'ERR_IGNORE', 'emath', 'arctan', 'bmat', 'isclose', 'ERR_DEFAULT', 'test', 'roll', 'string0', 'compare_chararrays', 'iinfo', 'real_if_close', 'repeat', 'hamming', 'ALLOW_THREADS', 'ravel_multi_index', 'string_', 'isinf', 'ndarray', 'e', 'ERR_CALL', 'datetime_data', 'clongfloat', 'hsplit', 'gradient', 'base_repr', 'argwhere', 'set_string_function']\n" ] } ], "prompt_number": 9 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Matplotlib of course**" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pylab as plt\n", "plt.plot(range(10))" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 10, "text": [ "[]" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n8+a69tprtXfvXn355ZdVxt0aQQUAAKGptcH4+9//Lknq3LlztePlz3/66adVxtwaQQUAACEytXjs\nsceMZVlm+vTp1Y7ff//9xrIsM3fu3IrnJPHgwYMHDx48PPgIVK0zGGfOnJEkNWrUqNrxK664QpJ0\n+vTp2i4FAACiRK0x1fj4eEnSuXPnqh0vLS2VJCUkJFQ855/EAAAA0arWGYyrrrpKklRUVFTt+PHj\nxyVJrVu3trEsAADgZrU2GP/0T/8kSdq3b1+14wUFBbIsSzfddJO9lQEAANeqtcHo37+/YmNjtWPH\njipj//jHP7Rnzx5dc8016tq1q23HiUeyo0eP6r777lNMTIxef/11p8uxzZo1azR8+HB16tRJsbGx\nSk5OVr9+/bR06VKnSwuZMUbr16/X448/ru7du6tFixZq1qyZUlNTNWnSJH377bdOl2i78tN1azth\n1y0yMzMrXk91j0OHDjldYsg2bNigu+++W1dddZXi4uLUsWNHZWRkaMWKFU6XVmeLFy++7L+38seH\nH37odKkh2bBhgwYNGqROnTopISFB11xzje677z7t3LnT6dJCtnz5cvXr109JSUlKSEhQamqqXnzx\nxcDe1wPZCVqeJHnvvfcqPf/f//3fxrIs8/LLL5vi4mKTmppqOnToYLZu3WpKSkrM6tWrTWJiohk0\naJC5cOFCwDtPI9XKlSvNlVdeaZKTk41lWeb11193uiRbTJ8+3ViWZQYMGGA+/vhjc+bMGfP555+b\ne+65x1iWZX71q185XWJIjh49aizLMtdff73ZtGmTOXXqlDl27JiZP3++iY2NNa1btzbffPON02Xa\npri42LRv395YlmViYmKcLscWmZmZpk2bNuaGG26o9nHkyBGnSwzJ1KlTTWJiopk3b54pLCw0p0+f\nNjk5OaZZs2Zm4MCBTpdXZ4sWLTIJCQk1/ntr2bKladSokTl48KDTpdZZ+fvg7bffbvLy8syZM2fM\njh07zD//8z+bBg0amOzsbKdLrLNf/epXxrIsM3HiRLN//35TVFRkFi1aZBo3bmzuvPNOc/78+cv+\nfEANRnFxsbnxxhtN+/btzZYtW8zp06fN22+/bRITE83AgQPNhQsXzIQJE4xlWWbt2rWVfvall14y\nlmWZOXPm1P1VRoA//OEPpn379mbt2rUmMzPTUw3Gs88+a9q0aWNOnTpV6fnS0lJzzTXXGMuyzKZN\nmxyqLnTlDcb27durjP361782lmWZqVOn1n9hYTJu3Dhzyy23eK7B8Mp/b5davXq1sSzL/PGPf6wy\n9tJLL5mHH37YgarssWjRInPbbbfVOH7bbbeZYcOG1WNF9jp79qxJTEw0DRo0MEePHq009re//a3i\ng40b/elPfzKWZZmf/vSnVcaef/55Y1mWmT179mWvEdD8adOmTbVt2zbde++9GjFihJKTk/Wb3/xG\nv/nNb7RmzRqdOnUqpOPE3aB79+7Ky8vTwIEDPZeSad++vUaOHFkpCST5o8l33HGHJGnjxo1OlGaL\npKQk+Xw+9erVq8pY165dJUnFxcX1XVZYbN26VYsWLdJrr73mdCm289p/d+UmT56sLl266N57760y\n9q//+q+13uspknXp0kX9+/evduzzzz+Xz+fTuHHj6rkq+xQVFenkyZNq2bKlWrZsWWksJSVFkvT1\n1187UVrIsrOzJUn33HNPlbHyP6uzZ8++7DUCupuq5G8yfv/731fbKARynPiePXv05Zdf6tprrw30\nV0aUW265xekSwubRRx+tcaxJkyaS3P2Xe8OGDXXrrbdWO7Z9+3ZJ0u23316fJYVFaWmpxo4dq0mT\nJlX85YbI9vHHH2v37t0aOXKk06WExa233lrjf3tz5szRddddp/T09Hquyj6tW7dW27Zt9e233+ro\n0aNq1apVxVheXp4k6cc//rFT5YWkfG9adQnRNm3aSJL27t2rAwcOqGPHjtVew5YdYKEcJ47ItmfP\nHkmq8S8JNyopKdEXX3yhSZMmadWqVcrKylJGRobTZYVsxowZkqQpU6Y4XEl4vP/+++rfv79atWql\nhIQEpaSkaPLkyRVReTcqb3A7dOiglStXqlevXmrcuLGSkpI0YMAA+Xw+ZwsMk5MnT2rJkiWX/XDj\nFosXL1ZSUpKGDx+uvLw8nTlzRjt27NCYMWPUsWNHzZ071+kS66S8WTp8+HCVsSNHjlT88+7du2u8\nhi0NRnkByTXcfz0pKUmS9N1339nx61BPCgsL9Ze//EXdu3fXnXfe6XQ5tli3bp0SEhJ0ww03aPny\n5VqyZIn+/d//3emyQpaXl6ff/e53mj9/fo2n7rrdhx9+qCeeeEIHDhzQ4cOH9fTTT2vWrFnq2bNn\ntX8JusFXX30lSVq2bJmeeuopPf/88zp27Ji2bNmi4uJipaenuzpFUpOlS5fq/PnzGjVqlNOlhCw9\nPV25ubmSpJtuukmNGzfWzTffrOuvv17bt29XamqqwxXWzeDBgyVJOTk5VcbeffddSf6Z7cs1+LY0\nGBwn7k2TJk1SgwYNtGTJEqdLsc3AgQNVVlam/Px8PfHEExo9erQGDhyowsJCp0urs7KyMo0dO1aj\nRo1S3759nS4nLJ588knl5ubq7rvvVnx8vJo2bapRo0bpueeeU35+vsaPH+90iXVy4sQJSf5zhhYu\nXKj09HTFx8crNTVVb775piRp/PjxOnnypJNl2m7OnDkaMWKEmjVr5nQpIcvOzlaPHj3UsGFDffLJ\nJzp58qS2bNmi3bt3q0ePHhXNh9uMGDFC6enp2rp1qyZOnKgDBw7o+PHjWr58uWbMmFExw3HZ5XM7\ndpvW5YZobjZy5EhPpUiqs3TpUtOwYUOzevVqp0sJq9mzZxvLssyDDz7odCl1NmvWLNO+fXtz4sSJ\nSs97KUVSk1OnThnLskzDhg3N8ePHnS4naA8//LCxLMs0b9682vE+ffoYy7LM22+/Xc+Vhc+HH35o\nLMsyH330kdOlhCw/P9/ExcWZdu3amTNnzlQaKygoMLGxsaZ9+/ZVEnpuUVpaap5//nlz4403mri4\nONOsWTPz85//3Gzfvt387Gc/qzY5ejFbZjA4Ttxb1q9fr7Fjx2r+/PkaMmSI0+WE1ejRoyVJb775\npitn2L7++mtNnjxZs2fPVmJiotPl1LuEhAS1bt1aZWVl2rt3r9PlBK18WblDhw7Vjnfq1EnSD0sp\nXjBnzhz16tVL3bt3d7qUkK1cuVJnz57VXXfdpbi4uEpjnTp1Uu/evXXw4EGtX7/eoQpD06hRIz3z\nzDP69NNPdebMGR0/flzvvfeeevfurcLCQlmWVZHEq44tDQbHiXvHhg0bNGzYMM2ZM0eZmZlOlxN2\n8fHxatmypYwxys/Pd7qcoG3cuFGnTp3SsGHDqpyOKPmnL8u/riku6HbGxQmn8rRPTTeTLGdZVn2U\nE3bfffedVq9e7dolrUsVFBRI+iFVcany5/fv319fJdWLc+fOKT8/Xy1atAh/gxHMceKIXBs3btTQ\noUM1a9asSs3FZ599plWrVjlXWIhmzJihX/ziF9WOlZaWVuy/aNq0aX2WZYvMzEyVlZVV+5D8b0zl\nX2/atMnhautm27Ztuu6666odO3nypI4cOaKYmBhX/v1SHo/+5ptvKv6dXaz8jen666+v17rCZf78\n+UpMTNTw4cOdLsUW5Wdf1HRUffnzl56R4RarV6+u2Cd0sa1bt6qkpKTWf4+2NBhNmjTR6NGjdejQ\nIa1du7bS2OLFiyVJTzzxhB2/CmGyadMmDRkyRDNnzqyys3vHjh2ujVpJ0vnz57V58+ZqD9Navny5\nysrKlJKSUmOWG84qLS3V3r17q72vwyuvvCLJv+PdjRsG27Vrp6FDh+r777+vsls/Pz9f27dvV7t2\n7SoOvHOzCxcuaN68eRo1alTFxn+3K4+3v/vuuyopKak0tn//fv31r39VXFyca8/6GDFihN55551K\nzxlj9MILL6hp06Z69tlnL38BuzaDBHKcuJuVlZWZoqIiU1RUZEaMGFFx/HlRUZEpLi52uryQbNq0\nycTHx5s2bdqY4cOHm/vvv7/So1evXiYtLc3pMuts2rRpFUfebt682Zw4ccIcOnTIzJkzxyQmJprE\nxESzbds2p8u0RWlpacWf0/JNnsePHzdFRUW13jcgUn3wwQfGsixzzTXXmD//+c/m+PHj5vjx4+a1\n114zCQkJpnPnzq6+l8XBgwdNx44dTYcOHYzP5zNnz541n376qendu7dp3Lixq4/pv9jbb79tYmJi\nTH5+vtOl2Gr8+PHGsiwzcOBA8/e//92cPHnSbNu2zfzoRz8yMTExZtasWU6XWGflG1jff/99c/r0\nabNnzx7zy1/+0jRu3NisX7++1p+3rcEwxt9kPPHEE6ZDhw4mNjbWXHvttWbGjBnm3Llzdv4aR+zb\nt89YllXxiImJqfjnq6++2unyQpKZmWliYmIqXlP5P1/89eXuJxDpzpw5Y1auXGmGDh1qOnToYK64\n4goTHx9vrrvuOjN+/Hizb98+p0u0zaJFiyr9Gb343+EHH3zgdHl15vP5zNixY821115r4uLiTHx8\nvLnxxhvNM888Y4qKipwuL2RHjhwx48aNq/jzedVVV5kHHnjAfPbZZ06XZps77rjD/PznP3e6jLBY\ntmyZSUtLM0lJSaZhw4amVatW5q677jIbNmxwurSQZGVlmb59+5orr7zSxMbGmo4dO5rRo0ebr776\nKqCft4xx8Q4pAAAQkWzZgwEAAHAxGgwAAGA7GgwAAGA7GgwAAGA7GgwAAGA7GgwAAGC7/wP/Oql+\nggjPywAAAABJRU5ErkJggg==\n", "text": [ "" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "`[]`\n", "\n", "plot returns an instance of a **Line2D object**" ] }, { "cell_type": "code", "collapsed": false, "input": [ "import pylab as plt\n", "r = []\n", "r.append( plt.plot(range(10)) )\n", "r.append( plt.xlabel('measured') )\n", "r.append( plt.ylabel('calculated') )\n", "r.append( plt.title('Measured vs. calculated') )\n", "r.append( plt.grid(True) )\n", "print r" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[[], , , , None]\n" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\nfCN+/fVXsXz5clG7dm1RpkwZoWma6NGjh4iPjxfnzp0TQty78VhwcLD44IMPRHR0tIiNjRUrVqwQ\njRs3Fl5eXmLSpEk2eVJSUkT16tWFpmli5MiRIjo6WkRHR4u+ffuKmTNn2mTMyMgQQggRHx8v4uPj\nbfab22PPhg0bREBAgPD39xeTJk0Sv/zyi9i5c6eYMmWKKF26tGjevLndG41t2bJF+Pn5We5Sum/f\nPrFz507x8ssviwceeEA8+uijQtM08e6774r4+Hhx9erVAs+jPea71VarVk3cvXvX7jE7d+4UmqaJ\n0qVLi4kTJ4qtW7eK/fv3izVr1oiWLVsKTdPEiy++aPO8gIAAyw3/kpOTdbXr1q1bokuXLpa7J2/e\nvFnExsaKJUuWiLp164oqVarY3Kl58eLFQtM04e3tLV555RXx888/i127dol///vfonTp0sLPz09o\nmiaWLl1qee9fv37d6r1dvXp1kZCQIP766y+r1za/r0uVKiWmT58u9u3bJ3bs2CHefPNN4efnJ/r1\n62c3x6xZs4SmaaJWrVriyy+/FPv37xeff/65eOyxxyx32DW/r8+cOSOEECIxMVHEx8eL7t27W96j\n8fHxVnfAHTBggNA0TZQpU0a89957Yvfu3WLjxo2id+/elt8XTdNEQkKCiI+Pt2rTnj17LG3aunWr\n2Lhxo6hZs6Z45JFHrI4z+nuXjMftnZeXXnpJaJomxo4dK06dOiWuXbsmli5dKgICAkTnzp1FVlaW\nu5tIOpnvqmn+MDH/196dcHMz3wnU/Bzz8/O6S+alS5fEG2+8IRo2bCj8/f1FqVKlxMMPPywmT54s\nbt68afd7nDt3Trz88suiZs2awsfHR5QrV060bt1aLFu2zOr757wj6d27d8WGDRtERESEeOCBB0RA\nQIDw8fERVapUEc8884z48ccf88x0/Phx0atXL1GhQgXh7+8vmjZtKlatWiWEEDY/oyNHjlget/cz\nyOsOqWYnT54Ur7zyirj//vuFn5+fKF26tGjWrJn473//m+8fA/Hx8aJXr14iKChI+Pn5iTp16ohx\n48aJ5ORkERYWZtWGuXPn5tuGvMybN094eXmJt956K9/jduzYIUaMGCEefvhhERgYKEqUKCGCgoJE\nhw4dLD+33N5++20RGBgohg4dWqi2ZWdni+XLl4u2bduK8uXLCx8fH3HfffeJESNGiLNnz9p9zsaN\n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\ngg==\n", "text": [ "" ] } ], "prompt_number": 11 }, { "cell_type": "code", "collapsed": false, "input": [ "import pylab as plt\n", "# ------- make a figure ----------------------------\n", "plt.plot(range(10))\n", "plt.grid(True)\n", "\n", "# ------- access objects and change them ------------\n", "ax = plt.gca() # gca == get current axis\n", "line = ax.lines[0] \n", "line.set_marker('o')\n", "line.set_markersize(20)\n", "line.set_linewidth(2)\n", "plt.setp(line, color='g') # set property\n", "\n", "#change the figure style\n", "plt.tick_params(which='both', width=2)\n", "ax.xaxis.set_ticks_position('bottom')\n", "ax.yaxis.set_ticks_position('left')\n", "for k, sk in ax.spines.items():\n", " if k in ('top', 'right'):\n", " sk.set_color('None') \n", " else:\n", " sk.set_position(('outward', 20))\n", " \n", "# add labels\n", "plt.xlabel('measured') \n", "plt.ylabel('calculated') \n", "plt.title('Measured vs. calculated')" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 12, "text": [ "" ] }, { "metadata": {}, "output_type": "display_data", "png": "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\n", "text": [ "" ] } ], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Let's make a class Vector" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The simplest form of class definition looks like this:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class DummyClass:\n", " pass" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Class objects support two kinds of operations: **attribute references** and **methods**.\n", "\n", "Attribute references use the standard syntax used for all attribute references in Python: `obj.name`. \n", "\n", " \n", "So, a class definition looked like this:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class DummyClass:\n", " \"\"\"A simple example class\"\"\"\n", " i = 12345\n", " def f(self):\n", " return 'hello world'" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 14 }, { "cell_type": "markdown", "metadata": {}, "source": [ "then `DummyClass.i` and `DummyClass.f` are valid attribute references, returning an integer and a function object, respectively." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### First exercise, make a vector class:\n", "\n", "**attributes**\n", "\n", "* x, y, z: 3d coordinates\n", "\n", "**methods**\n", "\n", "* sum\n", "* scalar product\n", "* etc" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When a class defines an `__init__()` method, class instantiation automatically invokes `__init__()` for the newly-created class instance. So in this example, a new, initialized instance can be obtained by:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class Vector(object):\n", " def __init__(self):\n", " pass" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Note**: Often, the first argument of a method is called `self`. \n", "This is nothing more than a convention: the name self has absolutely no special meaning to Python. \n", " \n", "Note, however, that by not following the convention your code may be less readable to other Python programmers, and it is also conceivable that a class browser program might be written that relies upon such a convention." ] }, { "cell_type": "code", "collapsed": false, "input": [ "class Vector(object): \n", " def __init__(self, x,y,z): \n", " \"\"\" constructor \"\"\"\n", " pass\n", " \n", " def sum(self, p): \n", " \"\"\" addition: p1+p2 \"\"\"\n", " pass\n", " \n", " def scalarProd(self,p):\n", " \"\"\" A.B = sum(a[k].b[k]) \"\"\"\n", " pass" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "A solution:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# your solution here" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "x = Vector(1, 0, 0)\n", "y = Vector(0, 1, 0)\n", "z = Vector(0, 0, 1)\n", "\n", "print \"x.y = \", x.scalarProd(y)\n", "\n", "print x" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "x.y = None\n", "<__main__.Vector object at 0x106165ad0>\n" ] } ], "prompt_number": 17 }, { "cell_type": "markdown", "metadata": {}, "source": [ "`object.__repr__(self)`\n", "\n", "Called by the `repr()` built-in function and by string conversions (reverse quotes) to compute the \"official\" string representation of an object. \n", "\n", "`object.__str__(self)`\n", "\n", "Called by the `str()` built-in function and by the print statement to compute the \"informal\" string representation of an object. \n", "\n", "\n", "http://docs.python.org/2/reference/datamodel.html" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class Vector(object): \n", " \n", " # your previous solution\n", " \n", " def __str__(self):\n", " # your solution here" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "x = Vector(1, 0, 0)\n", "y = Vector(0, 1, 0)\n", "z = Vector(0, 0, 1)\n", "\n", "print \"x.y = \", x.scalarProd(y)\n", "print x" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "What about checking that $x^2 + y^2 + 2\\cdot x \\cdot y = (x + y) ^ 2$" ] }, { "cell_type": "code", "collapsed": false, "input": [ "x.scalarProd(x) + y.scalarProd(y)\n", "x.scalarProd(x) + y.scalarProd(y) + 2 * x.scalarProd(y) == x.sum(y).scalarProd(x.sum(y))" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "x ** 2 + y ** 2 + 2 * x * y == (x + y) ** 2" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Implement common operators `__add__`, `__sub__`, `__mul__`, ...\n", "see http://docs.python.org/2/reference/datamodel.html" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# put the new version of your class here" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "x = Vector(1, 0, 0)\n", "y = Vector(0, 1, 0)\n", "z = Vector(0, 0, 1)\n", "\n", "xy = x * y\n", "print \"x.y = \", xy\n", "print x\n", "x * x + y * y + 2 * x * y == (x + y) ** 2" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###Bonus exercise\n", "\n", "Generalize the class vector and all operations to N-dimensions\n", "(tip: you can use numpy arrays)\n" ] }, { "cell_type": "code", "collapsed": false, "input": [ "#code here" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A Teaser about Decorators\n", "\n", "This section is a very quick introduction to a very pythonic coding process: **decorations**\n", " \n", "A decorator is just a **callable** object that takes a function as an argument and returns a replacement function. We\u2019ll start simply and work our way up to useful decorators. In other words: **a function that writes a function of a function**\n", " \n", "Look carefully through our decorator example below. We defined a function named `outer` that has a single parameter `some_func`. Inside `outer` we define an nested function named `inner`. \n", "\n", "Since Python 2.4, you can wrap a function in a decorator by pre-pending the function definition with a decorator name and the `@` symbol. In the code samples below above we decorated our function using this syntax, however it\u2019s important to recognize that this is no different than simply replacing the original variable with the return from the wrapper function- **Python just adds some syntactic sugar to make what is going on very explicit.**" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def outer(some_func):\n", " def inner():\n", " print \"before some_func\"\n", " ret = some_func() # 1\n", " return ret + 1\n", " return inner\n", "\n", "@outer\n", "def foo():\n", " return 1\n", "\n", "# transparently equivalent to\n", "# foo = outer(foo)\n", "\n", "foo()" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "before some_func\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 18, "text": [ "2" ] } ], "prompt_number": 18 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Examples of 2 decorators: \n", " \n", "* timing a function (which also implements the context manager usage)\n", "* memoization feature: caching output of a function according to its call arguments." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import collections\n", "import functools\n", "from functools import wraps\n", "import time, math, sys\n", "\n", "class timeit(object):\n", "\t\"\"\" Time a block of your code.\n", " Decorator and context manager\n", "\t\"\"\"\n", "\tdef __init__(self, f=None, verbose=True, text=None):\n", "\t\tself.f = f\n", "\t\tif not self.f is None:\n", "\t\t\tif type(self.f) != str:\n", "\t\t\t\tfunctools.update_wrapper(self, f)\n", "\t\t\t\tself.text = self.__name__\n", "\t\t\telse:\n", "\t\t\t\tself.text = f\n", "\t\telse:\n", "\t\t\tself.text = text or ''\n", "\t\tself.verbose = verbose\n", "\n", "\tdef __enter__(self):\n", "\t\tprint \"Timing %s\" % (self.text)\n", "\t\tself.start = time.time()\n", "\n", "\tdef __exit__(self, exc_type, exc_val, exc_tb):\n", "\t\tself.stop = time.time()\n", "\t\tprint self.time\n", "\n", "\tdef __pretty_print(self, t):\n", "\t\tunits = [u\"s\", u\"ms\",u'us',\"ns\"]\n", "\t\tscaling = [1, 1e3, 1e6, 1e9]\n", "\t\tif t > 0.0 and t < 1000.0:\n", "\t\t\torder = min(-int(math.floor(math.log10(t)) // 3), 3)\n", "\t\telif best >= 1000.0:\n", "\t\t\torder = 0\n", "\t\telse:\n", "\t\t\torder = 3\n", "\t\treturn \"%s Execution time: %.3g %s\" % (self.text, t * scaling[order], units[order])\n", "\n", "\t@property\n", "\tdef time(self):\n", "\t\treturn self.__pretty_print(self.stop-self.start)\n", "\n", "\tdef __call__(self, *args, **kwargs):\n", "\t\tself.start = time.time()\n", "\t\tr = self.f(*args, **kwargs)\n", "\t\tself.stop = time.time()\n", "\t\tif self.verbose:\n", "\t\t\tprint self.time\n", "\t\treturn r\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 19 }, { "cell_type": "code", "collapsed": false, "input": [ "class memoize(dict):\n", "\t'''Decorator that caches a function's return\n", " value each time it is called. If called \n", " later with the same arguments, the cached \n", " value is returned (not reevaluated).\n", "\t'''\n", "\tdef __init__(self, func):\n", "\t\tself.func = func\n", "\t\tfunctools.update_wrapper(self, func)\n", "\n", "\tdef __getitem__(self, *key):\n", "\t\treturn dict.__getitem__(self, key)\n", "\n", "\tdef __missing__(self, key):\n", "\t\tret = self[key] = self.func(*key)\n", "\t\treturn ret\n", "\n", "\t__call__ = __getitem__\n", "\n", "\tdef __repr__(self):\n", "\t\t'''Return the function's docstring.'''\n", "\t\treturn self.func.__doc__\n" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [ "@timeit\n", "@memoize\n", "def f(*args, **kwargs):\n", " import time\n", " time.sleep(5)\n", " return (args, kwargs)" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 21 }, { "cell_type": "code", "collapsed": false, "input": [ "f(10)\n", "f(10)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "f Execution time: 5 s\n", "f Execution time: 5.01 us\n" ] }, { "metadata": {}, "output_type": "pyout", "prompt_number": 22, "text": [ "((10,), {})" ] } ], "prompt_number": 22 }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Implementing the IMF as an object" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Inheritance\n", "Of course, a language feature would not be worthy of the name \u201cclass\u201d without supporting inheritance. The syntax for a derived class definition looks like this:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class IMF(object):\n", " mass = [0.1, 120.]\n", "\n", " \n", "class Salpeter(IMF):\n", " pass" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "code", "collapsed": false, "input": [ "f = Salpeter()\n", "print f.mass" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Execution of a derived class definition proceeds the same as for a base class. When the class object is constructed, the base class is remembered. This is used for resolving attribute references: if a requested attribute is not found in the class, the search proceeds to look in the base class. This rule is applied recursively if the base class itself is derived from some other class.\n", "\n", "There\u2019s nothing special about instantiation of derived classes: `Salpeter()` creates a new instance of the class. Method references are resolved as follows: the corresponding class attribute is searched, ascending up the chain of parent classes if necessary, and the method reference is valid if this yields a function object.\n", "\n", "Derived classes may override methods of their base classes.\n", "\n", "An overriding method in a derived class may in fact want to extend rather than simply replace the base class method of the same name. There is a simple way to call the base class method directly: just call `IMF.methodname(self, *args, **kwargs)`. It is common to call the parent constructor in the derived class constructor:\n", "\n", "```\n", "def Salpeter(IMF):\n", " def __init__(self, *args, **kwargs):\n", " IMF.__init__(self, *args, **kwargs)\n", "```\n", "\n", "Note that the above example is equivalent to doing nothing special and thus can be omitted (it is the implicit definition from inheritance)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Homework: fully implement an IMF concept.\n", "\n", "\n", "**due Monday, October 14th**\n", " \n", "\n", "\n", "__Similarly to last week assignment__\n", "\n", "* Create a new notebook or a copy of the current one, and call it `HW2.ipynb`,\n", "\n", "* complete this part, embed resulting figures in the notebook. Comment your code: each function/method must have at least one line of description.\n", "* The assignment should be turned in by submitting a pull request to the github repository: `jakevdp/ASTR599_homework`. (see Astro599 website for help)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**The requirements are:**\n", "\n", "* Computing the expected number of stars per mass bin\n", "* Computing the mass enclosed in a given mass range\n", "* Being able to draw random masses from an IMF\n", "* What is the average mass predicted by an IMF?\n", "\n", "Below is a template of IMF class. **Feel free to adapt.**" ] }, { "cell_type": "code", "collapsed": false, "input": [ "class IMF(object):\n", " \"\"\"\n", " IMF object class\n", " let you define an IMF as multiple power-laws.\n", "\n", " attributes:\n", " norm: norm of the function\n", " \"\"\"\n", "\n", " def __init__(self, *args, **kwargs):\n", " \"\"\"\n", " \"\"\"\n", " pass\n", "\n", " def get_enclosed_mass(self, Mmin, Mmax):\n", " \"\"\"Get the enclosed mass over a given mass range.\n", " \"\"\"\n", " pass\n", "\n", " def get_enclosed_Nstar(self, Mmin, Mmax):\n", " \"\"\"Get the enclosed dN over a given mass range\n", " \"\"\"\n", " pass\n", "\n", " def get_avg_mass(self, Mmin, Mmax):\n", " \"\"\" get the avg mass over a given range \"\"\"\n", " pass\n", "\n", " def getValue(self, m):\n", " \"\"\" returns the value of the normalized IMF at a given mass m:\n", " note: m can be an iterable\n", " \"\"\"\n", " pass\n", "\n", " def random(self, N, massMin=None, massMax=None):\n", " \"\"\" Draw samples from this distribution\n", " Samples are distributed over the interval [massMin, massMax]\n", " Interval is truncated to the IMF range definition if it extents beyond it. \n", " (taken as is otherwise)\n", " \"\"\"\n", " pass\n", " \n", " def __call__(self, m=None):\n", " return self.getValue(m)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot at least a couple of mass functions on the same figure" ] }, { "cell_type": "code", "collapsed": false, "input": [ "#your code here" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Draw a random sample of N masses from one mass function and show that the sample follows the desired distribution" ] }, { "cell_type": "code", "collapsed": false, "input": [ "#code here" ], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }