{"cells":[{"cell_type":"markdown","metadata":{},"source":"Python Language Intro (Part 2)\n==============================\n\n"},{"cell_type":"markdown","metadata":{},"source":["## Agenda\n\n"]},{"cell_type":"markdown","metadata":{},"source":["1. Language overview\n2. White space sensitivity\n3. Basic Types and Operations\n4. **Statements & Control Structures**\n5. **Functions**\n6. **OOP (Classes, Methods, etc.)**\n7. Immutable Sequence Types (Strings, Ranges, Tuples)\n8. Mutable data structures: Lists, Sets, Dictionaries\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["# by default, only the result of the last expression in a cell is displayed after evaluation.\n# the following forces display of *all* self-standing expressions in a cell.\n\nfrom IPython.core.interactiveshell import InteractiveShell\nInteractiveShell.ast_node_interactivity = \"all\""]},{"cell_type":"markdown","metadata":{},"source":["## 1. Statements & Control Structures\n\n"]},{"cell_type":"markdown","metadata":{},"source":["### Assignment\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["# simple, single target assignment\n\na = 0\nb = 'hello'"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["# can also assign to target \"lists\"\n\na, b, c = 0, 'hello', True"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["# note: expression on right is fully evaluated, then are assigned to\n# elements in the \"target\" list, from left to right\n\nx, y, z = 1, 2, 3\nx, y, z = x+y, y+z, x+y+z"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["# easy python \"swap\"\n\na, b = 'apples', 'bananas'\na, b = b, a"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["# note: order matters!\n\na, b, a = 1, 2, 3"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["# can also have multiple assignments in a row -- consistent with\n# above: expression is evaluated first, then assigned to all targets\n# from left to right (note: order matters!)\n\nx = y = z = None"]},{"cell_type":"markdown","metadata":{},"source":["### Augmented assignment\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["a = 0\na += 2\na *= 3"]},{"cell_type":"markdown","metadata":{},"source":["### `pass`\n\n"]},{"cell_type":"markdown","metadata":{},"source":["**`pass`** is the \"do nothing\" statement\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["pass"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["def foo():\n pass"]},{"cell_type":"markdown","metadata":{},"source":["### `if`-`else` statements\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["from random import randint\nscore = randint(50, 100)\ngrade = None\nif score >= 90:\n grade = 'A'\nelif score >= 80:\n grade = 'B'\nelif score >= 70:\n grade = 'C'\nelif score >= 60:\n grade = 'D'\nelse:\n grade = 'E'\n\nprint(score, grade)"]},{"cell_type":"markdown","metadata":{},"source":["### `while` loops\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["f0 = 0\nf1 = 1\nwhile f0 < 100:\n print(f0)\n f0, f1 = f1, f0+f1"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["i = 0\nto_find = 10\nwhile i < 5:\n i += 1\n if i == to_find:\n print('Found; breaking early')\n break\nelse:\n print('Not found; terminated loop')"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["i = 0\nto_find = 10\nwhile i < 100:\n i += 1\n if i == to_find:\n print('Found; breaking early')\n break\nelse:\n print('Not found; terminated loop')"]},{"cell_type":"markdown","metadata":{},"source":["### Exception Handling\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["raise Exception('Boom!')"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["raise NotImplementedError()"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["try:\n raise Exception('Boom')\nexcept:\n print('Exception encountered!')"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["try:\n raise ArithmeticError('Eeek!')\nexcept LookupError as e:\n print('LookupError:', e)\nexcept ArithmeticError as e:\n print('ArithmeticError:', e)\nexcept Exception as e:\n print(e)\nfinally:\n print('Done')"]},{"cell_type":"markdown","metadata":{},"source":["### `for` loops (iteration)\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["for x in range(10):\n print(x)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["for i in range(9, 81, 9):\n print(i)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["for c in 'hello world':\n print(c)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["to_find = 50\nfor i in range(100):\n if i == to_find:\n break\nelse:\n print('Completed loop')"]},{"cell_type":"markdown","metadata":{},"source":["### Generalized iteration (`iter` and `next`)\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["r = range(10)\nit = iter(r)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["type(it)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["next(it)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["it = iter(r)\nwhile True:\n try:\n x = next(it)\n print(x)\n except StopIteration:\n break"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["it = iter(r)\nwhile True:\n try:\n x = next(it)\n y = next(it)\n print(x, y, x+y)\n except StopIteration:\n break"]},{"cell_type":"markdown","metadata":{},"source":["## 1. Functions\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["def foo():\n pass"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["import math\n\ndef quadratic_roots(a, b, c):\n disc = b**2-4*a*c\n if disc < 0:\n return None\n else:\n return (-b+math.sqrt(disc))/(2*a), (-b-math.sqrt(disc))/(2*a)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["quadratic_roots(1, -5, 6) # eq = (x-3)(x-2)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["quadratic_roots(a=1, b=-5, c=6)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["quadratic_roots(c=6, a=1, b=-5)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["def create_character(name, race, hitpoints, ability):\n print('Name:', name)\n print('Race:', race)\n print('Hitpoints:', hitpoints)\n print('Ability:', ability)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["create_character('Legolas', 'Elf', 100, 'Archery')"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["def create_character(name, race='Human', hitpoints=100, ability=None):\n print('Name:', name)\n print('Race:', race)\n print('Hitpoints:', hitpoints)\n if ability:\n print('Ability:', ability)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["create_character('Michael')"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["def create_character(name, race='Human', hitpoints=100, abilities=()):\n print('Name:', name)\n print('Race:', race)\n print('Hitpoints:', hitpoints)\n if abilities:\n print('Abilities:')\n for ability in abilities:\n print(' -', ability)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["create_character('Gimli', race='Dwarf')"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["create_character('Gandalf', hitpoints=1000)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["create_character('Aragorn', abilities=('Swording', 'Healing'))"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["def create_character(name, *abilities, race='Human', hitpoints=100):\n print('Name:', name)\n print('Race:', race)\n print('Hitpoints:', hitpoints)\n if abilities:\n print('Abilities:')\n for ability in abilities:\n print(' -', ability)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["create_character('Michael')"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["create_character('Michael', 'Coding', 'Teaching', 'Sleeping', hitpoints=25, )"]},{"cell_type":"markdown","metadata":{},"source":["### Functions as Objects\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["def foo():\n print('Foo called')\n\nbar = foo\nbar()"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["def foo(f):\n f()\n\ndef bar():\n print('Bar called')\n\nfoo(bar)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["foo = lambda: print('Anonymous function called')\n\nfoo()"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["f = lambda x,y: x+y\n\nf(1,2)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["def my_map(f, it):\n for x in it:\n print(f(x))"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["my_map(lambda x: x*2, range(1,10))"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["for x in map(lambda x: x*2, range(1,10)):\n print(x)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["def foo():\n print('Foo called')\n\ntype(foo)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["dir(foo)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["foo.__call__()"]},{"cell_type":"markdown","metadata":{},"source":["## 1. OOP (Classes, Methods, etc.)\n\n"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["class Foo:\n pass"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["type(Foo)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["Foo()"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["type(Foo())"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["__name__ # name of the current \"module\" (for this notebook)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["globals().keys() # symbol table of the current module"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["import sys\nm = sys.modules['__main__'] # explicitly accessing the __main__b module\ndir(m)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["m.Foo()"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["f = Foo()"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["f.x = 100\nf.y = 50\nf.x + f.y"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["g = Foo()\ng.x"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["class Foo:\n def bar():\n print('Bar called')"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["type(Foo.bar)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["f = Foo()"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["type(f.bar)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["Foo.bar()"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["f.bar()"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["class Foo:\n def bar(x):\n print('Bar called with', x)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["Foo.bar()"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["f = Foo()\nf.bar()"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["class Foo:\n def bar(self):\n self.x = 'Some value'"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["f = Foo()\nf.bar()\nf.x"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["class Shape:\n def __init__(self, name):\n self.name = name\n\n def __repr__(self):\n return self.name\n\n def __str__(self):\n return self.name.upper()\n\n def area(self):\n raise NotImplementedError()"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["s = Shape('circle')"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["s"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["str(s)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["s.area()"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["class Circle(Shape):\n def __init__(self, radius):\n super().__init__('circle')\n self.radius = radius\n\n def area(self):\n return 3.14 * self.radius ** 2"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["c = Circle(5.0)\nc\nc.area()"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["class Circle(Shape):\n def __init__(self, radius):\n super().__init__('circle')\n self.radius = radius\n\n def area(self):\n return 3.14 * self.radius ** 2\n\n def __eq__(self, other):\n return isinstance(other, Circle) and self.radius == other.radius\n\n def __add__(self, other):\n return Circle(self.radius + other.radius)\n\n def __repr__(self):\n return 'Circle(r={})'.format(self.radius)"]},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":["c1 = Circle(2.0)\nc2 = Circle(4.0)\nc3 = Circle(2.0)\n\nc1, c2, c3\nc1 == c2\nc1 == c3\nc1 + c2"]}],"metadata":{"org":null,"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.5.2"}},"nbformat":4,"nbformat_minor":0}