Created
December 30, 2014 12:23
-
-
Save suranands/a81ebdc9d6afc21aff61 to your computer and use it in GitHub Desktop.
More Python
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"metadata": { | |
"name": "" | |
}, | |
"nbformat": 3, | |
"nbformat_minor": 0, | |
"worksheets": [ | |
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Back to Basics\n", | |
"* After a lot of turmoil around learning object oriented programming, I am back into basics.\n", | |
" * I recently joined a facebook group of python programmers administered by an European who suggested me this [link](http://www.python-course.eu/python3_generators.php) for learning OOP with Python. Most of the text in this NB is directly taken from the link.\n", | |
" * Seeing the page, I felt it is necessary to brush up a few more topics which I seem to have skipped.\n", | |
" * Particularly, Iterators and Generators.\n", | |
" * This notebook and a few more coming up will hopefully cover that gap." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Iterators" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"* An iterator can be seen as a pointer to a container, e.g. a list structure, that can iterate over all the elements of this container. \n", | |
" * The iterator is an abstraction, which enables the programmer to access all the elements of a container (a set, a list and so on) without any deeper knowledge of the data structure of this container object. \n", | |
" * In some object oriented programming languages, like Perl, Java and Python, iterators are implicitly available and can be used in foreach loops, corresponding to for loops in Python.\n", | |
" * Generators are a special kind of function, which enable us to implement or generate iterators.\n", | |
" * Iterators are a fundamental concept of Python.\n", | |
" * Mostly, iterators are implicitly used, like in the for loop of Python, as can be seen in the following example: " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"towns = [\"Paris\",\"Berlin\",\"London\",\"Vienna\"]\n", | |
"for location in towns:\n", | |
" print(\"location: \" + location)" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"location: Paris\n", | |
"location: Berlin\n", | |
"location: London\n", | |
"location: Vienna\n" | |
] | |
} | |
], | |
"prompt_number": 2 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"# The dictionary data type dict supports iterators as well. \n", | |
"# In this case the iteration runs over the keys of the dictionary: \n", | |
"\n", | |
"capitals = {\"France\":\"Paris\",\"Netherlands\":\"Amsterdam\",\"Germany\":\"Berlin\",\"Switzerland\":\"Bern\"}\n", | |
"for country in capitals:\n", | |
" print(\"The capital city of \" + country + \" is \" + capitals[country])" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"The capital city of Switzerland is Bern\n", | |
"The capital city of Netherlands is Amsterdam\n", | |
"The capital city of Germany is Berlin\n", | |
"The capital city of France is Paris\n" | |
] | |
} | |
], | |
"prompt_number": 4 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Generators\n", | |
"* Generators are a simple and powerful possibility to create or to generate iterators.\n", | |
" * On the surface they look like functions, but there is both a syntactical and a semantical difference. \n", | |
" * Instead of return statements you will find inside of the body of a generator only yield statements, i.e. one or more yield statements. \n", | |
" * Another important feature of generators is that the local variables and the execution start is automatically saved between calls. \n", | |
" * This is necessary, because unlike an ordinary function successive calls to a generator function don't start execution at the beginning of the function. \n", | |
" * Instead, the new call to a generator function will resume execution right after the yield statement in the code, where the last call exited. In other words: When the Python interpreter finds a yield statement inside of an iterator generated by a generator, it records the position of this statement and the local variables, and returns from the iterator. \n", | |
" * The next time this iterator is called, it will resume execution at the line following the previous yield statement.\n", | |
" * There may be more than one yield statement in the code of a generator or the yield statement might be inside the body of a loop. \n", | |
" * If there is a return statement in the code of a generator, the execution will stop with a StopIteration exception error if this code is executed by the Python interpreter. \n", | |
" * Everything what can be done with a generator can be implemented with a class based iterator as well. But the crucial advantage of generators consists in automatically creating the methods `__iter__()` and `next()`.\n", | |
" * Generators provide a very neat way of producing data which is huge or infinite.\n", | |
" * The following is a simple example of a generator, which is capable of producing four city names:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"def city_generator():\n", | |
" yield(\"Konstanz\")\n", | |
" yield(\"Zurich\")\n", | |
" yield(\"Schaffhausen\")\n", | |
" yield(\"Stuttgart\")" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 5 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"from city_generator import city_generator\n", | |
"x = city_generator()" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"ename": "ImportError", | |
"evalue": "No module named city_generator", | |
"output_type": "pyerr", | |
"traceback": [ | |
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mImportError\u001b[0m Traceback (most recent call last)", | |
"\u001b[0;32m<ipython-input-14-62d2b8802263>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mfrom\u001b[0m \u001b[0mcity_generator\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mcity_generator\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcity_generator\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", | |
"\u001b[0;31mImportError\u001b[0m: No module named city_generator" | |
] | |
} | |
], | |
"prompt_number": 14 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"*As far as I can guess, the above example is throwing an `ImportError` because I did not save the `city_generator()` function as a file that can be imported.*" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"*Yes, that very much is the reason. I tried the same example on `terminal` and by saving the `func` as a file. It worked. I am pasting the teminal output here for reference.*" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"cd /home/gls/Pictures/" | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"stream": "stdout", | |
"text": [ | |
"/home/gls/Pictures\n" | |
] | |
} | |
], | |
"prompt_number": 16 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"from IPython.display import Image\n", | |
"Image(filename='Screenshot from 2014-12-30 17:26:07.png') " | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"metadata": {}, | |
"output_type": "pyout", | |
"png": "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\nAAAQ57/BHcPh2txgBQAAAABJRU5ErkJggg==\n", | |
"prompt_number": 18, | |
"text": [ | |
"<IPython.core.display.Image at 0xb1fe4cac>" | |
] | |
} | |
], | |
"prompt_number": 18 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"* As we can see, we have generated an iterator x in the interactive shell. Every call of the method next() returns another city. After the last city, i.e. Stuttgart, has been created, another call of next(x) raises an error, saying that the iteration has stopped, i.e. \"StopIteration\". \n", | |
"* Thought at first sight the yield statement looks like the return statement of a function, we can see in this example, that there is a big difference. If we had a return statement instead of a yield in the previous example, it would be a function. But this function would always return \"Konstanz\" and never any of the other cities, i.e. Zurich, Schaffhausen or Stuttgart. " | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"> The Fibonacci sequence is named after Leonardo of Pisa, who was known as Fibonacci (a contraction of filius Bonacci, \"son of Bonaccio\"). In his textbook Liber Abaci, which appeared in the year 1202) he had an exercise about the rabbits and their breeding: It starts with a newly-born pair of rabbits, i.e. a male and a female animal. It takes one month until they can mate. At the end of the second month the female gives birth to a new pair of rabbits. Now let's suppose that every female rabbit will bring forth another pair of rabbits every month after the end of the first month. We have to mention, that Fibonacci's rabbits never die. They question is how large the population will be after a certain period of time.\n", | |
"\n", | |
"> This produces a sequence of numbers: 0,1,1,2,3,5,8,13\n", | |
"\n", | |
"> This sequence can be defined in mathematical terms like this:\n", | |
"\n", | |
"> Fn = Fn - 1 + Fn - 2\n", | |
"> with the seed values:\n", | |
"> F0 = 0 and F1 = 1 " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"def fibonacci(n):\n", | |
" \"\"\"Ein Fibonacci-Zahlen-Generator\"\"\"\n", | |
" a,b,counter = 0,1,0\n", | |
" while True:\n", | |
" if (counter > n):\n", | |
" return\n", | |
" yield a\n", | |
" a,b = b,a+b\n", | |
" counter += 1\n", | |
"f = fibonacci(5) " | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [], | |
"prompt_number": 19 | |
}, | |
{ | |
"cell_type": "code", | |
"collapsed": false, | |
"input": [ | |
"for x in f:\n", | |
" # no linefeed is enforced by end=\"\":\n", | |
" print(x, \" \", end=\"\")\n", | |
"print() " | |
], | |
"language": "python", | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"ename": "SyntaxError", | |
"evalue": "invalid syntax (<ipython-input-23-d64bd0ccdf4c>, line 3)", | |
"output_type": "pyerr", | |
"traceback": [ | |
"\u001b[0;36m File \u001b[0;32m\"<ipython-input-23-d64bd0ccdf4c>\"\u001b[0;36m, line \u001b[0;32m3\u001b[0m\n\u001b[0;31m print(x, \" \", end=\"\")\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" | |
] | |
} | |
], | |
"prompt_number": 23 | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"*Got a problem. I am not clear with this and cannot move forward without knowing why this happened.*" | |
] | |
}, | |
{ | |
"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