Skip to content

Instantly share code, notes, and snippets.

@jbwhit
Created June 9, 2013 08:35
Show Gist options
  • Save jbwhit/5742829 to your computer and use it in GitHub Desktop.
Save jbwhit/5742829 to your computer and use it in GitHub Desktop.
Part 2
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "best practices and efficiency"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Clean Code; Clear Code\n",
"========================\n",
"\n",
"Best practices \n",
"--------------\n",
"\n",
"Style Guide for Python Code: http://www.python.org/dev/peps/pep-0008/\n",
"\n",
"It ain't c, c++, fortran -- don't code python like it is or it will be slow.\n",
"\n",
"Several examples adapted from: http://www.youtube.com/watch?v=OSGv2VnC0go\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Importing libraries\n",
"-------------------"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# This is bad\n",
"#from numpy import * \n",
"\n",
"import itertools\n",
"#itertools. \n",
"\n",
"import numpy as np\n",
"#np.array("
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 122
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lists!\n",
"----------"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"blank_list = [] # how to create a blank list"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 123
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"colors = ['red', 'green', 'blue', 'yellow'] # list\n",
"print colors"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['red', 'green', 'blue', 'yellow']\n"
]
}
],
"prompt_number": 84
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# IF YOU SEE THIS\n",
"for i in range(len(colors)): # for loop\n",
" print colors[i]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"red\n",
"green\n",
"blue\n",
"yellow\n"
]
}
],
"prompt_number": 124
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# DO THIS INSTEAD\n",
"for color in colors:\n",
" print color"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"red\n",
"green\n",
"blue\n",
"yellow\n"
]
}
],
"prompt_number": 125
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# If you see this kind of thing in your code\n",
"for index in range(len(colors)):\n",
" print index, '-->', colors[index]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0 --> red\n",
"1 --> green\n",
"2 --> blue\n",
"3 --> yellow\n"
]
}
],
"prompt_number": 126
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Do this instead\n",
"for index, color in enumerate(colors):\n",
" print index, '-->', color"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0 --> red\n",
"1 --> green\n",
"2 --> blue\n",
"3 --> yellow\n"
]
}
],
"prompt_number": 127
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"#add list comprehensions\n",
"dave = [x**2 for x in xrange(5)]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 128
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print dave"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[0, 1, 4, 9, 16]\n"
]
}
],
"prompt_number": 129
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Dictionaries!\n",
"--------------\n",
"\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"blank_dict = {} # how to create a blank... dictionary"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 130
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"dictionary = {'Spider Man':'blue', 'Dave':'green', 'Jonathan':'red' }\n",
"print dictionary"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"{'Dave': 'green', 'Jonathan': 'red', 'Spider Man': 'blue'}\n"
]
}
],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print \"Keys: \"\n",
"for key in dictionary:\n",
" print key\n",
" "
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Keys: \n",
"Dave\n",
"Jonathan\n",
"Spider Man\n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print \"Values: \"\n",
"for value in dictionary.itervalues():\n",
" print value"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Values: \n",
"green\n",
"red\n",
"blue\n"
]
}
],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# dictionaries are unordered! \n",
"for key, value in dictionary.items():\n",
" print key, '-->', value"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Dave --> green\n",
"Jonathan --> red\n",
"Spider Man --> blue\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"dictionary_two = {key:dictionary[key]*2 for key in dictionary}\n",
"dictionary_two.update({\"abbie\":\"purple\"})"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print dictionary\n",
"print dictionary_two"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"{'Dave': 'green', 'Jonathan': 'red', 'Spider Man': 'blue'}\n",
"{'Dave': 'greengreen', 'Jonathan': 'redred', 'Spider Man': 'blueblue', 'abbie': 'purple'}\n"
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Other cool ipython notebook features\n",
"-------------------------------------"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Read/write using the with \n",
"\n",
"with open('text.ascii', 'w') as filehandle:\n",
" filehandle.write('hello!')"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# http://stackoverflow.com/questions/3394835/args-and-kwargs\n",
"\n",
"def print_everything(*args):\n",
" \"\"\"Takes a list of arguments and prints an enumerated list. \"\"\"\n",
" for count, thing in enumerate(args):\n",
" print '{0}. {1}'.format(count, thing)\n",
"\n",
"print_everything('apple', 'banana', 'cabbage')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0. apple\n",
"1. banana\n",
"2. cabbage\n"
]
}
],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Similarly, **kwargs allows you to handle named arguments that you have not defined in advance:\n",
"\n",
"def table_things(title_string, **kwargs):\n",
" \"\"\"Takes a title and a dictionary of elements to print as a table elements.\"\"\" \n",
" print title_string\n",
" print \"-\" * len(title_string)\n",
" for name, value in kwargs.items():\n",
" print '{0} = {1}'.format(name, value)\n",
" \n",
"table_things(\"Classifying stuff with Dave\", apple = 'fruit', cabbage = 'vegetable')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Classifying stuff with Dave\n",
"---------------------------\n",
"cabbage = vegetable\n",
"apple = fruit\n"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"names = ['David', 'Jonathan', 'Fred', 'Bob', 'Steve', 'Spider Man']\n",
"statuses = ['cool', 'lame', 'lame', 'lame', 'lame', 'cool', ]\n",
"\n",
"cooldict = {name:status for name, status in itertools.izip(names, statuses)}"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "NameError",
"evalue": "name 'itertools' is not defined",
"output_type": "pyerr",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-10-f28645ec1aae>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mstatuses\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m'cool'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'lame'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'lame'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'lame'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'lame'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'cool'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mcooldict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mstatus\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatus\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mitertools\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mizip\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnames\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatuses\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mNameError\u001b[0m: name 'itertools' is not defined"
]
}
],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"cooldict"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"table_things(\"Cool factor\", **cooldict) # double splat! "
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Plotting Workflow Example\n",
"--------------------------"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import pylab as pl\n",
"pl.rcParams['figure.figsize'] = 8, 6 # plotsize "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"N_points = 100 # 10, 100\n",
"x = np.linspace(0, 2*np.pi, N_points)\n",
"f = np.sin(x) "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"pl.plot(x, f, label=\"sin\") # color, label\n",
"pl.plot(x, np.cos(x), label=\"cos\", color='red') # color, label\n",
"pl.legend()\n",
"pl.ylabel(\"sin(x)\")\n",
"pl.xlabel(\"radians\")\n",
"pl.savefig(\"amazing-1.pdf\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "display_data",
"png": "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\n"
}
],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 13
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Glimpse of the future\n",
"---------------------\n",
"\n",
"ipython notebook + gist.github.com + nbviewer == easily shareable and reproducible work"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Example\n",
"----------\n",
"\n",
"- Their arxiv link: http://arxiv.org/abs/1303.2690\n",
"- Their github (git repo): https://github.com/forero/LG_Kinematics\n",
"- A view of their ipython notebook: http://nbviewer.ipython.org/urls/raw.github.com/forero/LG_Kinematics/master/code/main_analysis.ipynb\n",
"- Change the hubble constant!"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment