{ "metadata": { "celltoolbar": "Slideshow", "name": "", "signature": "sha256:b6b2d9afb779b4af6c3ac6d5525cf27588600d5e46a88980f1524e5c4f86dbba" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Python 3 goodness\n", "==================\n", "\n", "- Features ONLY in Python 3 \n", "\n", "\n", "- Features added in Python 2.7 (since we have been using Python 2.6)\n", "\n" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "1. Handling unicode data" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Python 2 differentiated between unicode and non-unicode data" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Python 3 has the concept of text and data." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Data is encoded text and is in binary form (bytes)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- To convert from data to text, use .decode()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- To convert from text to data, use .encode()" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Open files in binary mode so that you work with data (bytes), not text." ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Examples:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "s1 = \"abc\u00a5\"\n", "data = s1.encode()\n", "\n", "# These are encoded as bytes\n", "print(data)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "b'abc\\xc2\\xa5'\n" ] } ], "prompt_number": 62 }, { "cell_type": "code", "collapsed": false, "input": [ "# Iteration does not give text characters like string.\n", "for x in data:\n", " print(x)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "97\n", "98\n", "99\n", "194\n", "165\n" ] } ], "prompt_number": 63 }, { "cell_type": "code", "collapsed": false, "input": [ "# Decode to get text representation\n", "data.decode()" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 64, "text": [ "'abc\u00a5'" ] } ], "prompt_number": 64 }, { "cell_type": "code", "collapsed": false, "input": [ "# Interface is same as string - string methods work\n", "data.capitalize()" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 65, "text": [ "b'Abc\\xc2\\xa5'" ] } ], "prompt_number": 65 }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "2. Unpacking a tuple or list" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Already can do this\n", "a,b,c = [1, 'cool', True]\n", "print(a)\n", "print(b)\n", "print(c)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1\n", "cool\n", "True\n" ] } ], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "# Now you can do\n", "a,b,*c = [1, 'cool', True, 'more']\n", "print(a)\n", "print(b)\n", "print(c)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "1\n", "cool\n", "[True, 'more']\n" ] } ], "prompt_number": 10 }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "3. Keyword only arguments" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def weird(a,b,c=False):\n", " if c:\n", " print(\"I have deleted everything\")\n", " else:\n", " print(\"No damage done yet\")" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "prompt_number": 12 }, { "cell_type": "code", "collapsed": false, "input": [ "# Passed True by mistake. Didnt know anything about the keyword arg 'c'\n", "weird(1,2,True)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "I have deleted everything\n" ] } ], "prompt_number": 13 }, { "cell_type": "code", "collapsed": false, "input": [ "def nice_weird(a,b,*k, c=False):\n", " if c:\n", " print(\"I have deleted everything\")\n", " else:\n", " print(\"No damage done yet\")" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "nice_weird(1,2,True)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "No damage done yet\n" ] } ], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "nice_weird(1,2,True,False,True,c=False)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "No damage done yet\n" ] } ], "prompt_number": 16 }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "4. Chained Exceptions" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Python 2: Catch an exception and raise another exception. Wipes out original traceback." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Python 3 retains and displays information for both." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Can also be done as:\n", "```\n", " raise NotImplementedError from OSError\n", "```" ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "5. Things that produced lists are now iterators" ] }, { "cell_type": "code", "collapsed": false, "input": [ "my_range = range(0,5)\n", "type(my_range)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 25, "text": [ "range" ] } ], "prompt_number": 25 }, { "cell_type": "code", "collapsed": false, "input": [ "for x in range(0,5):\n", " print(x)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "0\n", "1\n", "2\n", "3\n", "4\n" ] } ], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [ "list(my_range)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 26, "text": [ "[0, 1, 2, 3, 4]" ] } ], "prompt_number": 26 }, { "cell_type": "code", "collapsed": false, "input": [ "mymap = map(lambda x: x**2, [3,4,5])\n", "type(mymap)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 28, "text": [ "map" ] } ], "prompt_number": 28 }, { "cell_type": "code", "collapsed": false, "input": [ "list(mymap)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 29, "text": [ "[9, 16, 25]" ] } ], "prompt_number": 29 }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "6. \"raise\" and \"except\" syntax" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Incorrect\n", "raise IOError, \"got error\"" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "ename": "SyntaxError", "evalue": "invalid syntax (, line 2)", "output_type": "pyerr", "traceback": [ "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m2\u001b[0m\n\u001b[0;31m raise IOError, \"got error\"\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] } ], "prompt_number": 1 }, { "cell_type": "code", "collapsed": false, "input": [ "# Correct\n", "raise IOError(\"got error\")" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "ename": "OSError", "evalue": "got error", "output_type": "pyerr", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# Correct\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mIOError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"got error\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mOSError\u001b[0m: got error" ] } ], "prompt_number": 2 }, { "cell_type": "code", "collapsed": false, "input": [ "# Incorrect\n", "try:\n", " pass\n", "except IOError, err:\n", " pass" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "ename": "SyntaxError", "evalue": "invalid syntax (, line 4)", "output_type": "pyerr", "traceback": [ "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m4\u001b[0m\n\u001b[0;31m except IOError, err:\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] } ], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "# Correct:\n", "try:\n", " pass\n", "except IOError as err:\n", " pass" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [], "prompt_number": 5 }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "7. Cant compare anything to anything" ] }, { "cell_type": "code", "collapsed": false, "input": [ "[1,2,3] > \"hello\"" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "ename": "TypeError", "evalue": "unorderable types: list() > str()", "output_type": "pyerr", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;34m\"hello\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mTypeError\u001b[0m: unorderable types: list() > str()" ] } ], "prompt_number": 30 }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "8. 'yield from' syntax" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Generator\n", "def gen():\n", " for i in [0,1,2]:\n", " yield i\n", "\n", "# To pass on values from generator you have to do this\n", "def process_gen():\n", " for j in gen():\n", " yield j\n", "\n", "list(process_gen())" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 37, "text": [ "[0, 1, 2]" ] } ], "prompt_number": 37 }, { "cell_type": "code", "collapsed": false, "input": [ "# Now you can do this\n", "def process_gen_new():\n", " yield from gen()\n", "\n", "list(process_gen_new())" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 38, "text": [ "[0, 1, 2]" ] } ], "prompt_number": 38 }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "9. enum type" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from enum import Enum\n", "\n", "class Shape(Enum):\n", " circle = 0\n", " square = 1\n", " rhombus = 2\n", "\n", "print(Shape.circle)\n", "print(Shape.circle.name)\n", "print(Shape.circle.value)" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Shape.circle\n", "circle\n", "0\n" ] } ], "prompt_number": 46 }, { "cell_type": "code", "collapsed": false, "input": [ "mydict = {Shape.circle:\"circular\", Shape.square:\"squarish\"}\n", "print(mydict[Shape.circle])" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "circular\n" ] } ], "prompt_number": 48 }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "10. Function annotations" ] }, { "cell_type": "code", "collapsed": false, "input": [ "def masquerader(a:int, b:str) -> float:\n", " print(\"I am a Haskell/Ocaml/Scala wannabe\")\n", "\n", "masquerader(\"doesnt\", \"matter\")" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "I am a Haskell/Ocaml/Scala wannabe\n" ] } ], "prompt_number": 41 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Totally arbitrary and unchecked" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Paves the way for \"type hinting\" in Python 3.5" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Will not be integrated into interpreter. Just a tool provided to type-check." ] }, { "cell_type": "heading", "level": 1, "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Python 2.7 (and hence Python 3) already has these:" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- OrderedDict" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Set literals\n", " - s = {1,2,3}" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- Dictionary and Set comprehensions\n", " - {x for x in range(5)}\n", " - {x:y for x,y in [(0,0),(1,1),(2,2)]}" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- str.format need not have numbers or keywords in placeholders\n", " - \"Good {}, my name is {}\".format(\"morning\", \"Chandrakant\")" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "fragment" } }, "source": [ "- argparse is part of the standard lib and replaces optparse" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "How many Python packages have support for Python 3?\n", "=========\n", "\n", "https://python3wos.appspot.com/" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.display import HTML\n", "HTML('')" ], "language": "python", "metadata": { "slideshow": { "slide_type": "fragment" } }, "outputs": [ { "html": [ "" ], "metadata": {}, "output_type": "pyout", "prompt_number": 7, "text": [ "" ] } ], "prompt_number": 7 }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "The End\n", "========\n", "\n", "This has been an IPython notebook presentation\n", "\n", "http://ipython.org/" ] } ], "metadata": {} } ] }