Skip to content

Instantly share code, notes, and snippets.

@anandology
Last active December 20, 2015 13:19
Show Gist options
  • Save anandology/6137954 to your computer and use it in GitHub Desktop.
Save anandology/6137954 to your computer and use it in GitHub Desktop.
Advanced Python Workshop August 2-4, 2013 http://advancedpython.hasgeek.com/
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "Advanced Python Workshop - Day 1"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Advanced Python Workshop - Day 1\n",
"[[Day 1]](http://nbviewer.ipython.org/6137954/Advanced%20Python%20Workshop%20-%20Day%201.ipynb) - \n",
"[[Day 2]](http://nbviewer.ipython.org/6137954/Advanced%20Python%20Workshop%20-%20Day%202.ipynb) - \n",
"[[Day 3]](http://nbviewer.ipython.org/6137954/Advanced%20Python%20Workshop%20-%20Day%203.ipynb)\n",
"\n",
"August 2-4, 2013 <br/>\n",
"by [Anand Chitipothu](http://anandology.com/) <br/>\n",
"<http://advancedpython.hasgeek.com/>"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = 1\n",
"y = x\n",
"x = 2\n",
"print x, y"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"2 1\n"
]
}
],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = [1, 2]\n",
"y = [x, 5]\n",
"x.append(3)\n",
"print y"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[1, 2, 3], 5]\n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = [1, 2]\n",
"y = [x, 5]\n",
"x = [1, 2, 3]\n",
"print y"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[1, 2], 5]\n"
]
}
],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def append(x, a):\n",
" x.append(a)\n",
" \n",
"p = [1, 2]\n",
"append(p, 3)\n",
"print p"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[1, 2, 3]\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Default Arguments to functions**"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def inc(x, amount=1):\n",
" return x + amount\n",
"\n",
"x = 4\n",
"print inc(x)\n",
"print inc(x, 3)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"5\n",
"7\n"
]
}
],
"prompt_number": 5
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def inc2(x, amount=1):\n",
" x = x + amount\n",
" return x\n",
"\n",
"x = 4\n",
"print inc2(x)\n",
"print x\n",
"print inc2(x, 3)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"5\n",
"4\n",
"7\n"
]
}
],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Python is strongly typed."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"\"1\" + 2"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "cannot concatenate 'str' and 'int' objects",
"output_type": "pyerr",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-7-e83767cb1e37>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;34m\"1\"\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m: cannot concatenate 'str' and 'int' objects"
]
}
],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lets go back to default args."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def f(x):\n",
" print \"f is called with arg\", x\n",
" return x\n",
"\n",
"print \"before defining inc\"\n",
"def inc3(x, amount=f(1)):\n",
" return x + amount\n",
"print \"after defining inc\"\n",
"print inc3(5)\n",
"print inc3(10)\n",
"print \"end\""
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"before defining inc\n",
"f is called with arg 1\n",
"after defining inc\n",
"6\n",
"11\n",
"end\n"
]
}
],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"default values are evaluated when the function is defined."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def f(x):\n",
" print \"f is called with arg\", x\n",
" return x\n",
"\n",
"y = 1\n",
"print \"before defining inc\"\n",
"def inc3(x, amount=f(y)):\n",
" return x + amount\n",
"print \"after defining inc\"\n",
"print inc3(5)\n",
"y = 2\n",
"print inc3(10)\n",
"print \"end\""
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"before defining inc\n",
"f is called with arg 1\n",
"after defining inc\n",
"6\n",
"11\n",
"end\n"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"inc3"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 10,
"text": [
"<function __main__.inc3>"
]
}
],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"dir(inc3)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 11,
"text": [
"['__call__',\n",
" '__class__',\n",
" '__closure__',\n",
" '__code__',\n",
" '__defaults__',\n",
" '__delattr__',\n",
" '__dict__',\n",
" '__doc__',\n",
" '__format__',\n",
" '__get__',\n",
" '__getattribute__',\n",
" '__globals__',\n",
" '__hash__',\n",
" '__init__',\n",
" '__module__',\n",
" '__name__',\n",
" '__new__',\n",
" '__reduce__',\n",
" '__reduce_ex__',\n",
" '__repr__',\n",
" '__setattr__',\n",
" '__sizeof__',\n",
" '__str__',\n",
" '__subclasshook__',\n",
" 'func_closure',\n",
" 'func_code',\n",
" 'func_defaults',\n",
" 'func_dict',\n",
" 'func_doc',\n",
" 'func_globals',\n",
" 'func_name']"
]
}
],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"inc3.func_defaults"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 12,
"text": [
"(1,)"
]
}
],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"inc3.func_defaults = (2,)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"inc3(5)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 14,
"text": [
"7"
]
}
],
"prompt_number": 14
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def f(a, x=[]):\n",
" x.append(a)\n",
" return x\n",
"\n",
"print f(0, [1, 2])\n",
"print f(1)\n",
"print f(2)\n",
"print f(0, [1, 2])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[1, 2, 0]\n",
"[1]\n",
"[1, 2]\n",
"[1, 2, 0]\n"
]
}
],
"prompt_number": 15
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"How to fix this?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def f(a, x=None):\n",
" if x is None:\n",
" x = []\n",
" x.append(a)\n",
" return x\n",
"\n",
"print f(0, [1, 2])\n",
"print f(1)\n",
"print f(2)\n",
"print f(0, [1, 2])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[1, 2, 0]\n",
"[1]\n",
"[2]\n",
"[1, 2, 0]\n"
]
}
],
"prompt_number": 16
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Iterators and Generators"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for a in [1,2,3,4]:\n",
" print a"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1\n",
"2\n",
"3\n",
"4\n"
]
}
],
"prompt_number": 20
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for a in (1, 2, 3, 4):\n",
" print a"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"1\n",
"2\n",
"3\n",
"4\n"
]
}
],
"prompt_number": 21
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for k in {\"x\": 1, \"y\": 2, \"z\": 3}:\n",
" print k"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"y\n",
"x\n",
"z\n"
]
}
],
"prompt_number": 22
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for c in \"hello\":\n",
" print c"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"h\n",
"e\n",
"l\n",
"l\n",
"o\n"
]
}
],
"prompt_number": 24
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"\",\".join([\"a\", \"b\", \"c\"])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 25,
"text": [
"'a,b,c'"
]
}
],
"prompt_number": 25
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"\",\".join((\"a\", \"b\", \"c\"))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 26,
"text": [
"'a,b,c'"
]
}
],
"prompt_number": 26
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"\",\".join({\"x\": 1, \"y\": 2, \"z\": 3})"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 27,
"text": [
"'y,x,z'"
]
}
],
"prompt_number": 27
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Will the order of keys in dict be same always?\n",
"Yes, if you use the same dict."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"d = {\"x\": 1, \"y\": 2, \"z\": 3}"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 28
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"d.keys()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 29,
"text": [
"['y', 'x', 'z']"
]
}
],
"prompt_number": 29
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"max([1, 2, 3, 4])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 33,
"text": [
"4"
]
}
],
"prompt_number": 33
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"max({\"x\": 1, \"y\": 2, \"z\": 3})"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 34,
"text": [
"'z'"
]
}
],
"prompt_number": 34
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = iter([1, 2, 3])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 44
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"next(x)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 45,
"text": [
"1"
]
}
],
"prompt_number": 45
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"next(x)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 46,
"text": [
"2"
]
}
],
"prompt_number": 46
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"next(x)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 47,
"text": [
"3"
]
}
],
"prompt_number": 47
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"next(x)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "StopIteration",
"evalue": "",
"output_type": "pyerr",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-40-5e4e57af3a97>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mStopIteration\u001b[0m: "
]
}
],
"prompt_number": 40
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Before Python 2.6, the next element is got by calling `x.next()`. In Python 2.7, a builtin `next` is added and that is the only way in Python 3."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"y = iter([1, 2, 3])"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 49
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"y.next()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 50,
"text": [
"1"
]
}
],
"prompt_number": 50
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"y.next()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 52,
"text": [
"2"
]
}
],
"prompt_number": 52
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"y.next()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 53,
"text": [
"3"
]
}
],
"prompt_number": 53
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"y.next()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "StopIteration",
"evalue": "",
"output_type": "pyerr",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-54-75a92ee8313a>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0my\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mStopIteration\u001b[0m: "
]
}
],
"prompt_number": 54
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Lets implememt something like `xrange`."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for i in xrange(4):\n",
" print i,"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0 1 2 3\n"
]
}
],
"prompt_number": 55
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"xrange(4)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 56,
"text": [
"xrange(4)"
]
}
],
"prompt_number": 56
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"class yrange:\n",
" def __init__(self, n):\n",
" self.n = n\n",
" self.i = 0\n",
" \n",
" def __iter__(self):\n",
" return self\n",
" \n",
" def next(self):\n",
" print \"next called\", self.i\n",
" i = self.i\n",
" if i < self.n:\n",
" self.i += 1\n",
" return i\n",
" raise StopIteration()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 66
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"yrange(4)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 67,
"text": [
"<__main__.yrange instance at 0x101f9f6c8>"
]
}
],
"prompt_number": 67
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for i in yrange(4): print i,"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0 1 2 3\n"
]
}
],
"prompt_number": 60
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"y = yrange(4)\n",
"it = iter(y)\n",
"print next(it)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"next called 0\n",
"0\n"
]
}
],
"prompt_number": 68
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print next(it)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"next called 1\n",
"1\n"
]
}
],
"prompt_number": 69
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print next(it)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"next called 2\n",
"2\n"
]
}
],
"prompt_number": 70
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print next(it)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"next called 3\n",
"3\n"
]
}
],
"prompt_number": 71
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"print next(it)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "StopIteration",
"evalue": "",
"output_type": "pyerr",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-72-b9b0e582689c>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mprint\u001b[0m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mit\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mStopIteration\u001b[0m: "
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"next called 4\n"
]
}
],
"prompt_number": 72
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"What happens when we overwrite a builtin function?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def f(): return 1\n",
"def f(): return 2\n",
"print f()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"2\n"
]
}
],
"prompt_number": 73
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The last defination overwrites the previous ones."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Generators**"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def numbers():\n",
" print \"begin\"\n",
" yield 1\n",
" print \"after 1\"\n",
" yield 2\n",
" print \"after 2\"\n",
" yield 3\n",
" print \"end\"\n",
" "
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 76
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for i in numbers(): print i"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"begin\n",
"1\n",
"after 1\n",
"2\n",
"after 2\n",
"3\n",
"end\n"
]
}
],
"prompt_number": 77
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = numbers()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 78
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 79,
"text": [
"<generator object numbers at 0x101faa0a0>"
]
}
],
"prompt_number": 79
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"next(x)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"begin\n"
]
},
{
"output_type": "pyout",
"prompt_number": 80,
"text": [
"1"
]
}
],
"prompt_number": 80
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"next(x)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"after 1\n"
]
},
{
"output_type": "pyout",
"prompt_number": 81,
"text": [
"2"
]
}
],
"prompt_number": 81
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"next(x)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"after 2\n"
]
},
{
"output_type": "pyout",
"prompt_number": 82,
"text": [
"3"
]
}
],
"prompt_number": 82
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"next(x)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "StopIteration",
"evalue": "",
"output_type": "pyerr",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mStopIteration\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-83-5e4e57af3a97>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mnext\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[0;31mStopIteration\u001b[0m: "
]
},
{
"output_type": "stream",
"stream": "stdout",
"text": [
"end\n"
]
}
],
"prompt_number": 83
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Problem:** Implement `yrange` as a generator function."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%file yrange.py\n",
"def yrange(n):\n",
" i = 0\n",
" while i < n:\n",
" yield i\n",
" i += 1\n",
" \n",
"for i in yrange(10):\n",
" print i,"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Overwriting yrange.py\n"
]
}
],
"prompt_number": 104
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"!python yrange.py"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0 1 2 3 4 5 6 7 8 9\r\n"
]
}
],
"prompt_number": 105
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def squares(numbers):\n",
" for n in numbers:\n",
" yield n*n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 85
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sum(squares(yrange(1000000)))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 86,
"text": [
"333332833333500000"
]
}
],
"prompt_number": 86
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The `file` object in Python is iterable."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%file numbers.txt\n",
"one\n",
"two\n",
"three\n",
"four\n",
"five"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Overwriting numbers.txt\n"
]
}
],
"prompt_number": 88
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f = open(\"numbers.txt\")"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 89
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 90,
"text": [
"<open file 'numbers.txt', mode 'r' at 0x101ebbb70>"
]
}
],
"prompt_number": 90
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for line in f: print line"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"one\n",
"\n",
"two\n",
"\n",
"three\n",
"\n",
"four\n",
"\n",
"five\n"
]
}
],
"prompt_number": 91
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%file grep.py\n",
"import sys\n",
"def grep(pattern, lines):\n",
" for line in lines:\n",
" #print \"grep\", repr(line)\n",
" if pattern in line:\n",
" yield line\n",
" \n",
"def uppercase(seq):\n",
" for x in seq:\n",
" #print \"uppercase\", repr(x)\n",
" yield x.upper()\n",
" \n",
"def print_lines(lines):\n",
" for line in lines:\n",
" #print \"print_lines\", repr(line)\n",
" print line.strip(\"\\n\")\n",
" \n",
"def main():\n",
" pattern = sys.argv[1]\n",
" filename = sys.argv[2]\n",
" f = open(filename)\n",
" lines = grep(pattern, f)\n",
" print_lines(lines)\n",
" \n",
"if __name__ == \"__main__\":\n",
" main()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Writing grep.py\n"
]
}
],
"prompt_number": 18
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"!python grep.py def grep.py"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"def grep(pattern, lines):\r\n",
"def uppercase(seq):\r\n",
"def print_lines(lines):\r\n",
"def main():\r\n"
]
}
],
"prompt_number": 120
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%file num.txt\n",
"1\n",
"2\n",
"3\n",
"4\n",
"5\n",
"6\n",
"7\n",
"8\n",
"9\n",
"10"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Writing num.txt\n"
]
}
],
"prompt_number": 121
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def toint(seq):\n",
" for x in seq:\n",
" yield int(x)\n",
"\n",
"sum(toint(open(\"num.txt\")))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 122,
"text": [
"55"
]
}
],
"prompt_number": 122
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Quick Intro to command line aguments**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Because we need them everywhere."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%file echo.py\n",
"import sys\n",
"print sys.argv[1]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Writing echo.py\n"
]
}
],
"prompt_number": 22
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"!python echo.py hello "
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"hello\r\n"
]
}
],
"prompt_number": 129
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%file square.py\n",
"import sys\n",
"\n",
"def square(x):\n",
" return x*x\n",
"\n",
"# Run this code only if executed as a script\n",
"# This won't be executed when this file imported\n",
"# as a module.\n",
"if __name__ == \"__main__\":\n",
" n = int(sys.argv[1])\n",
" print square(n)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Overwriting square.py\n"
]
}
],
"prompt_number": 21
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"!python square.py 5"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"25\r\n"
]
}
],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Problem** Write a program add.py that takes 2 arguments and prints their sum."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import square"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"square.square(5)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 7,
"text": [
"25"
]
}
],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import time"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"time"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 9,
"text": [
"<module 'time' from '/Users/anand/pyenvs/sandbox27/lib/python2.7/lib-dynload/time.so'>"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"time.asctime"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 10,
"text": [
"<function time.asctime>"
]
}
],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"time.asctime()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 11,
"text": [
"'Fri Aug 2 12:41:21 2013'"
]
}
],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"time.asctime()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 12,
"text": [
"'Fri Aug 2 12:41:27 2013'"
]
}
],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%file date.py\n",
"import time\n",
"print time.asctime()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Writing date.py\n"
]
}
],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"!python date.py"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Fri Aug 2 12:42:04 2013\r\n"
]
}
],
"prompt_number": 14
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"!python date.py"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Fri Aug 2 12:42:07 2013\r\n"
]
}
],
"prompt_number": 15
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Back to generators**"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"!python grep.py def grep.py"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"def grep(pattern, lines):\r\n",
"def uppercase(seq):\r\n",
"def print_lines(lines):\r\n",
"def main():\r\n"
]
}
],
"prompt_number": 20
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%file count_functions.py\n",
"import grep\n",
"import os\n",
"\n",
"def get_files(dir, suffix):\n",
" files = os.listdir(dir)\n",
" for f in files:\n",
" if f.endswith(suffix):\n",
" yield f\n",
"\n",
"def read_files(filenames):\n",
" for f in filenames:\n",
" for line in open(f):\n",
" yield line\n",
" \n",
"def main():\n",
" filenames = get_files(\".\", \".py\")\n",
" lines = read_files(filenames)\n",
" lines = grep.grep(\"def\", lines)\n",
" grep.print_lines(lines)\n",
" \n",
"if __name__ == \"__main__\":\n",
" main()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Overwriting count_functions.py\n"
]
}
],
"prompt_number": 25
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"!python count_functions.py"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"def get_files(dir, suffix):\r\n",
"def read_files(filenames):\r\n",
"def main():\r\n",
" lines = grep.grep(\"def\", lines)\r\n",
"def grep(pattern, lines):\r\n",
"def uppercase(seq):\r\n",
"def print_lines(lines):\r\n",
"def main():\r\n",
"def square(x):\r\n"
]
}
],
"prompt_number": 26
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Problem:** Write a program `count_lines.py` to count number of lines in one or more files. The program should accept filenames as command line arguments.\n",
"\n",
" $ python count_lines.py a.txt b.txt\n",
" 23"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Problem:** Write a program `count_words.py` to count number of words in one or more files. The program should accept filenames as command line arguments.\n",
"\n",
" $ python count_words.py a.txt b.txt\n",
" 46"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%file count_lines.py\n",
"import sys\n",
"\n",
"def read_files(filenames):\n",
" for f in filenames:\n",
" for line in open(f):\n",
" yield line\n",
"\n",
"def count(it):\n",
" n = 0\n",
" for x in it:\n",
" n += 1\n",
" return n\n",
"\n",
"def main():\n",
" filenames = sys.argv[1:]\n",
" lines = read_files(filenames)\n",
" print count(lines)\n",
" \n",
"if __name__ == \"__main__\":\n",
" main()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Overwriting count_lines.py\n"
]
}
],
"prompt_number": 28
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"!python count_lines.py date.py grep.py"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"28\r\n"
]
}
],
"prompt_number": 30
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%file count_words.py\n",
"import sys\n",
"from count_lines import read_files, count\n",
"\n",
"def split_words(lines):\n",
" for line in lines:\n",
" for w in line.strip().split():\n",
" yield w\n",
"\n",
"def main():\n",
" filenames = sys.argv[1:]\n",
" lines = read_files(filenames)\n",
" words = split_words(lines)\n",
" print count(words)\n",
" \n",
"if __name__ == \"__main__\":\n",
" main()"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Writing count_words.py\n"
]
}
],
"prompt_number": 32
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"!python count_words.py date.py grep.py"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"65\r\n"
]
}
],
"prompt_number": 33
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"!wc -w date.py grep.py"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
" 4 date.py\r\n",
" 61 grep.py\r\n",
" 65 total\r\n"
]
}
],
"prompt_number": 34
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Iterator/generator can be consumed only once."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = iter(range(5))\n",
"print next(x) # first element is consumed here\n",
"print list(x) # remaining all are consumed here\n",
"print list(x) # nothing left, so empty list"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0\n",
"[1, 2, 3, 4]\n",
"[]\n"
]
}
],
"prompt_number": 36
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"How to look at an iterator without consuming it?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def peep(it):\n",
" for x in it:\n",
" print x\n",
" yield x"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 37
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"x = iter(range(10))\n",
"y = list(peep(x))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0\n",
"1\n",
"2\n",
"3\n",
"4\n",
"5\n",
"6\n",
"7\n",
"8\n",
"9\n"
]
}
],
"prompt_number": 40
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"y"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 41,
"text": [
"[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]"
]
}
],
"prompt_number": 41
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Problem** Write a function `iterjoin`, that takes two iterators as arguments and returns a single iterator.\n",
"\n",
" >>> x = iter([1, 2, 3])\n",
" >>> y = iter([4, 5, 6])\n",
" >>> z = iterjoin(x, y)\n",
" >>> list(z)\n",
" [1, 2, 3, 4, 5, 6]"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def gen123():\n",
" yield 1\n",
" yield 2\n",
" yield 3\n",
" \n",
"g = gen123()"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 42
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"next(g)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 43,
"text": [
"1"
]
}
],
"prompt_number": 43
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Quick Intro to List Comprehensions**"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"[x*x for x in range(10)]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 45,
"text": [
"[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]"
]
}
],
"prompt_number": 45
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"[x*x for x in range(10) if x%2 == 0]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 46,
"text": [
"[0, 4, 16, 36, 64]"
]
}
],
"prompt_number": 46
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"[line for line in open(\"grep.py\") \n",
" if line.startswith(\"def\")]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 48,
"text": [
"['def grep(pattern, lines):\\n',\n",
" 'def uppercase(seq):\\n',\n",
" 'def print_lines(lines):\\n',\n",
" 'def main():\\n']"
]
}
],
"prompt_number": 48
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%file a.csv\n",
"1,2,3\n",
"2,4,6\n",
"3,6,9"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Writing a.csv\n"
]
}
],
"prompt_number": 49
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"[line.strip().split(\",\") for line in open(\"a.csv\")]"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 52,
"text": [
"[['1', '2', '3'], ['2', '4', '6'], ['3', '6', '9']]"
]
}
],
"prompt_number": 52
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%file b.csv\n",
"# begin\n",
"1,2,3\n",
"2,4,6\n",
"# after two lines\n",
"3,6,9\n",
"#end"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Overwriting b.csv\n"
]
}
],
"prompt_number": 54
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Parse the above csv file by ignoring the lines starting with # character."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sum([i*i for i in range(1, 101)])"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 55,
"text": [
"338350"
]
}
],
"prompt_number": 55
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def squares(numbers):\n",
" return [x*x for x in numbers]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 56
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"squares(range(10))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 57,
"text": [
"[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]"
]
}
],
"prompt_number": 57
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Generator Expressions**"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def squares(numbers):\n",
" return (x*x for x in numbers)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 58
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"s = squares(range(10))\n",
"s"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 59,
"text": [
"<generator object <genexpr> at 0x102701c30>"
]
}
],
"prompt_number": 59
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sum((x*x for x in range(1, 101)))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 60,
"text": [
"338350"
]
}
],
"prompt_number": 60
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sum(x*x for x in range(1, 101))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 61,
"text": [
"338350"
]
}
],
"prompt_number": 61
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sum(x*x for x in xrange(1000000))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 62,
"text": [
"333332833333500000"
]
}
],
"prompt_number": 62
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def readlines(filenames):\n",
" return (line for f in filenames for line in open(f))\n",
"\n",
"def grep(pattern, lines):\n",
" return (line for line in lines if pattern in line)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 63
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Problem** Implement `count` using generator expressions. The count function should take an iterator as argument and count the number of elements in it.\n",
"\n",
" >>> count(iter(range(10)))\n",
" 10\n",
" >>> count(iter(\"hello\"))\n",
" 5\n",
"\n",
"\n",
"Solution:\n",
"\n",
" def count(it):\n",
" return sum(1 for x in it)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Problem** Python module `itertools` has a function `izip`, that zips two iterators together and returns a new iterator.\n",
"\n",
" import itertools\n",
" for a, b in itertools.izip(\"hello\", \"world\"):\n",
" print a, b\n",
"\n",
"Can you implement izip yourself?\n",
"\n",
"Another sample use:\n",
"\n",
" z = izip(\"hello\", \"world\")\n",
" print next(z) # ('h', 'w')\n",
" print next(z) # ('e', 'o')"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"zip('hello', 'world')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 64,
"text": [
"[('h', 'w'), ('e', 'o'), ('l', 'r'), ('l', 'l'), ('o', 'd')]"
]
}
],
"prompt_number": 64
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def izip(it1, it2):\n",
" it1 = iter(it1)\n",
" it2 = iter(it2)\n",
" while True:\n",
" yield next(it1), next(it2)\n",
" \n",
"\n",
"for a, b in izip(\"hello\", \"world\"):\n",
" print a, b"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"h w\n",
"e o\n",
"l r\n",
"l l\n",
"o d\n"
]
}
],
"prompt_number": 65
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## More on Functions"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def square(x): return x*x"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 67
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f = square"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 68
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"f(4)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 69,
"text": [
"16"
]
}
],
"prompt_number": 69
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"max(1, 2, 3)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 70,
"text": [
"3"
]
}
],
"prompt_number": 70
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def my_max(*args):\n",
" m = args[0]\n",
" for a in args:\n",
" if a > m:\n",
" m = a\n",
" return m\n",
"\n",
"my_max(1, 2, 3)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 74,
"text": [
"3"
]
}
],
"prompt_number": 74
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Problem:** Write a function `my_sum`, which takes variable number of numbers as arguments and computes their sum.\n",
"\n",
" >>> my_sum(1)\n",
" 1\n",
" >>> my_sum(1, 2, 3)\n",
" 6\n",
" >>> my_sum(1, 2, 3, 4, 5)\n",
" 15"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Unpacking arguments\n",
"args = [1, 2, 5, 9, 3]\n",
"print my_max(*args)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"9\n"
]
}
],
"prompt_number": 78
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def add(a, b): return a + b\n",
"args = (1, 2)\n",
"print add(*args)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"3\n"
]
}
],
"prompt_number": 79
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def sprintf(template, *args):\n",
" return template % args\n",
"\n",
"print sprintf(\"hello %s\", \"python\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"hello python\n"
]
}
],
"prompt_number": 77
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"\"chapter %d: %s\" % (1, \"Introduction\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 81,
"text": [
"'chapter 1: Introduction'"
]
}
],
"prompt_number": 81
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Keyword Arguments**"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import os\n",
"files = os.listdir(\".\")\n",
"print sorted(files)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['.git', 'Advanced Python Workshop - Day 1.ipynb', 'Advanced Python Workshop - Day 2.ipynb', 'Advanced Python Workshop - Day 3.ipynb', 'Untitled0.ipynb', 'a.csv', 'b.csv', 'count_functions.py', 'count_lines.py', 'count_lines.pyc', 'count_words.py', 'date.py', 'echo.py', 'grep.py', 'grep.pyc', 'square.py', 'square.pyc']\n"
]
}
],
"prompt_number": 83
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def getext(filename):\n",
" return filename.split(\".\")[-1]\n",
"print sorted(files, key=getext)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"['a.csv', 'b.csv', '.git', 'Advanced Python Workshop - Day 1.ipynb', 'Advanced Python Workshop - Day 2.ipynb', 'Advanced Python Workshop - Day 3.ipynb', 'Untitled0.ipynb', 'count_functions.py', 'count_lines.py', 'count_words.py', 'date.py', 'echo.py', 'grep.py', 'square.py', 'count_lines.pyc', 'grep.pyc', 'square.pyc']\n"
]
}
],
"prompt_number": 84
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Problem** How do you sort filenames by length of the filename?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def diff(a, b):\n",
" return a - b\n",
"\n",
"print diff(5, 2)\n",
"print diff(5, b=2)\n",
"print diff(a=5, b=2)\n",
"print diff(b=2, a=5)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"3\n",
"3\n",
"3\n",
"3\n"
]
}
],
"prompt_number": 85
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def mydict(**kwargs):\n",
" return kwargs\n",
"\n",
"mydict(x=1, y=2)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 86,
"text": [
"{'x': 1, 'y': 2}"
]
}
],
"prompt_number": 86
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"\"chapter %d: %s\" % (1, \"introduction\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 90,
"text": [
"'chapter 1: introduction'"
]
}
],
"prompt_number": 90
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"\"chapter %(num)d: %(title)s\" % {\"num\": 1, \"title\": \"introduction\"}"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 91,
"text": [
"'chapter 1: introduction'"
]
}
],
"prompt_number": 91
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"t = \"chapter %(num)d: %(title)s\\n\\nWelcome to %(title)s\"\n",
"print t % {\"num\": 1, \"title\": \"introduction\"}"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"chapter 1: introduction\n",
"\n",
"Welcome to introduction\n"
]
}
],
"prompt_number": 93
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"%%file hello.tmpl\n",
"Hello, %(name)s"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Overwriting hello.tmpl\n"
]
}
],
"prompt_number": 94
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def render_template(_filename, **kwargs):\n",
" t = open(_filename).read()\n",
" return t % kwargs\n",
"\n",
"print render_template(\"hello.tmpl\", name=\"python\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Hello, python\n"
]
}
],
"prompt_number": 95
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Problem:** Implement render_template1 which takes arguments by position and substitutes them.\n",
"\n",
" print render_template1(\"a.tmpl\", \"hello\", \"world\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Lambda functions**"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"names = [\n",
" 'python', 'Perl', 'Java', \n",
" 'c', 'Haskell', 'ruby']\n",
"sorted(names)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 98,
"text": [
"['Haskell', 'Java', 'Perl', 'c', 'python', 'ruby']"
]
}
],
"prompt_number": 98
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sorted(names, key=len)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 99,
"text": [
"['c', 'Perl', 'Java', 'ruby', 'python', 'Haskell']"
]
}
],
"prompt_number": 99
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"How to sort them ignoring the case?"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def lower(s): return s.lower()\n",
"sorted(names, key=lower)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 101,
"text": [
"['c', 'Haskell', 'Java', 'Perl', 'python', 'ruby']"
]
}
],
"prompt_number": 101
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"sorted(names, key=lambda s: s.lower())"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 102,
"text": [
"['c', 'Haskell', 'Java', 'Perl', 'python', 'ruby']"
]
}
],
"prompt_number": 102
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"square = lambda x: x*x\n",
"print square(4)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"16\n"
]
}
],
"prompt_number": 103
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"functions = {\n",
" \"square\": lambda x: x*x,\n",
" \"cube\": lambda x: x*x*x,\n",
" \"incr\": lambda x: x+1\n",
"}\n"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 105
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def call_func(name, arg):\n",
" f = functions[name]\n",
" return f(arg)\n",
"\n",
"call_func(\"incr\", 7)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 106,
"text": [
"8"
]
}
],
"prompt_number": 106
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Problem** Write a function `extsort` that takes list of filenames and sorts them by extension.\n",
"\n",
" >>> extsort(['a.py', 'b.py', 'x.c'])\n",
" ['x.c', 'a.py', 'b.py']"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def isort(values):\n",
" # you can define an inner function like this, if required.\n",
" def lower(s):\n",
" return s.lower()\n",
" return sorted(values, key=lower)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 109
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"(lambda x:x*x)(4)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 110,
"text": [
"16"
]
}
],
"prompt_number": 110
}
],
"metadata": {}
}
]
}
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment