From 8c5459e5c9462a6dc86b2efb2f9194af5b35c9f4 Mon Sep 17 00:00:00 2001 From: Josh McCullough Date: Mon, 24 Aug 2015 11:44:51 -0400 Subject: [PATCH 001/105] Edits to for/else. --- for_-_else.rst | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/for_-_else.rst b/for_-_else.rst index da01bf6..96a1cdf 100644 --- a/for_-_else.rst +++ b/for_-_else.rst @@ -1,12 +1,11 @@ -For - Else +``for/else`` ---------- Loops are an integral part of any language. Likewise ``for`` loops are an important part of Python. However there are a few things which most -beginners do not know about them. We will discuss a few of them one by -one. +beginners do not know about them. We will discuss a few of them one-by-one. -Let's first start of by what we know. We know that we can use for loops +Let's first start off with what we know. We know that we can use ``for`` loops like this: .. code:: python @@ -19,24 +18,24 @@ like this: # Banana # Mango -That is the very basic structure of a for loop. Now let's move on to +That is the very basic structure of a ``for`` loop. Now let's move on to some of the lesser known features of ``for`` loops in Python. -``else`` clause: +``else`` Clause ^^^^^^^^^^^^^^^^^^^^ -For loops also have an ``else`` clause which most of us are unfamiliar -with. The ``else`` clause executes when the loop completes normally. -This means that the loop did not encounter any ``break``. They are -really useful once you understand where to use them. I myself came to +``for`` loops also have an ``else`` clause which most of us are unfamiliar +with. The ``else`` clause executes after the loop completes normally. +This means that the loop did not encounter a ``break`` statement. They are +really useful once you understand where to use them. I, myself, came to know about them a lot later. The common construct is to run a loop and search for an item. If the -item is found, we break the loop using ``break``. There are two +item is found, we break out of the loop using the ``break`` statement. There are two scenarios in which the loop may end. The first one is when the item is found and ``break`` is encountered. The second scenario is that the loop -ends. Now we may want to know which one of these is the reason for a -loops completion. One method is to set a flag and then check it once the +ends without encountering a ``break` statement. Now we may want to know which one of these is the reason for a +loop's completion. One method is to set a flag and then check it once the loop ends. Another is to use the ``else`` clause. This is the basic structure of a ``for/else`` loop: @@ -64,8 +63,7 @@ documentation: break It finds factors for numbers between 2 to 10. Now for the fun part. We -can add an additional ``else`` block which catches the numbers which are -prime and tells us so: +can add an additional ``else`` block which catches the numbers which have no factors and are therefore prime numbers: .. code:: python From c2b5e709c8125aeaaffc5ea8b62a427fe139b8ef Mon Sep 17 00:00:00 2001 From: Benjamin Bishop Date: Tue, 22 Mar 2016 10:10:12 -0400 Subject: [PATCH 002/105] Update python_c_extension.rst Method arguments were not in correct order, line 324. --- python_c_extension.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_c_extension.rst b/python_c_extension.rst index f54ba73..c5deeb6 100644 --- a/python_c_extension.rst +++ b/python_c_extension.rst @@ -321,7 +321,7 @@ and a python list in that order, the function signature would be int n; char *s; PyObject* list; - PyArg_ParseTuple(args, "siO", &n, &s, &list); + PyArg_ParseTuple(args, "siO", &s, &n, &list); In this case we only have to extract a list object, and store it in the variable ``listObj``. We then use the ``PyList_Size()`` function on our From 3bc7fbe447699c12a365185ecec5f590152dae95 Mon Sep 17 00:00:00 2001 From: Paul Longtine Date: Wed, 30 Mar 2016 19:56:40 -0400 Subject: [PATCH 003/105] Double equals means equality. name == yasoob is false. --- args_and_kwargs.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/args_and_kwargs.rst b/args_and_kwargs.rst index 332ff2f..544742e 100644 --- a/args_and_kwargs.rst +++ b/args_and_kwargs.rst @@ -51,10 +51,10 @@ arguments** in a function. Here is an example to get you going with it: def greet_me(**kwargs): for key, value in kwargs.items(): - print("{0} == {1}".format(key, value)) + print("{0} = {1}".format(key, value)) >>> greet_me(name="yasoob") - name == yasoob + name = yasoob So you can see how we handled a keyworded argument list in our function. This is just the basics of \*\*kwargs and you can see how useful it is. From 9627cf08ee7c460cfd64f2297c001f7e89294291 Mon Sep 17 00:00:00 2001 From: Pavel Karateev Date: Fri, 5 Aug 2016 10:36:42 +0300 Subject: [PATCH 004/105] Fixes #132, typo in the super() call --- decorators.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/decorators.rst b/decorators.rst index 16e35b7..7bf2609 100644 --- a/decorators.rst +++ b/decorators.rst @@ -429,7 +429,7 @@ will not be covered here). ''' def __init__(self, email='admin@myproject.com', *args, **kwargs): self.email = email - super(logit, self).__init__(*args, **kwargs) + super(email_logit, self).__init__(*args, **kwargs) def notify(self): # Send an email to self.email From d858682d481a41169285086e1e1cc89342fd5c34 Mon Sep 17 00:00:00 2001 From: Akul Mehra Date: Sun, 14 Aug 2016 12:32:39 +0530 Subject: [PATCH 005/105] format dict to highlight on line 34 one_liners.rst ``dict``s to ``dict`` s --- one_liners.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/one_liners.rst b/one_liners.rst index e384bcb..1914ea6 100644 --- a/one_liners.rst +++ b/one_liners.rst @@ -31,7 +31,7 @@ repl. Here is the relevant code: my_dict = {'name': 'Yasoob', 'age': 'undefined', 'personality': 'awesome'} pprint(my_dict) -This is more effective on ``dict``s. Moreover, if you want to pretty print +This is more effective on ``dict`` s. Moreover, if you want to pretty print json quickly from a file then you can simply do: .. code:: python From 578d19bd72e40d658acc2cc45cb84a2968c5d181 Mon Sep 17 00:00:00 2001 From: Kiseok Kim Date: Tue, 18 Oct 2016 14:14:02 +0900 Subject: [PATCH 006/105] fixed pep8 error. --- map_filter.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/map_filter.rst b/map_filter.rst index c2a6834..f0add19 100644 --- a/map_filter.rst +++ b/map_filter.rst @@ -101,6 +101,6 @@ Now let's try it with reduce: .. code:: python from functools import reduce - product = reduce( (lambda x, y: x * y), [1, 2, 3, 4] ) + product = reduce((lambda x, y: x * y), [1, 2, 3, 4]) # Output: 24 From 873e7a38d66db672c22856149c6d25f6f47f3334 Mon Sep 17 00:00:00 2001 From: Kiseok Kim Date: Tue, 25 Oct 2016 15:24:27 +0900 Subject: [PATCH 007/105] fixed comparison operator. "is" to "==" --- comprehensions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/comprehensions.rst b/comprehensions.rst index b83285a..43af9cd 100644 --- a/comprehensions.rst +++ b/comprehensions.rst @@ -33,7 +33,7 @@ Here is a short example: .. code:: python - multiples = [i for i in range(30) if i % 3 is 0] + multiples = [i for i in range(30) if i % 3 == 0] print(multiples) # Output: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27] From 6ce0d78f0dec04fd7cb2a271f684585d368969a6 Mon Sep 17 00:00:00 2001 From: Blithe Brandon Date: Fri, 13 Jan 2017 17:27:23 -0800 Subject: [PATCH 008/105] Make Reduce "normal way" loop code visible Code section was being omitted, due to missing blank line after ".. code:: python" --- map_filter.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/map_filter.rst b/map_filter.rst index f0add19..5e19258 100644 --- a/map_filter.rst +++ b/map_filter.rst @@ -88,6 +88,7 @@ a basic for loop: .. code:: python + product = 1 list = [1, 2, 3, 4] for num in list: From 3f81cc2261fdd538817b6e67c775889ccc78c866 Mon Sep 17 00:00:00 2001 From: inv3nt3d Date: Mon, 30 Jan 2017 22:46:46 -0500 Subject: [PATCH 009/105] Add print On line 169 print() is called on next(my_iter) so the output 'Y' is visible on the console. --- generators.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators.rst b/generators.rst index c0a4d70..f65afae 100644 --- a/generators.rst +++ b/generators.rst @@ -166,7 +166,7 @@ iterable. While an ``int`` isn't an iterable, we can use it on string! my_string = "Yasoob" my_iter = iter(my_string) - next(my_iter) + print(next(my_iter)) # Output: 'Y' Now that is much better. I am sure that you loved learning about From 3f86901754f3013634174e37579b01dcbe7d8fc2 Mon Sep 17 00:00:00 2001 From: Amine SEHILI Date: Sun, 5 Feb 2017 13:38:57 +0100 Subject: [PATCH 010/105] Add `OrderedDict` to collections.rst --- collections.rst | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/collections.rst b/collections.rst index 81f12fb..c09a3bf 100644 --- a/collections.rst +++ b/collections.rst @@ -8,6 +8,7 @@ their usefulness. The ones which we will talk about are: - ``defaultdict`` +- ``OrderedDict`` - ``counter`` - ``deque`` - ``namedtuple`` @@ -82,6 +83,42 @@ sample code: print(json.dumps(some_dict)) # Output: {"colours": {"favourite": "yellow"}} +``OrderedDict`` +^^^^^^^^^^^^^^^^^^^ + +``OrderedDict`` keeps its entries sorted as they are initially inserted. +Overwriting a value of an existing key doesn't change the position of +that key. However, deleting and reinserting an entry moves the key to +the end of the dictionary. + +**Problem:** + +.. code:: python + + colours = {"Red" : 198, "Green" : 170, "Blue" : 160} + for key, value in colours.items(): + print(key, value) + # Output: + # Green 170 + # Blue 160 + # Red 198 + # Entries are retrieved in an unpredictable order + +**Solution:** + +.. code:: python + + from collections import OrderedDict + + colours = OrderedDict([("Red", 198), ("Green", 170), ("Blue", 160)]) + for key, value in colours.items(): + print(key, value) + # Output: + # Red 198 + # Green 170 + # Blue 160 + # Insertion order is preserved + ``counter`` ^^^^^^^^^^^^^^^ From 10bac564cbdd947bdbae843f479b5b58a599743a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Ara=C3=BAjo=20Miranda?= Date: Thu, 30 Mar 2017 05:57:53 -0300 Subject: [PATCH 011/105] Reworded optional argument explanation --- enumerate.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/enumerate.rst b/enumerate.rst index a087c94..06719f0 100644 --- a/enumerate.rst +++ b/enumerate.rst @@ -11,8 +11,8 @@ something and have an automatic counter. Here is an example: for counter, value in enumerate(some_list): print(counter, value) -This is not it. ``enumerate`` also accepts some optional arguments which -make it even more useful. +And there is more! ``enumerate`` also accepts an optional argument which +makes it even more useful. .. code:: python From a60a7431f97e32f4f0c68d66649c28b73f2e0bb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2EYasoob=20Ullah=20Khalid=20=E2=98=BA?= Date: Sat, 22 Apr 2017 14:38:26 +0500 Subject: [PATCH 012/105] It's 2017 :sparkles: --- conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf.py b/conf.py index 7184904..b264a66 100644 --- a/conf.py +++ b/conf.py @@ -42,7 +42,7 @@ # General information about the project. project = u'Python Tips' -copyright = u'2015, Muhammad Yasoob Ullah Khalid' +copyright = u'2017, Muhammad Yasoob Ullah Khalid' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the From 9367c9f6a13f7885c5bfa823fed45f0120284c98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2EYasoob=20Ullah=20Khalid=20=E2=98=BA?= Date: Sat, 22 Apr 2017 14:40:11 +0500 Subject: [PATCH 013/105] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index bdeac01..8a199e9 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,7 @@ If you want to translate this book in any other language then kindly let [me kno - [Chinese](https://github.com/eastlakeside/interpy-zh) - [Russian](https://github.com/lancelote/interpy-ru) +- [Korean](https://github.com/DDanggle/interpy-kr) License: ------- From 5f61e818effd4065d06097b450eb764e55def97a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2EYasoob=20Ullah=20Khalid=20=E2=98=BA?= Date: Sat, 22 Apr 2017 14:42:13 +0500 Subject: [PATCH 014/105] :sparkles: Portuguese --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 8a199e9..2783670 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,7 @@ If you want to translate this book in any other language then kindly let [me kno - [Chinese](https://github.com/eastlakeside/interpy-zh) - [Russian](https://github.com/lancelote/interpy-ru) - [Korean](https://github.com/DDanggle/interpy-kr) +- [Portuguese](https://github.com/joanasouza/intermediatePython) License: ------- From 00a2868d67e297b24e28984b97068acf9e2a84d3 Mon Sep 17 00:00:00 2001 From: GraemeBrown Date: Fri, 2 Jun 2017 10:49:36 -0700 Subject: [PATCH 015/105] Update map_filter.rst Provided an explanation of what map() is actually doing. --- map_filter.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/map_filter.rst b/map_filter.rst index f0add19..41e6f65 100644 --- a/map_filter.rst +++ b/map_filter.rst @@ -80,8 +80,9 @@ Reduce ^^^^^^^^^ ``Reduce`` is a really useful function for performing some computation on -a list and returning the result. For example, if you wanted to compute -the product of a list of integers. +a list and returning the result. It applies a rolling computation to sequential +pairs of values in a list. For example, if you wanted to compute the product +of a list of integers. So the normal way you might go about doing this task in python is using a basic for loop: From a798ad08eba94ebc9f109fec0a649a80739da69a Mon Sep 17 00:00:00 2001 From: David Awad Date: Mon, 19 Jun 2017 11:06:22 -0400 Subject: [PATCH 016/105] add newline for code block fix rendering issue for map_filter pre_reduce example --- map_filter.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/map_filter.rst b/map_filter.rst index 41e6f65..9552cf8 100644 --- a/map_filter.rst +++ b/map_filter.rst @@ -87,8 +87,8 @@ of a list of integers. So the normal way you might go about doing this task in python is using a basic for loop: - .. code:: python + product = 1 list = [1, 2, 3, 4] for num in list: From 908b6e1ec623b5c1fedc9d8ead3674181a7412e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2EYasoob=20Ullah=20Khalid=20=E2=98=BA?= Date: Tue, 14 Nov 2017 00:18:52 -0500 Subject: [PATCH 017/105] Added Codesponsor --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 2783670..dd7e703 100644 --- a/README.md +++ b/README.md @@ -98,3 +98,7 @@ License: This book is released under the [following](http://creativecommons.org/licenses/by-nc-sa/4.0/) CC license (CC BY-NC-SA 4.0). If you end up using/recommending this book to someone then kindly [let me know](mailto:yasoob.khld@gmail.com). :smile: + + + Sponsor + From 3ffcddbec5d50d72605f28829e14e2ca630c5513 Mon Sep 17 00:00:00 2001 From: yasoob Date: Tue, 14 Nov 2017 10:04:32 -0500 Subject: [PATCH 018/105] Added media.net --- _static/js/ad.js | 7 +++++++ conf.py | 10 +++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 _static/js/ad.js diff --git a/_static/js/ad.js b/_static/js/ad.js new file mode 100644 index 0000000..e6ad1df --- /dev/null +++ b/_static/js/ad.js @@ -0,0 +1,7 @@ + + diff --git a/conf.py b/conf.py index b264a66..1229c4a 100644 --- a/conf.py +++ b/conf.py @@ -217,7 +217,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - ('index', 'pythontips', u'Python Tips Documentation', + ('index', 'pythontips', u'Python Tips', [u'Muhammad Yasoob Ullah Khalid'], 1) ] @@ -231,7 +231,7 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - ('index', 'PythonTips', u'Python Tips Documentation', + ('index', 'PythonTips', u'Python Tips', u'Muhammad Yasoob Ullah Khalid', 'PythonTips', 'One line description of project.', 'Miscellaneous'), ] @@ -255,7 +255,7 @@ epub_title = u'Python Tips' epub_author = u'Muhammad Yasoob Ullah Khalid' epub_publisher = u'Muhammad Yasoob Ullah Khalid' -epub_copyright = u'2015, Muhammad Yasoob Ullah Khalid' +epub_copyright = u'2017, Muhammad Yasoob Ullah Khalid' #epub_theme = 'epub' @@ -313,3 +313,7 @@ #html_theme_path = ['_themes'] html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] html_theme = 'sphinx_rtd_theme' + + +def setup(app): + app.add_javascript("js/ad.js") From a51af2e22a5a99c8e74f7dd41a6e3b3816d868da Mon Sep 17 00:00:00 2001 From: yasoob Date: Tue, 14 Nov 2017 10:09:40 -0500 Subject: [PATCH 019/105] corrected media.net inclusion --- _static/js/ad.js | 7 ------- _templates/layout.html | 11 +++++++++++ conf.py | 2 -- 3 files changed, 11 insertions(+), 9 deletions(-) delete mode 100644 _static/js/ad.js create mode 100644 _templates/layout.html diff --git a/_static/js/ad.js b/_static/js/ad.js deleted file mode 100644 index e6ad1df..0000000 --- a/_static/js/ad.js +++ /dev/null @@ -1,7 +0,0 @@ - - diff --git a/_templates/layout.html b/_templates/layout.html new file mode 100644 index 0000000..974cfa9 --- /dev/null +++ b/_templates/layout.html @@ -0,0 +1,11 @@ +{% extends "!layout.html" %} +{% block extrahead %} + + + +{% endblock %} \ No newline at end of file diff --git a/conf.py b/conf.py index 1229c4a..04b64ff 100644 --- a/conf.py +++ b/conf.py @@ -315,5 +315,3 @@ html_theme = 'sphinx_rtd_theme' -def setup(app): - app.add_javascript("js/ad.js") From dcb69704451b0e06bd2b184587b8775d820f6f46 Mon Sep 17 00:00:00 2001 From: yasoob Date: Tue, 14 Nov 2017 10:20:52 -0500 Subject: [PATCH 020/105] improved ad display --- _static/custom.css | 6 ++++++ conf.py | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 _static/custom.css diff --git a/_static/custom.css b/_static/custom.css new file mode 100644 index 0000000..bcdeef2 --- /dev/null +++ b/_static/custom.css @@ -0,0 +1,6 @@ + +@media screen and (min-width: 1000px){ + iframe{ + margin-left: 330px; + } +} \ No newline at end of file diff --git a/conf.py b/conf.py index 04b64ff..19808a0 100644 --- a/conf.py +++ b/conf.py @@ -314,4 +314,5 @@ html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] html_theme = 'sphinx_rtd_theme' - +def setup(app): + app.add_stylesheet('custom.css') From afba29a935956904252dbb10bcdcc97f12dbb6d7 Mon Sep 17 00:00:00 2001 From: yasoob Date: Mon, 27 Nov 2017 12:59:55 -0500 Subject: [PATCH 021/105] updated ad code --- _templates/layout.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_templates/layout.html b/_templates/layout.html index 974cfa9..2f86c0c 100644 --- a/_templates/layout.html +++ b/_templates/layout.html @@ -1,5 +1,5 @@ {% extends "!layout.html" %} -{% block extrahead %} +{% block extrabody %} + + + + + {% if (theme_prev_next_buttons_location == 'top' or theme_prev_next_buttons_location == 'both') and (next or prev) %} + + {% endif %} +
+ diff --git a/_templates/layout.html b/_templates/layout.html deleted file mode 100644 index d70e38e..0000000 --- a/_templates/layout.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends "!layout.html" %} -{% block body %} - - - -{% endblock %} \ No newline at end of file From ed378360a98d4b8b3ecc99685ed6fe7a019e3df4 Mon Sep 17 00:00:00 2001 From: yasoob Date: Mon, 27 Nov 2017 13:32:54 -0500 Subject: [PATCH 024/105] removed custom.css --- conf.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/conf.py b/conf.py index 19808a0..1de0eaa 100644 --- a/conf.py +++ b/conf.py @@ -314,5 +314,3 @@ html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] html_theme = 'sphinx_rtd_theme' -def setup(app): - app.add_stylesheet('custom.css') From ad41713011f3ff491d2adde2e0939d3060fa7e70 Mon Sep 17 00:00:00 2001 From: yasoob Date: Fri, 1 Dec 2017 03:04:16 -0500 Subject: [PATCH 025/105] got rid of ads and added a note about internship --- _templates/breadcrumbs.html | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index 9661184..b07b4ad 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -26,13 +26,11 @@
- - +
+

Note

+

Hi! I am currently looking for internships for Summer 2018. If you feel like your company might have some place for me, please reach out. You can check my resume over here and if you want to get to know about my journey, you can read this article: How I got into programming

. + +
    {% block breadcrumbs %} From 79fcea3aecb7eda6033de67c488cb3061236cb99 Mon Sep 17 00:00:00 2001 From: yasoob Date: Fri, 1 Dec 2017 03:14:34 -0500 Subject: [PATCH 026/105] updated links to add google analytics --- _templates/breadcrumbs.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index b07b4ad..502acda 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -28,7 +28,7 @@

    Note

    -

    Hi! I am currently looking for internships for Summer 2018. If you feel like your company might have some place for me, please reach out. You can check my resume over here and if you want to get to know about my journey, you can read this article: How I got into programming

    . +

    Hi! I am currently looking for internships for Summer 2018. If you feel like your company might have some place for me, please reach out. You can check my resume over here and if you want to get to know about my journey, you can read this article: How I got into programming

    .
    From d6862810903649f4b75097ba30c2d857bfae98c3 Mon Sep 17 00:00:00 2001 From: Pavel Karateev Date: Tue, 5 Dec 2017 09:25:14 +0300 Subject: [PATCH 027/105] Fixes "source" command invocation example A little bit more precise this way --- virtual_environment.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/virtual_environment.rst b/virtual_environment.rst index 58746ce..28b119f 100644 --- a/virtual_environment.rst +++ b/virtual_environment.rst @@ -32,7 +32,7 @@ To install it, just type this command in the shell: The most important commands are: - ``$ virtualenv myproject`` -- ``$ source bin/activate`` +- ``$ source myproject/bin/activate`` This first one makes an isolated virtualenv environment in the ``myproject`` folder and the second command activates that isolated From beb15c1ac9b4554de9f372a026f568528c029a6b Mon Sep 17 00:00:00 2001 From: Sudip Bhandari Date: Fri, 15 Dec 2017 13:03:37 +0530 Subject: [PATCH 028/105] more info on encoding and utf-8 --- open_function.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/open_function.rst b/open_function.rst index 8281b2f..3683bb3 100644 --- a/open_function.rst +++ b/open_function.rst @@ -69,8 +69,8 @@ and does the right thing. You can pass in the encoding with the Python -- specific default will be picked. You may be tempted to rely on these defaults, but the defaults are often wrong, or the default encoding cannot actually express all characters in the file (this will happen often on -Python 2.x and/or Windows). So go ahead and pick an encoding. ``utf-8`` -is a terrific one. When you write a file, you can just pick the encoding +Python 2.x and/or Windows). So go ahead and pick an encoding. Encoding is the way to instruct computers about how the numbers should be stored as bytes in memory. ``utf-8`` +is a terrific one and is supported by major browsers and programming languages. When you write a file, you can just pick the encoding to your liking (or the liking of the program that will eventually read your file). From 84cb6577f1dd08f92f7604b1e688fc2abf423500 Mon Sep 17 00:00:00 2001 From: KarlSebaL Date: Fri, 29 Dec 2017 18:46:16 +0100 Subject: [PATCH 029/105] Update python_c_extension.rst Should be all long since you compare to long and add to long:) --- python_c_extension.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_c_extension.rst b/python_c_extension.rst index 5cea2e2..204c07c 100644 --- a/python_c_extension.rst +++ b/python_c_extension.rst @@ -252,7 +252,7 @@ file, it's pretty straight forward. long length = PyList_Size(listObj); //iterate over all the elements - int i, sum =0; + long i, sum =0; for(i = 0; i < length; i++){ //get an element out of the list - the element is also a python objects PyObject* temp = PyList_GetItem(listObj, i); From 64774bc0391b4622bc8c9357cc90d84739cd7e9c Mon Sep 17 00:00:00 2001 From: knewzen <772608204@qq.com> Date: Fri, 5 Jan 2018 00:55:59 +0800 Subject: [PATCH 030/105] remove codesponsor --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index dd7e703..6d1284b 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,4 @@ This book is released under the [following](http://creativecommons.org/licenses/ If you end up using/recommending this book to someone then kindly [let me know](mailto:yasoob.khld@gmail.com). :smile: - - Sponsor - + From 75d7140908446cefb651183d87422a600dfdadd7 Mon Sep 17 00:00:00 2001 From: yasoob Date: Fri, 19 Jan 2018 02:36:40 +0500 Subject: [PATCH 031/105] freelancing --- _templates/breadcrumbs.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index 502acda..6657860 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -28,7 +28,7 @@

    Note

    -

    Hi! I am currently looking for internships for Summer 2018. If you feel like your company might have some place for me, please reach out. You can check my resume over here and if you want to get to know about my journey, you can read this article: How I got into programming

    . +

    Hi! I am currently looking for some freelance projects. If you have a project idea in mind please feel free to send me an email or check out my personal website. If you want to get to know about my journey, you can read this article: How I got into programming

    .
    From 9410a38e790feb14314d65017866aff6a27e681c Mon Sep 17 00:00:00 2001 From: Victor Shih Date: Mon, 21 May 2018 09:43:45 -0700 Subject: [PATCH 032/105] Grammar. --- context_managers.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/context_managers.rst b/context_managers.rst index f3ff506..e70a3f7 100644 --- a/context_managers.rst +++ b/context_managers.rst @@ -100,7 +100,7 @@ an error is encountered. 2. It allows the ``__exit__`` method to handle the exception. 3. If ``__exit__`` returns True then the exception was gracefully handled. -4. If anything else than True is returned by the ``__exit__`` method then +4. If anything other than True is returned by the ``__exit__`` method then an exception is raised by the ``with`` statement. In our case the ``__exit__`` method returns ``None`` (when no return From 6748a9cd1bcbd2c7896466914d2fdfb2c89e6d3c Mon Sep 17 00:00:00 2001 From: Andrii Galkin Date: Tue, 29 May 2018 12:37:40 -0700 Subject: [PATCH 033/105] Update comprehensions.rst Added explanation of generator comprehensions --- comprehensions.rst | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/comprehensions.rst b/comprehensions.rst index 43af9cd..2c09aca 100644 --- a/comprehensions.rst +++ b/comprehensions.rst @@ -9,6 +9,7 @@ comprehensions are supported in both Python 2 and Python 3: - list comprehensions - dictionary comprehensions - set comprehensions +- generator comprehensions We will discuss them one by one. Once you get the hang of using ``list`` comprehensions then you can use any of them easily. @@ -91,3 +92,17 @@ that they use braces ``{}``. Here is an example: squared = {x**2 for x in [1, 1, 2]} print(squared) # Output: {1, 4} + +``generator`` comprehensions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +They are also similar to list comprehensions. The only difference is that they don't allocate memory for the whole list but generate one item at a time, thus more memory effecient. + +.. code:: python + + multiples_gen = (i for i in range(30) if i % 3 == 0) + print(multiples_gen) + # Output: at 0x7fdaa8e407d8> + for x in multiples_gen: + print(x) + # Outputs numbers From 60362325e3517232c9dcd3160137c3ef006110c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2EYasoob=20Ullah=20Khalid=20=E2=98=BA?= Date: Tue, 29 May 2018 17:01:31 -0400 Subject: [PATCH 034/105] Closes #76 --- lambdas.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lambdas.rst b/lambdas.rst index 1223dca..73328b8 100644 --- a/lambdas.rst +++ b/lambdas.rst @@ -21,7 +21,7 @@ normal functions and even behave like them. print(add(3, 5)) # Output: 8 -Here are a few useful use cases for lambdas and just a few way in which +Here are a few useful use cases for lambdas and just a few ways in which they are used in the wild: **List sorting** From 47de9c20acae0611805984f35874bbe6c5dffa8a Mon Sep 17 00:00:00 2001 From: yasoob Date: Tue, 29 May 2018 17:09:31 -0400 Subject: [PATCH 035/105] closes #88 Thanks @JoshMcCullough --- context_managers.rst | 65 ++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/context_managers.rst b/context_managers.rst index e70a3f7..45d6eb4 100644 --- a/context_managers.rst +++ b/context_managers.rst @@ -1,4 +1,4 @@ -Context managers +Context Managers ---------------- Context managers allow you to allocate and release resources precisely @@ -30,16 +30,16 @@ advantage of using a ``with`` statement is that it makes sure our file is closed without paying attention to how the nested block exits. A common use case of context managers is locking and unlocking resources -and closing opened files (as I have already showed you). +and closing opened files (as I have already shown you). -Let's see how we can implement our own Context Manager. This would allow +Let's see how we can implement our own Context Manager. This should allow us to understand exactly what's going on behind the scenes. -Implementing Context Manager as a Class: +Implementing a Context Manager as a Class: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ At the very least a context manager has an ``__enter__`` and -``__exit__`` methods defined. Let's make our own file opening Context +``__exit__`` method defined. Let's make our own file-opening Context Manager and learn the basics. .. code:: python @@ -52,7 +52,7 @@ Manager and learn the basics. def __exit__(self, type, value, traceback): self.file_obj.close() -Just by defining ``__enter__`` and ``__exit__`` methods we can use it in +Just by defining ``__enter__`` and ``__exit__`` methods we can use our new class in a ``with`` statement. Let's try: .. code:: python @@ -60,20 +60,20 @@ a ``with`` statement. Let's try: with File('demo.txt', 'w') as opened_file: opened_file.write('Hola!') -Our ``__exit__`` function accepts three arguments. They are required by +Our ``__exit__`` method accepts three arguments. They are required by every ``__exit__`` method which is a part of a Context Manager class. Let's talk about what happens under-the-hood. -1. The ``with`` statement stores the ``__exit__`` method of ``File`` +1. The ``with`` statement stores the ``__exit__`` method of the ``File`` class. -2. It calls the ``__enter__`` method of ``File`` class. -3. ``__enter__`` method opens the file and returns it. -4. the opened file handle is passed to ``opened_file``. -5. we write to the file using ``.write()`` -6. ``with`` statement calls the stored ``__exit__`` method. -7. the ``__exit__`` method closes the file. - -Handling exceptions +2. It calls the ``__enter__`` method of the ``File`` class. +3. The ``__enter__`` method opens the file and returns it. +4. The opened file handle is passed to ``opened_file``. +5. We write to the file using ``.write()``. +6. The ``with`` statement calls the stored ``__exit__`` method. +7. The ``__exit__`` method closes the file. + +Handling Exceptions ^^^^^^^^^^^^^^^^^^^ We did not talk about the ``type``, ``value`` and ``traceback`` @@ -92,20 +92,20 @@ instance: with File('demo.txt', 'w') as opened_file: opened_file.undefined_function('Hola!') -Let's list down the steps which are taken by the ``with`` statement when -an error is encountered. +Let's list the steps which are taken by the ``with`` statement when +an error is encountered: 1. It passes the type, value and traceback of the error to the ``__exit__`` method. 2. It allows the ``__exit__`` method to handle the exception. -3. If ``__exit__`` returns True then the exception was gracefully +3. If ``__exit__`` returns ``True`` then the exception was gracefully handled. -4. If anything other than True is returned by the ``__exit__`` method then - an exception is raised by the ``with`` statement. +4. If anything other than ``True`` is returned by the ``__exit__`` method then + the exception is raised by the ``with`` statement. In our case the ``__exit__`` method returns ``None`` (when no return -statement is encountered then the method returns ``None``). Therefore, the -``with`` statement raises the exception. +statement is encountered then the method returns ``None``). Therefore, +the ``with`` statement raises the exception: .. code:: python @@ -132,11 +132,11 @@ Let's try handling the exception in the ``__exit__`` method: # Output: Exception has been handled -Our ``__exit__`` method returned True, therefore no exception was raised +Our ``__exit__`` method returned ``True``, therefore no exception was raised by the ``with`` statement. -This is not the only way to implement context managers. There is another -way and we will be looking at it in this next section. +This is not the only way to implement Context Managers. There is another +way and we will be looking at it in the next section. Implementing a Context Manager as a Generator ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -156,9 +156,9 @@ Let's see a basic, useless example: yield f f.close() -Okay! This way of implementing Context Managers appears to be more +Okay! This way of implementing Context Managers appear to be more intuitive and easy. However, this method requires some knowledge about -generators, yield, and decorators. In this example we have not caught any +generators, yield and decorators. In this example we have not caught any exceptions which might occur. It works in mostly the same way as the previous method. @@ -167,11 +167,11 @@ Let's dissect this method a little. 1. Python encounters the ``yield`` keyword. Due to this it creates a generator instead of a normal function. 2. Due to the decoration, contextmanager is called with the function - name (open\_file) as it's argument. -3. The ``contextmanager`` function returns the generator wrapped by the + name (``open\_file``) as it's argument. +3. The ``contextmanager`` decorator returns the generator wrapped by the ``GeneratorContextManager`` object. 4. The ``GeneratorContextManager`` is assigned to the ``open_file`` - function. Therefore, when we later call ``open_file`` function, we + function. Therefore, when we later call the ``open_file`` function, we are actually calling the ``GeneratorContextManager`` object. So now that we know all this, we can use the newly generated Context @@ -180,5 +180,4 @@ Manager like this: .. code:: python with open_file('some_file') as f: - f.write('hola!') - + f.write('hola!') \ No newline at end of file From cea338fbe42aeb03555038c802e6c96fe4ca9bd8 Mon Sep 17 00:00:00 2001 From: yasoob Date: Tue, 29 May 2018 17:12:07 -0400 Subject: [PATCH 036/105] Closes #161 --- exceptions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exceptions.rst b/exceptions.rst index cbe752e..2b29381 100644 --- a/exceptions.rst +++ b/exceptions.rst @@ -111,7 +111,7 @@ example: print('This would be printed in every case.') # Output: I am sure no exception is going to occur! - # This would only run if no exception occurs. + # This would only run if no exception occurs. And an error here would NOT be caught # This would be printed in every case. The ``else`` clause would only run if no exception occurs and it would run From 13458e72e0e9281202fb1881c482319532b8bc03 Mon Sep 17 00:00:00 2001 From: yasoob Date: Tue, 29 May 2018 17:15:17 -0400 Subject: [PATCH 037/105] Closes #158 --- function_caching.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/function_caching.rst b/function_caching.rst index 865a866..7c06149 100644 --- a/function_caching.rst +++ b/function_caching.rst @@ -67,6 +67,8 @@ is a generic cache: fibonacci(25) +**Note:** memoize won't cache unhashable types (dict, lists, etc...) but only the immutable types. Keep that in mind when using it. + `Here `__ is a fine article by Caktus Group in which they caught a bug in Django which occurred due to ``lru_cache``. It's an interesting read. Do check it out. From 2cd38c31f338dbddffa783ff8fc904a4985e3994 Mon Sep 17 00:00:00 2001 From: yasoob Date: Tue, 29 May 2018 17:21:44 -0400 Subject: [PATCH 038/105] Closes #155 --- generators.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/generators.rst b/generators.rst index f65afae..dd983c3 100644 --- a/generators.rst +++ b/generators.rst @@ -20,8 +20,8 @@ Iterable An ``iterable`` is any object in Python which has an ``__iter__`` or a ``__getitem__`` method defined which returns an **iterator** or can take -indexes (Both of these dunder methods are fully explained in a previous -chapter). In short an ``iterable`` is any object which can provide us +indexes (You can read more about them `here `_). +In short an ``iterable`` is any object which can provide us with an **iterator**. So what is an **iterator**? Iterator From 48f51479abbd0eb384117c3247c033585620d370 Mon Sep 17 00:00:00 2001 From: yasoob Date: Tue, 29 May 2018 17:36:07 -0400 Subject: [PATCH 039/105] added a more relevant example for pprint. Closes #145 --- one_liners.rst | 56 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/one_liners.rst b/one_liners.rst index 1914ea6..17dc776 100644 --- a/one_liners.rst +++ b/one_liners.rst @@ -29,9 +29,59 @@ repl. Here is the relevant code: from pprint import pprint my_dict = {'name': 'Yasoob', 'age': 'undefined', 'personality': 'awesome'} - pprint(my_dict) - -This is more effective on ``dict`` s. Moreover, if you want to pretty print + print(dir(my_dict)) + # ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] + + pprint(dir(my_dict)) + # ['__add__', + # '__class__', + # '__contains__', + # '__delattr__', + # '__delitem__', + # '__dir__', + # '__doc__', + # '__eq__', + # '__format__', + # '__ge__', + # '__getattribute__', + # '__getitem__', + # '__gt__', + # '__hash__', + # '__iadd__', + # '__imul__', + # '__init__', + # '__init_subclass__', + # '__iter__', + # '__le__', + # '__len__', + # '__lt__', + # '__mul__', + # '__ne__', + # '__new__', + # '__reduce__', + # '__reduce_ex__', + # '__repr__', + # '__reversed__', + # '__rmul__', + # '__setattr__', + # '__setitem__', + # '__sizeof__', + # '__str__', + # '__subclasshook__', + # 'append', + # 'clear', + # 'copy', + # 'count', + # 'extend', + # 'index', + # 'insert', + # 'pop', + # 'remove', + # 'reverse', + # 'sort'] + + +This is more effective on nested ``dict`` s. Moreover, if you want to pretty print json quickly from a file then you can simply do: .. code:: python From a366c8823f25b32e6f4821d3bb0d58dba360ec11 Mon Sep 17 00:00:00 2001 From: yasoob Date: Tue, 29 May 2018 17:41:05 -0400 Subject: [PATCH 040/105] Added the classes chapter to the readme. Closes #139 --- classes.rst | 4 ++-- index.rst | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/classes.rst b/classes.rst index 3e09bb2..c22aa10 100644 --- a/classes.rst +++ b/classes.rst @@ -217,6 +217,6 @@ Without the ``__getitem__`` method we would have got this error: File "", line 1, in TypeError: 'GetTest' object has no attribute '__getitem__' -Static, Class & Abstract methods -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. Static, Class & Abstract methods +.. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/index.rst b/index.rst index 9895a2d..23cb3c5 100644 --- a/index.rst +++ b/index.rst @@ -55,6 +55,7 @@ Table of Contents object_introspection comprehensions exceptions + classes lambdas one_liners for_-_else From d53b7b5286d4eddaaf16d12888bbb42892d59ef2 Mon Sep 17 00:00:00 2001 From: yasoob Date: Tue, 29 May 2018 17:43:05 -0400 Subject: [PATCH 041/105] improved the text a bit. Closes #146 --- mutation.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mutation.rst b/mutation.rst index 440222a..493579c 100644 --- a/mutation.rst +++ b/mutation.rst @@ -30,7 +30,8 @@ something like this: bar += ['bye'] print(foo) - # Output: ['hi'] + # Expected Output: ['hi'] + # Output: ['hi', 'bye'] print(bar) # Output: ['hi', 'bye'] From 4969f16bbea5753426deea809cac0fc01a12edf1 Mon Sep 17 00:00:00 2001 From: yasoob Date: Tue, 29 May 2018 17:50:36 -0400 Subject: [PATCH 042/105] improved the multi return values section. Closes #90 --- global_&_return.rst | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/global_&_return.rst b/global_&_return.rst index 2718ed5..39a75d4 100644 --- a/global_&_return.rst +++ b/global_&_return.rst @@ -125,4 +125,36 @@ Or by more common convention: print(profile_age) # Output: 30 +Keep in mind that even in the above example we are returning a tuple (despite the lack of paranthesis) and not separate multiple values. If you want to take it one step further, you can also make use of `namedtuple `_. Here is an example: + +.. code:: python + + from collections import namedtuple + def profile(): + Person = namedtuple('Person', 'name age') + return Person(name="Danny", age=31) + + # Use as namedtuple + p = profile() + print(p, type(p)) + # Person(name='Danny', age=31) + print(p.name) + # Danny + print(p.age) + #31 + + # Use as plain tuple + p = profile() + print(p[0]) + # Danny + print(p[1]) + #31 + + # Unpack it immediatly + name, age = profile() + print(name) + # Danny + print(age) + #31 + This is a better way to do it along with returning ``lists`` and ``dicts``. Don't use ``global`` keyword unless you know what you are doing. ``global`` might be a better option in a few cases but is not in most of them. From a59159fedf28a459fb9253c277e5dd2d1d432a6c Mon Sep 17 00:00:00 2001 From: Pavel Karateev Date: Sat, 2 Jun 2018 20:07:13 +0300 Subject: [PATCH 043/105] Nesting for Table of Content --- README.md | 63 ++++++++++++++++++++++--------------------------------- 1 file changed, 25 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 6d1284b..e637e51 100644 --- a/README.md +++ b/README.md @@ -26,50 +26,37 @@ Moreover, if you want to add more content to this book then kindly submit a pull Table of Contents: ------------------ 1) Programmer tools - -- [Virtual Environment](virtual_environment.rst) -- [Debugging](debugging.rst) -- [Object introspection](object_introspection.rst) - + - [Virtual Environment](virtual_environment.rst) + - [Debugging](debugging.rst) + - [Object introspection](object_introspection.rst) 2) Syntax - -- [Exceptions](exceptions.rst) -- [For - Else](for_-_else.rst) -- [Ternary Operators](ternary_operators.rst) -- [Global & Return](global_&_return.rst) -- [Open function](open_function.rst) -- [\*args and \*\*kwargs](args_and_kwargs.rst) -- [Context managers](context_managers.rst) - + - [Exceptions](exceptions.rst) + - [For - Else](for_-_else.rst) + - [Ternary Operators](ternary_operators.rst) + - [Global & Return](global_&_return.rst) + - [Open function](open_function.rst) + - [\*args and \*\*kwargs](args_and_kwargs.rst) + - [Context managers](context_managers.rst) 3) Functional programming - -- [Enumerate](enumerate.rst) -- [Lambdas](lambdas.rst) -- [``set`` Data Structure](set_-_data_structure.rst) -- [Map & Filter](map_filter.rst) -- [Comprehensions](comprehensions.rst) - + - [Enumerate](enumerate.rst) + - [Lambdas](lambdas.rst) + - [``set`` Data Structure](set_-_data_structure.rst) + - [Map & Filter](map_filter.rst) + - [Comprehensions](comprehensions.rst) 4) Data structures - -- [Generators](generators.rst) -- [Coroutines](coroutines.rst) - + - [Generators](generators.rst) + - [Coroutines](coroutines.rst) 5) Data types - -- [Collections](collections.rst) -- [Mutation](mutation.rst) -- [\_\_slots\_\_ Magic](__slots__magic.rst) - + - [Collections](collections.rst) + - [Mutation](mutation.rst) + - [\_\_slots\_\_ Magic](__slots__magic.rst) 6) Decorators - -- [What is a decorator?](decorators.rst) -- [Function caching](function_caching.rst) - + - [What is a decorator?](decorators.rst) + - [Function caching](function_caching.rst) 7) Extras - -- [One Liners](one_liners.rst) -- [Targeting Python 2+3](targeting_python_2_3.rst) -- [Python C extensions](python_c_extension.rst) + - [One Liners](one_liners.rst) + - [Targeting Python 2+3](targeting_python_2_3.rst) + - [Python C extensions](python_c_extension.rst) Author: ------ From 14f64eee00c326beb4eb4ab596ab9231c80a1743 Mon Sep 17 00:00:00 2001 From: Pavel Karateev Date: Sat, 2 Jun 2018 20:08:19 +0300 Subject: [PATCH 044/105] Add classes to README TOC --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e637e51..043cba4 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ Table of Contents: 4) Data structures - [Generators](generators.rst) - [Coroutines](coroutines.rst) + - [Classes](classes.rst) 5) Data types - [Collections](collections.rst) - [Mutation](mutation.rst) From dc6b3fb828686c036e811d7aeaed231bc4aa58fa Mon Sep 17 00:00:00 2001 From: Nikita Penzin Date: Mon, 4 Jun 2018 18:09:54 +0300 Subject: [PATCH 045/105] Update for_-_else.rst --- for_-_else.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/for_-_else.rst b/for_-_else.rst index f072c03..9a68363 100644 --- a/for_-_else.rst +++ b/for_-_else.rst @@ -34,7 +34,7 @@ The common construct is to run a loop and search for an item. If the item is found, we break out of the loop using the ``break`` statement. There are two scenarios in which the loop may end. The first one is when the item is found and ``break`` is encountered. The second scenario is that the loop -ends without encountering a ``break` statement. Now we may want to know which one of these is the reason for a +ends without encountering a ``break`` statement. Now we may want to know which one of these is the reason for a loop's completion. One method is to set a flag and then check it once the loop ends. Another is to use the ``else`` clause. From 4813c2ec46e3992dcf84462244749b1d3ad8b74d Mon Sep 17 00:00:00 2001 From: Gabriel Date: Wed, 1 Aug 2018 20:49:05 +0300 Subject: [PATCH 046/105] Last __getitem__ example Class name and attribute correction --- classes.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/classes.rst b/classes.rst index c22aa10..8b0294d 100644 --- a/classes.rst +++ b/classes.rst @@ -200,8 +200,8 @@ Implementing **getitem** in a class allows its instances to use the [] def __getitem__(self,i): return self.info[i] - foo = OldClass() - foo['title'] + foo = GetTest() + foo['name'] # Output: 'Yasoob' foo['number'] From 3cae4cb2de2f6ab0ef09efa78ba26ddf81803cbf Mon Sep 17 00:00:00 2001 From: Gabriel Date: Wed, 1 Aug 2018 20:50:12 +0300 Subject: [PATCH 047/105] Name corrected in error on last __getitem__ code --- classes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes.rst b/classes.rst index 8b0294d..c233fcb 100644 --- a/classes.rst +++ b/classes.rst @@ -211,7 +211,7 @@ Without the ``__getitem__`` method we would have got this error: .. code:: python - >>> foo['title'] + >>> foo['name'] Traceback (most recent call last): File "", line 1, in From a5102f13bbc1dc2cba7bd2b374ea700b89c2b453 Mon Sep 17 00:00:00 2001 From: Ali <3050609+alikoneko@users.noreply.github.com> Date: Thu, 13 Sep 2018 13:05:52 -0400 Subject: [PATCH 048/105] Update to be inclusive (#176) * Update to be inclusive I'm named Ali. I struggle with body image, and have my entire life. Can we at least be nice and refer to a pet and maybe not body image issues. * Update ternary_operators.rst --- ternary_operators.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ternary_operators.rst b/ternary_operators.rst index d4a4e00..1d029ca 100644 --- a/ternary_operators.rst +++ b/ternary_operators.rst @@ -18,8 +18,8 @@ expressions. .. code:: python - is_fat = True - state = "fat" if is_fat else "not fat" + is_nice = True + state = "nice" if is_nice else "not nice" It allows to quickly test a condition instead of a multiline if statement. Often times it can be immensely helpful and can make your @@ -38,10 +38,10 @@ is some sample code: .. code:: python - fat = True - fitness = ("skinny", "fat")[fat] - print("Ali is ", fitness) - # Output: Ali is fat + nice = True + personality = ("mean", "nice")[nice] + print("The cat is ", personality) + # Output: The cat is nice This works simply because True == 1 and False == 0, and so can be done with lists in addition to tuples. From 50f50c6a41ca31ad28ff2565fba0cf7257ec27cd Mon Sep 17 00:00:00 2001 From: Erin Wild Date: Wed, 3 Oct 2018 12:33:22 -0400 Subject: [PATCH 049/105] Fix typos in output of getitem example (#170) --- classes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes.rst b/classes.rst index c233fcb..9163f09 100644 --- a/classes.rst +++ b/classes.rst @@ -205,7 +205,7 @@ Implementing **getitem** in a class allows its instances to use the [] # Output: 'Yasoob' foo['number'] - # Output: 36845124 + # Output: 12345812 Without the ``__getitem__`` method we would have got this error: From 779dd0dabae519828ff3a76277a319179a2fdd00 Mon Sep 17 00:00:00 2001 From: Adel Atallah <2213999+atallahade@users.noreply.github.com> Date: Sun, 28 Oct 2018 20:26:08 +0100 Subject: [PATCH 050/105] Fix minor typo (#177) Fix typo in the "Comprehensions" section. --- comprehensions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/comprehensions.rst b/comprehensions.rst index 2c09aca..fb9df30 100644 --- a/comprehensions.rst +++ b/comprehensions.rst @@ -96,7 +96,7 @@ that they use braces ``{}``. Here is an example: ``generator`` comprehensions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -They are also similar to list comprehensions. The only difference is that they don't allocate memory for the whole list but generate one item at a time, thus more memory effecient. +They are also similar to list comprehensions. The only difference is that they don't allocate memory for the whole list but generate one item at a time, thus more memory efficient. .. code:: python From 19a1942894fe5cae1c01f71e3eed7fe27e6adae4 Mon Sep 17 00:00:00 2001 From: Patrick Hilhorst Date: Sun, 28 Oct 2018 20:28:11 +0100 Subject: [PATCH 051/105] Ask for forgiveness, not for permission (#175) References: - https://docs.python.org/3/glossary.html#term-eafp - https://blogs.msdn.microsoft.com/pythonengineering/2016/06/29/idiomatic-python-eafp-versus-lbyl/ - https://docs.quantifiedcode.com/python-anti-patterns/readability/asking_for_permission_instead_of_forgiveness_when_working_with_files.html - https://jeffknupp.com/blog/2013/02/06/write-cleaner-python-use-exceptions/ --- function_caching.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/function_caching.rst b/function_caching.rst index 7c06149..7100aad 100644 --- a/function_caching.rst +++ b/function_caching.rst @@ -52,9 +52,9 @@ is a generic cache: memo = {} @wraps(function) def wrapper(*args): - if args in memo: + try: return memo[args] - else: + except KeyError: rv = function(*args) memo[args] = rv return rv From e0e55079972771d7749b08c8cb241a9a70c00c46 Mon Sep 17 00:00:00 2001 From: Michele Tonutti Date: Sun, 28 Oct 2018 20:28:47 +0100 Subject: [PATCH 052/105] Update enumerate.rst (#172) It's -> its --- enumerate.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enumerate.rst b/enumerate.rst index 06719f0..277b679 100644 --- a/enumerate.rst +++ b/enumerate.rst @@ -1,7 +1,7 @@ Enumerate --------- -Enumerate is a built-in function of Python. It's usefulness can not be +Enumerate is a built-in function of Python. Its usefulness can not be summarized in a single line. Yet most of the newcomers and even some advanced programmers are unaware of it. It allows us to loop over something and have an automatic counter. Here is an example: From 512de0bfe7b8c98902fd47bbc9ea71da823223a5 Mon Sep 17 00:00:00 2001 From: Dale Daeyoung Seo Date: Sun, 28 Oct 2018 12:35:49 -0700 Subject: [PATCH 053/105] Fix the class name (#171) * Fix the class name `GetTest` is the right class name. * Updated the output --- classes.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/classes.rst b/classes.rst index 9163f09..9450904 100644 --- a/classes.rst +++ b/classes.rst @@ -201,6 +201,7 @@ Implementing **getitem** in a class allows its instances to use the [] return self.info[i] foo = GetTest() + foo['name'] # Output: 'Yasoob' From 0767511f239da5bb0615edd36f5c05672bb41d46 Mon Sep 17 00:00:00 2001 From: user2552 <34348170+user2552@users.noreply.github.com> Date: Sun, 28 Oct 2018 15:37:02 -0400 Subject: [PATCH 054/105] Update ternary_operators.rst (#169) change is to if to clarify the language --- ternary_operators.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ternary_operators.rst b/ternary_operators.rst index 1d029ca..0a7741e 100644 --- a/ternary_operators.rst +++ b/ternary_operators.rst @@ -12,7 +12,7 @@ expressions. .. code:: python - condition_is_true if condition else condition_is_false + condition_if_true if condition else condition_if_false **Example:** From cdcc71bd06aed33afde75b13399ffed3f10ed62f Mon Sep 17 00:00:00 2001 From: anupy Date: Mon, 29 Oct 2018 01:18:47 +0530 Subject: [PATCH 055/105] Shorthand ternary. (#165) * Shorthand ternary. * Update ternary_operators.rst * Update ternary_operators.rst * Update ternary_operators.rst * Update ternary_operators.rst --- ternary_operators.rst | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/ternary_operators.rst b/ternary_operators.rst index 0a7741e..7544d62 100644 --- a/ternary_operators.rst +++ b/ternary_operators.rst @@ -70,3 +70,34 @@ first built, then an index is found. For the if-else ternary operator, it follows the normal if-else logic tree. Thus, if one case could raise an exception based on the condition, or if either case is a computation-heavy method, using tuples is best avoided. + + +**ShortHand Ternary** + +In python there is also the shorthand ternary tag which is a shorter version of the +normal ternary operator you have seen above. + +Syntax was introduced in Python 2.5 and can be used in python 2.5 or greater. + +**Example** + +.. code:: python + + >>> True or "Some" + True + >>> + >>> False or "Some" + 'Some' + +The first statement (`True or "Some"`) will return `True` and the second statement (`False or "Some"`) will return `False`. + +This is helpful in case where you quickly want to check for the output of a function and give a useful message if the output is empty: + +.. code:: python + + >>> func_output = None + >>> msg = output or "No data returned" + >>> print(msg) + No data returned + + From a813faaffca9af342afc636e70c3ff946c7b6525 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2EYasoob=20Ullah=20Khalid=20=E2=98=BA?= Date: Sun, 28 Oct 2018 15:52:36 -0400 Subject: [PATCH 056/105] Update breadcrumbs.html --- _templates/breadcrumbs.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index 6657860..ddcce71 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -28,7 +28,7 @@

    Note

    -

    Hi! I am currently looking for some freelance projects. If you have a project idea in mind please feel free to send me an email or check out my personal website. If you want to get to know about my journey, you can read this article: How I got into programming

    . +

    Hi! I am currently looking for internships for summer 2019. If you work at an amazing company and feel like I would be a good addition to the team, please feel free to send me an email or check out my personal website. If you want to get to know about my journey, you can read this article: How I got into programming

    .
    From dcc0c1d8d87bec639d88277d450e5adb2572045b Mon Sep 17 00:00:00 2001 From: Jakub Pastuszuk Date: Tue, 13 Nov 2018 10:40:13 +0100 Subject: [PATCH 057/105] Update ternary_operators.rst (#179) --- ternary_operators.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ternary_operators.rst b/ternary_operators.rst index 7544d62..1436663 100644 --- a/ternary_operators.rst +++ b/ternary_operators.rst @@ -89,7 +89,7 @@ Syntax was introduced in Python 2.5 and can be used in python 2.5 or greater. >>> False or "Some" 'Some' -The first statement (`True or "Some"`) will return `True` and the second statement (`False or "Some"`) will return `False`. +The first statement (`True or "Some"`) will return `True` and the second statement (`False or "Some"`) will return `Some`. This is helpful in case where you quickly want to check for the output of a function and give a useful message if the output is empty: From 6f01688bce657d69bce112ec543285c5ccf3b125 Mon Sep 17 00:00:00 2001 From: Steven Huang Date: Fri, 16 Nov 2018 13:53:12 -0500 Subject: [PATCH 058/105] Minor wording improvements (#180) --- decorators.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/decorators.rst b/decorators.rst index 7bf2609..64cbc44 100644 --- a/decorators.rst +++ b/decorators.rst @@ -2,8 +2,8 @@ Decorators ---------- Decorators are a significant part of Python. In simple words: they are -functions which modify the functionality of another function. They help -to make our code shorter and more Pythonic. Most of the beginners do not +functions which modify the functionality of other functions. They help +to make our code shorter and more Pythonic. Most beginners do not know where to use them so I am going to share some areas where decorators can make your code more concise. From a6c6f81437b1a4419fce7f51b0e6e31baae9a92e Mon Sep 17 00:00:00 2001 From: Jakub Pastuszuk Date: Fri, 30 Nov 2018 17:04:00 +0100 Subject: [PATCH 059/105] Update classes.rst (#184) Typo fix - I believe it should be immutable here, since example operates on immutable types of class variable and in this case, there is no problem with using class variable --- classes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes.rst b/classes.rst index 9450904..4d45cf2 100644 --- a/classes.rst +++ b/classes.rst @@ -53,7 +53,7 @@ Let's take a look at an example: b.pi # Output: 50 -There are not many issues while using mutable class variables. This is +There are not many issues while using immutable class variables. This is the major reason due to which beginners do not try to learn more about this subject because everything works! If you also believe that instance and class variables can not cause any problem if used incorrectly then From 6d47c66d051b814cf04b378379a4d57ceaf8ba31 Mon Sep 17 00:00:00 2001 From: Jakub Pastuszuk Date: Fri, 30 Nov 2018 17:04:28 +0100 Subject: [PATCH 060/105] Update targeting_python_2_3.rst (#185) Corrected sentence to be more precise - targeting multiple versions of python because users do not use the same version. Currently it translates to: Not all of the users do have python 2 or python 3 (which is semantically incorrect) --- targeting_python_2_3.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targeting_python_2_3.rst b/targeting_python_2_3.rst index 00e08ff..caa0c1e 100644 --- a/targeting_python_2_3.rst +++ b/targeting_python_2_3.rst @@ -5,7 +5,7 @@ In a lot of cases you might want to develop programs which can be run in both Python 2+ and 3+. Just imagine that you have a very popular Python module which is used by -hundreds of people but not all of them have Python 2 or 3. In that case +hundreds of people but not all of them have the same version of Python (2 or 3). In that case you have two choices. The first one is to distribute 2 modules, one for Python 2 and the other for Python 3. The other choice is to modify your current code and make it compatible with both Python 2 and 3. From 49d685b0b263ef61322286a49205ac167cb104cb Mon Sep 17 00:00:00 2001 From: Jakub Pastuszuk Date: Fri, 30 Nov 2018 17:06:02 +0100 Subject: [PATCH 061/105] Update exceptions.rst (#183) It is always better to catch exception and raise it with a detailed information, difference between just raising and raising caught exception. With rising e: .. code:: python Traceback (most recent call last): File "", line 5, in File "", line 2, in FileNotFoundError: [Errno 2] No such file or directory: 'test' Just rising: .. code:: python Traceback (most recent call last): File "", line 2, in FileNotFoundError: [Errno 2] No such file or directory: 'test' --- exceptions.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exceptions.rst b/exceptions.rst index 2b29381..d6fae82 100644 --- a/exceptions.rst +++ b/exceptions.rst @@ -56,9 +56,9 @@ trapping ALL exceptions: try: file = open('test.txt', 'rb') - except Exception: + except Exception as e: # Some logging if you want - raise + raise e This can be helpful when you have no idea about the exceptions which may be thrown by your program. From c20b5a8c3f2641390665b96c7225fa43ea3f72e4 Mon Sep 17 00:00:00 2001 From: Jakub Pastuszuk Date: Fri, 30 Nov 2018 17:08:09 +0100 Subject: [PATCH 062/105] Update collections.rst (#182) Provided clear programmatic example of how deque extending does pop values on the other side when maxlen limit is reached --- collections.rst | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/collections.rst b/collections.rst index c09a3bf..fa4debd 100644 --- a/collections.rst +++ b/collections.rst @@ -216,9 +216,15 @@ example so here you go: .. code:: python - d = deque(maxlen=30) + d = deque([0, 1, 2, 3, 5], maxlen=5) + print(d) + # Output: deque([0, 1, 2, 3, 5], maxlen=5) + + d.extend([6]) + print(d) + #Output: deque([1, 2, 3, 5, 6], maxlen=5) -Now whenever you insert values after 30, the leftmost value will be +Now whenever you insert values after 5, the leftmost value will be popped from the list. You can also expand the list in any direction with new values: From b0b664392470f01dd3a487e90f3c7da2103fbdc3 Mon Sep 17 00:00:00 2001 From: Jakub Pastuszuk Date: Fri, 30 Nov 2018 17:08:45 +0100 Subject: [PATCH 063/105] Update collections.rst (#181) Little change to how import is written to make it consistent with rest of examples --- collections.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/collections.rst b/collections.rst index fa4debd..af0aa5c 100644 --- a/collections.rst +++ b/collections.rst @@ -68,8 +68,8 @@ share a solution using ``defaultdict``. .. code:: python - import collections - tree = lambda: collections.defaultdict(tree) + from collections import defaultdict + tree = lambda: defaultdict(tree) some_dict = tree() some_dict['colours']['favourite'] = "yellow" # Works fine From e8aa372810b6fdcc12cda39623c386fd2c043ac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E8=BE=89?= Date: Sat, 1 Dec 2018 04:55:05 +0800 Subject: [PATCH 064/105] Make sure the function was called (#154) * Make sure the function was called Make sure the function was called. * fix class decorator bugs In class decorator, @decorator will call it once, and put the func into Class(func). So if wrote like this `@logit()`, it will call __call__ function. * Update decorators.rst --- decorators.rst | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/decorators.rst b/decorators.rst index 64cbc44..8e4ded2 100644 --- a/decorators.rst +++ b/decorators.rst @@ -390,18 +390,26 @@ rebuild logit as a class instead of a function. .. code:: python class logit(object): - def __init__(self, logfile='out.log'): - self.logfile = logfile + +        _logfile = 'out.log' +     + def __init__(self, func): + self.func = func - def __call__(self, func): - log_string = func.__name__ + " was called" +        def __call__(self, *args): +            log_string = self.func.__name__ + " was called" print(log_string) # Open the logfile and append - with open(self.logfile, 'a') as opened_file: +            with open(self._logfile, 'a') as opened_file: # Now we log to the specified logfile opened_file.write(log_string + '\n') # Now, send a notification self.notify() + +            # return base func +            return self.func(*args) + +             def notify(self): # logit only logs, no more @@ -412,10 +420,14 @@ the nested function approach, and wrapping a function still will use the same syntax as before: .. code:: python - - @logit() - def myfunc1(): + +    logit._logfile = 'out2.log' # if change log file +    @logit +    def myfunc1(): pass + + myfunc1() + # Output: myfunc1 was called Now, let's subclass logit to add email functionality (though this topic will not be covered here). From 05551b450557708a9e9c10e5aa8dc7ef28a421b5 Mon Sep 17 00:00:00 2001 From: Jakub Pastuszuk Date: Fri, 30 Nov 2018 21:56:55 +0100 Subject: [PATCH 065/105] Update context_managers.rst (#187) Small typo fixed --- context_managers.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/context_managers.rst b/context_managers.rst index 45d6eb4..79d944f 100644 --- a/context_managers.rst +++ b/context_managers.rst @@ -167,7 +167,7 @@ Let's dissect this method a little. 1. Python encounters the ``yield`` keyword. Due to this it creates a generator instead of a normal function. 2. Due to the decoration, contextmanager is called with the function - name (``open\_file``) as it's argument. + name (``open_file``) as it's argument. 3. The ``contextmanager`` decorator returns the generator wrapped by the ``GeneratorContextManager`` object. 4. The ``GeneratorContextManager`` is assigned to the ``open_file`` @@ -180,4 +180,4 @@ Manager like this: .. code:: python with open_file('some_file') as f: - f.write('hola!') \ No newline at end of file + f.write('hola!') From b25d0bfbd6a149de5886528d7fa8b1ffea56406b Mon Sep 17 00:00:00 2001 From: Nikita Shchypylov Date: Wed, 26 Dec 2018 21:12:32 +0200 Subject: [PATCH 066/105] Wrong variable name for shorthand ternary example (#188) --- ternary_operators.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ternary_operators.rst b/ternary_operators.rst index 1436663..7e7dec2 100644 --- a/ternary_operators.rst +++ b/ternary_operators.rst @@ -95,7 +95,7 @@ This is helpful in case where you quickly want to check for the output of a func .. code:: python - >>> func_output = None + >>> output = None >>> msg = output or "No data returned" >>> print(msg) No data returned From 77bd8327b86b5fe81f5c2713d35315d9c429f762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2EYasoob=20Ullah=20Khalid=20=E2=98=BA?= Date: Fri, 4 Jan 2019 23:46:18 -0500 Subject: [PATCH 067/105] Update breadcrumbs.html --- _templates/breadcrumbs.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index ddcce71..12b4e37 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -28,7 +28,7 @@

    Note

    -

    Hi! I am currently looking for internships for summer 2019. If you work at an amazing company and feel like I would be a good addition to the team, please feel free to send me an email or check out my personal website. If you want to get to know about my journey, you can read this article: How I got into programming

    . +

    Hi! My name is Yasoob. I am the author of this book. Thank you so much to everyone who reached out with internship opportunities. I have accepted an offer and will be working in NYC in summer 2019. If you want to get to know about my journey and connect with me, you can read this article: How I got into programming

    .
    From 89af69642aef0b4dcbdedc61dff0747a0b1e27fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2EYasoob=20Ullah=20Khalid=20=E2=98=BA?= Date: Fri, 4 Jan 2019 23:48:39 -0500 Subject: [PATCH 068/105] Update breadcrumbs.html --- _templates/breadcrumbs.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index 12b4e37..107905b 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -28,7 +28,7 @@

    Note

    -

    Hi! My name is Yasoob. I am the author of this book. Thank you so much to everyone who reached out with internship opportunities. I have accepted an offer and will be working in NYC in summer 2019. If you want to get to know about my journey and connect with me, you can read this article: How I got into programming

    . +

    Hi! My name is Yasoob. I am the author of this book. Thank you so much to everyone who reached out with internship opportunities. I have accepted an offer and will be working in NYC in summer 2019. If you want to get to know about my journey and connect with me, you can check out my personal website and/or read this article: How I got into programming.

    From 258f05d949528b7b233b7d06bf6f095c96137c63 Mon Sep 17 00:00:00 2001 From: hasslerb Date: Sat, 19 Jan 2019 17:18:51 -0600 Subject: [PATCH 069/105] Update comprehensions.rst (#189) Once generator types were added, the number of types of comprehensions was no longer three --- comprehensions.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/comprehensions.rst b/comprehensions.rst index fb9df30..1db2a61 100644 --- a/comprehensions.rst +++ b/comprehensions.rst @@ -3,7 +3,7 @@ Comprehensions Comprehensions are a feature of Python which I would really miss if I ever have to leave it. Comprehensions are constructs that allow -sequences to be built from other sequences. Three types of +sequences to be built from other sequences. Several types of comprehensions are supported in both Python 2 and Python 3: - list comprehensions From 4c1d5af82b1458772e200794606b1847c966b551 Mon Sep 17 00:00:00 2001 From: yasoob Date: Sat, 2 Mar 2019 18:47:00 -0500 Subject: [PATCH 070/105] updated notes --- _templates/breadcrumbs.html | 2 +- index.rst | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index 107905b..4dffaf8 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -28,7 +28,7 @@

    Note

    -

    Hi! My name is Yasoob. I am the author of this book. Thank you so much to everyone who reached out with internship opportunities. I have accepted an offer and will be working in NYC in summer 2019. If you want to get to know about my journey and connect with me, you can check out my personal website and/or read this article: How I got into programming.

    +

    Hi! My name is Yasoob. I am the author of this book. If you want to get to know about my journey and connect with me, you can check out my personal website and/or read this article: How I got into programming. If you like what you are reading please consider donating. It takes time to produce quality content and donations keep me motivated 😊

    diff --git a/index.rst b/index.rst index 23cb3c5..224ae75 100644 --- a/index.rst +++ b/index.rst @@ -2,9 +2,7 @@ .. note:: - You can donate me for my hardwork if you want to by buying the donation version of Intermediate Python from `Gumroad `__. Your help would be greatly appreciated! - - You can also sign up to my `mailing list `__ so that you remain in sync with any major updates to this book or my future projects! + You can sign up to my `mailing list `__ so that you remain in sync with any major updates to this book or my future projects! Intermediate Python =================== From ad3314aa63193465b449344596d067a32ae269d6 Mon Sep 17 00:00:00 2001 From: yasoob Date: Sun, 3 Mar 2019 01:58:41 -0500 Subject: [PATCH 071/105] fixed a link --- _templates/breadcrumbs.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index 4dffaf8..6455763 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -28,7 +28,7 @@

    Note

    -

    Hi! My name is Yasoob. I am the author of this book. If you want to get to know about my journey and connect with me, you can check out my personal website and/or read this article: How I got into programming. If you like what you are reading please consider donating. It takes time to produce quality content and donations keep me motivated 😊

    +

    Hi! My name is Yasoob. I am the author of this book. If you want to get to know about my journey and connect with me, you can check out my personal website and/or read this article: How I got into programming. If you like what you are reading please consider donating. It takes time to produce quality content and donations keep me motivated 😊

    From 857b59da3c6ddb5af4626585475ac95a9e72fd88 Mon Sep 17 00:00:00 2001 From: yasoob Date: Thu, 9 May 2019 00:31:10 -0400 Subject: [PATCH 072/105] added link to nyc post --- _templates/breadcrumbs.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index 6455763..56b391a 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -28,7 +28,7 @@

    Note

    -

    Hi! My name is Yasoob. I am the author of this book. If you want to get to know about my journey and connect with me, you can check out my personal website and/or read this article: How I got into programming. If you like what you are reading please consider donating. It takes time to produce quality content and donations keep me motivated 😊

    +

    Hi! My name is Yasoob. I am the author of this book. A couple of months ago I asked you guys for help with finding an internship. You all came through. Now I need your help again. If you are from NYC please read this article and help me find a place to stay in the city. My host backed out at the last minute.

    From e4e35ff01ff418c28f3a2bbac4cdf1ea139546e8 Mon Sep 17 00:00:00 2001 From: yasoob Date: Thu, 9 May 2019 01:19:15 -0400 Subject: [PATCH 073/105] added bitly link --- _templates/breadcrumbs.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index 56b391a..4b1500e 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -28,7 +28,7 @@

    Note

    -

    Hi! My name is Yasoob. I am the author of this book. A couple of months ago I asked you guys for help with finding an internship. You all came through. Now I need your help again. If you are from NYC please read this article and help me find a place to stay in the city. My host backed out at the last minute.

    +

    Hi! My name is Yasoob. I am the author of this book. A couple of months ago I asked you guys for help with finding an internship. You all came through. Now I need your help again. If you are from NYC please read this article and help me find a place to stay in the city. My host backed out at the last minute.

    From c47a29d3ce9b3490327afdd399bc8debf770f3de Mon Sep 17 00:00:00 2001 From: Yasoob Date: Mon, 8 Jul 2019 12:55:20 -0400 Subject: [PATCH 074/105] removed sublet info --- _templates/breadcrumbs.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index 4b1500e..4992447 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -28,7 +28,7 @@

    Note

    -

    Hi! My name is Yasoob. I am the author of this book. A couple of months ago I asked you guys for help with finding an internship. You all came through. Now I need your help again. If you are from NYC please read this article and help me find a place to stay in the city. My host backed out at the last minute.

    +

    Hi! My name is Yasoob. I am the author of this book. I regularly write Python posts on Python Tips. Everything else finds its way to my personal blog. I would love it if you can give them a read. I also announce my new projects there :)

    From 8c1195efe878eea0877825c863d6c22ac8fa6b57 Mon Sep 17 00:00:00 2001 From: Ruud de Jong Date: Tue, 10 Sep 2019 11:09:15 +0200 Subject: [PATCH 075/105] Grammar fixes (#197) Added and removed some words. --- decorators.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/decorators.rst b/decorators.rst index 8e4ded2..1b83032 100644 --- a/decorators.rst +++ b/decorators.rst @@ -176,8 +176,8 @@ previous decorator and make a little bit more usable program: Did you get it? We just applied the previously learned principles. This is exactly what the decorators do in Python! They wrap a function and -modify its behaviour in one way or the another. Now you might be -wondering that we did not use the @ anywhere in our code? That is just a +modify its behaviour in one way or another. Now you might be +wondering why we did not use the @ anywhere in our code? That is just a short way of making up a decorated function. Here is how we could have run the previous code sample using @. @@ -206,9 +206,9 @@ Python. Now there is one problem with our code. If we run: # Output: wrapTheFunction That's not what we expected! Its name is -"a\_function\_requiring\_decoration". Well our function was replaced by +"a\_function\_requiring\_decoration". Well, our function was replaced by wrapTheFunction. It overrode the name and docstring of our function. -Luckily Python provides us a simple function to solve this problem and +Luckily, Python provides us a simple function to solve this problem and that is ``functools.wraps``. Let's modify our previous example to use ``functools.wraps``: @@ -263,7 +263,7 @@ decorators. Note: ``@wraps`` takes a function to be decorated and adds the functionality of copying over the function name, docstring, arguments -list, etc. This allows to access the pre-decorated function's properties +list, etc. This allows us to access the pre-decorated function's properties in the decorator. Use-cases: From 9b4892521556c7735bf4a5fca553723965de2a67 Mon Sep 17 00:00:00 2001 From: yasoob Date: Tue, 17 Sep 2019 22:34:30 +0200 Subject: [PATCH 076/105] updated link to internship search 2020 --- _templates/breadcrumbs.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index 4992447..7ab55d2 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -28,8 +28,7 @@

    Note

    -

    Hi! My name is Yasoob. I am the author of this book. I regularly write Python posts on Python Tips. Everything else finds its way to my personal blog. I would love it if you can give them a read. I also announce my new projects there :)

    - +

    Hi! My name is Yasoob. I am the author of this book. Last year you guys helped me find an internship. I am asking for your help again to find an amazing internship for summer 2020. Please read this article to find the details. Thanks! ♥️

      From f272f5bb762f69971cb22da9090feebe480e332e Mon Sep 17 00:00:00 2001 From: yasoob Date: Tue, 17 Sep 2019 22:54:32 +0200 Subject: [PATCH 077/105] added bitly url --- _templates/breadcrumbs.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index 7ab55d2..daae4c7 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -28,7 +28,7 @@

      Note

      -

      Hi! My name is Yasoob. I am the author of this book. Last year you guys helped me find an internship. I am asking for your help again to find an amazing internship for summer 2020. Please read this article to find the details. Thanks! ♥️

      +

      Hi! My name is Yasoob. I am the author of this book. Last year you guys helped me find an internship. I am asking for your help again to find an amazing internship for summer 2020. Please read this article to find the details. Thanks! ♥️

        From aa4543c7fd6eb71a8b1059ee4d2b19a2767a981a Mon Sep 17 00:00:00 2001 From: yasoob Date: Tue, 17 Sep 2019 23:38:10 +0200 Subject: [PATCH 078/105] changed the breadcrumb text slightly --- _templates/breadcrumbs.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index daae4c7..952fb30 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -28,7 +28,7 @@

        Note

        -

        Hi! My name is Yasoob. I am the author of this book. Last year you guys helped me find an internship. I am asking for your help again to find an amazing internship for summer 2020. Please read this article to find the details. Thanks! ♥️

        +

        Hi! My name is Yasoob. I am the author of this book. Last year you guys helped me find an internship. I am asking for your help again to find an amazing internship for summer 2020. If you work at an amazing company and can help me, please read this article to find the details. Thanks!

          From 5a4f9743f7631f3873c890f51cc7f183cab50926 Mon Sep 17 00:00:00 2001 From: Jonathan Dayton Date: Sat, 19 Oct 2019 10:54:19 -0500 Subject: [PATCH 079/105] Add missing period (#199) --- decorators.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/decorators.rst b/decorators.rst index 1b83032..40f53ac 100644 --- a/decorators.rst +++ b/decorators.rst @@ -329,7 +329,7 @@ Come to think of it, isn't ``@wraps`` also a decorator? But, it takes an argument like any normal function can do. So, why can't we do that too? This is because when you use the ``@my_decorator`` syntax, you are -applying a wrapper function with a single function as a parameter +applying a wrapper function with a single function as a parameter. Remember, everything in Python is an object, and this includes functions! With that in mind, we can write a function that returns a wrapper function. From f2159f79981d5831a6f24eb26d7ac9abae94e296 Mon Sep 17 00:00:00 2001 From: Floris Lambrechts Date: Sat, 19 Oct 2019 17:56:38 +0200 Subject: [PATCH 080/105] Improve wording in paragraph about StopIteration (#196) "wondering that why" does not sound fluid. Also, using the word 'while' in a sentence about a `for` loop may be confusing. --- generators.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/generators.rst b/generators.rst index dd983c3..23cd1b0 100644 --- a/generators.rst +++ b/generators.rst @@ -134,10 +134,10 @@ element of a sequence. So let's test out our understanding: As we can see that after yielding all the values ``next()`` caused a ``StopIteration`` error. Basically this error informs us that all the -values have been yielded. You might be wondering that why don't we get -this error while using a ``for`` loop? Well the answer is simple. The +values have been yielded. You might be wondering why we don't get +this error when using a ``for`` loop? Well the answer is simple. The ``for`` loop automatically catches this error and stops calling -``next``. Do you know that a few built-in data types in Python also +``next``. Did you know that a few built-in data types in Python also support iteration? Let's check it out: .. code:: python From a8834dec1ec4d8602cd94bfb4e32fce236a471c9 Mon Sep 17 00:00:00 2001 From: Libbey Date: Sat, 19 Oct 2019 09:58:05 -0600 Subject: [PATCH 081/105] Add func call to Nesting a Decorator Within a Function (#192) 'Nesting a Decorator Within a Function' code does not ever actually call the func, so this commit adds execution and returns the wrapped function result when tagged with decorator. --- decorators.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/decorators.rst b/decorators.rst index 40f53ac..3389728 100644 --- a/decorators.rst +++ b/decorators.rst @@ -354,6 +354,7 @@ us specify a logfile to output to. with open(logfile, 'a') as opened_file: # Now we log to the specified logfile opened_file.write(log_string + '\n') + return func(*args, **kwargs) return wrapped_function return logging_decorator From a61e0c9b80acde5a83f3165ffac8d8ae42827a16 Mon Sep 17 00:00:00 2001 From: Chandler Zuo Date: Sat, 19 Oct 2019 11:58:51 -0400 Subject: [PATCH 082/105] Fix the contextmanager example (#190) See https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager --- context_managers.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/context_managers.rst b/context_managers.rst index 79d944f..fcff411 100644 --- a/context_managers.rst +++ b/context_managers.rst @@ -153,8 +153,10 @@ Let's see a basic, useless example: @contextmanager def open_file(name): f = open(name, 'w') - yield f - f.close() + try: + yield f + finally: + f.close() Okay! This way of implementing Context Managers appear to be more intuitive and easy. However, this method requires some knowledge about From 4a7296b6cc8a6b6387191ec84a2565a7ac6e0b59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2EYasoob=20Ullah=20Khalid=20=E2=98=BA?= Date: Sat, 19 Oct 2019 18:06:46 +0200 Subject: [PATCH 083/105] added breakpoint. closes #195 (#200) --- debugging.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/debugging.rst b/debugging.rst index 58af25a..678d690 100644 --- a/debugging.rst +++ b/debugging.rst @@ -58,3 +58,7 @@ function. These are just a few commands. ``pdb`` also supports post mortem. It is also a really handy function. I would highly suggest you to look at the official documentation and learn more about it. + +**Note:** + +It might seem unintuitive to use `pdb.set_trace()` if you are new to this. Fortunately, if you are using Python 3.7+ then you can simply use the `breakpoint()` [built-in function](https://docs.python.org/3/library/functions.html#breakpoint). It automatically imports `pdb` and calls `pdb.set_trace()`. \ No newline at end of file From e5fbf503b75c0881a309bd26dc7e40a3ed77c2d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2EYasoob=20Ullah=20Khalid=20=E2=98=BA?= Date: Tue, 19 May 2020 17:48:13 -0400 Subject: [PATCH 084/105] Got the internship <3 --- _templates/breadcrumbs.html | 5 ----- 1 file changed, 5 deletions(-) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index 952fb30..a988ecd 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -26,11 +26,6 @@
          -
          -

          Note

          -

          Hi! My name is Yasoob. I am the author of this book. Last year you guys helped me find an internship. I am asking for your help again to find an amazing internship for summer 2020. If you work at an amazing company and can help me, please read this article to find the details. Thanks!

          -
          -
            {% block breadcrumbs %}
          • {{ _('Docs') }} »
          • From 42577eec02e7a356bb923c6980f819248526660a Mon Sep 17 00:00:00 2001 From: Kasonnara Date: Wed, 20 May 2020 08:25:36 +0200 Subject: [PATCH 085/105] Add additional example to ShortHand Ternary (#205) Add a more common use case (in my experience) of 'None or something' --- ternary_operators.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ternary_operators.rst b/ternary_operators.rst index 7e7dec2..18b35c6 100644 --- a/ternary_operators.rst +++ b/ternary_operators.rst @@ -100,4 +100,14 @@ This is helpful in case where you quickly want to check for the output of a func >>> print(msg) No data returned +Or as a simple way to define function parameters with dynamic default values: +.. code:: python + + >>> def my_function(real_name, optional_display_name=None): + >>> optional_display_name = optional_display_name or real_name + >>> print(optional_display_name) + >>> my_function("John") + John + >>> my_function("Mike", "anonymous123") + anonymous123 From 69d90864f9080e8771abe56874886bde2dfd2cd0 Mon Sep 17 00:00:00 2001 From: Mike Morearty Date: Tue, 19 May 2020 23:25:58 -0700 Subject: [PATCH 086/105] Grammar: Change "it's" to "its" in some places (#203) * Use "it's" for "it is" * Use "its" for the possessive --- classes.rst | 2 +- context_managers.rst | 2 +- python_c_extension.rst | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/classes.rst b/classes.rst index 4d45cf2..9485307 100644 --- a/classes.rst +++ b/classes.rst @@ -159,7 +159,7 @@ its ``__init__`` method is called. For example: # called You can see that ``__init__`` is called immediately after an instance is -created. You can also pass arguments to the class during it's +created. You can also pass arguments to the class during its initialization. Like this: .. code:: python diff --git a/context_managers.rst b/context_managers.rst index fcff411..5a0f9d0 100644 --- a/context_managers.rst +++ b/context_managers.rst @@ -169,7 +169,7 @@ Let's dissect this method a little. 1. Python encounters the ``yield`` keyword. Due to this it creates a generator instead of a normal function. 2. Due to the decoration, contextmanager is called with the function - name (``open_file``) as it's argument. + name (``open_file``) as its argument. 3. The ``contextmanager`` decorator returns the generator wrapped by the ``GeneratorContextManager`` object. 4. The ``GeneratorContextManager`` is assigned to the ``open_file`` diff --git a/python_c_extension.rst b/python_c_extension.rst index 368d60b..5f49c3b 100644 --- a/python_c_extension.rst +++ b/python_c_extension.rst @@ -6,7 +6,7 @@ implementation is the ease of interfacing C code to Python. There are three key methods developers use to call C functions from their python code - ``ctypes``, ``SWIG`` and ``Python/C API``. Each -method comes with it's own merits and demerits. +method comes with its own merits and demerits. Firstly, why would you want to interface C with Python? @@ -194,7 +194,7 @@ Python/C API --------------- The `C/Python API `__ is probably the -most widely used method - not for it's simplicity but for the fact that +most widely used method - not for its simplicity but for the fact that you can manipulate python objects in your C code. This method requires your C code to be specifically written for @@ -229,7 +229,7 @@ the addList module is not written in Python at all, but rather in C. Next we'll have a look at the C code that get's built into the ``addList`` Python module. This may seem a bit daunting at first, but once you understand the various components that go into writing the C -file, it's pretty straight forward. +file, it's pretty straightforward. *adder.c* From d26d4b5dc7886cfa0715de9bf0ec8be567f7860e Mon Sep 17 00:00:00 2001 From: Alex Loftus Date: Wed, 20 May 2020 02:26:46 -0400 Subject: [PATCH 087/105] Update debugging.rst (#201) grammar fixes --- debugging.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/debugging.rst b/debugging.rst index 678d690..5e591f8 100644 --- a/debugging.rst +++ b/debugging.rst @@ -2,14 +2,14 @@ Debugging --------- Debugging is also something which once mastered can greatly enhance your -bug hunting skills. Most of the newcomers neglect the importance of the +bug hunting skills. Most newcomers neglect the importance of the Python debugger (``pdb``). In this section I am going to tell you only a few important commands. You can learn more about it from the official documentation. -**Running from commandline** +**Running from the command line** -You can run a script from the commandline using the Python debugger. +You can run a script from the command line using the Python debugger. Here is an example: .. code:: python @@ -61,4 +61,4 @@ official documentation and learn more about it. **Note:** -It might seem unintuitive to use `pdb.set_trace()` if you are new to this. Fortunately, if you are using Python 3.7+ then you can simply use the `breakpoint()` [built-in function](https://docs.python.org/3/library/functions.html#breakpoint). It automatically imports `pdb` and calls `pdb.set_trace()`. \ No newline at end of file +It might seem unintuitive to use `pdb.set_trace()` if you are new to this. Fortunately, if you are using Python 3.7+ then you can simply use the `breakpoint()` [built-in function](https://docs.python.org/3/library/functions.html#breakpoint). It automatically imports `pdb` and calls `pdb.set_trace()`. From 490477d93df85fbd5b3c739bc00d09a6e432f51e Mon Sep 17 00:00:00 2001 From: Jason Chen <33189757+LeChn@users.noreply.github.com> Date: Mon, 1 Jun 2020 14:10:11 -0400 Subject: [PATCH 088/105] capitalization correction for Counter title (#206) * Update collections.rst * parallel sorting bug fix Python 3 zip object no longer supports .sort() AttributeError: 'zip' object has no attribute 'sort' Changed to sorted to be forward compatible --- collections.rst | 4 ++-- lambdas.rst | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/collections.rst b/collections.rst index af0aa5c..f668ca6 100644 --- a/collections.rst +++ b/collections.rst @@ -9,7 +9,7 @@ The ones which we will talk about are: - ``defaultdict`` - ``OrderedDict`` -- ``counter`` +- ``Counter`` - ``deque`` - ``namedtuple`` - ``enum.Enum`` (outside of the module; Python 3.4+) @@ -119,7 +119,7 @@ the end of the dictionary. # Blue 160 # Insertion order is preserved -``counter`` +``Counter`` ^^^^^^^^^^^^^^^ Counter allows us to count the occurrences of a particular item. For diff --git a/lambdas.rst b/lambdas.rst index 73328b8..756e260 100644 --- a/lambdas.rst +++ b/lambdas.rst @@ -39,5 +39,5 @@ they are used in the wild: .. code:: python data = zip(list1, list2) - data.sort() + data = sorted(data) list1, list2 = map(lambda t: list(t), zip(*data)) From 05af1fb7b09d978b9ef96e0e1e01a24ad75e4b34 Mon Sep 17 00:00:00 2001 From: "cursospython.com" <65613862+cursospython@users.noreply.github.com> Date: Thu, 4 Jun 2020 20:36:21 +0200 Subject: [PATCH 089/105] Added link to Spanish translation (#207) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 043cba4..b4205fe 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,7 @@ If you want to translate this book in any other language then kindly let [me kno - [Russian](https://github.com/lancelote/interpy-ru) - [Korean](https://github.com/DDanggle/interpy-kr) - [Portuguese](https://github.com/joanasouza/intermediatePython) +- [Spanish](https://github.com/cursospython/LibroPython) License: ------- From 5360f3327b7e3998bd27586e58a2534618acef8e Mon Sep 17 00:00:00 2001 From: yasoob Date: Sat, 6 Jun 2020 08:30:52 -0400 Subject: [PATCH 090/105] setting up custom privacy conscious analytics service --- _templates/breadcrumbs.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index a988ecd..a110d90 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -80,3 +80,5 @@ {% endif %}
          + + From 6d28d4f4e5d02811f29f6ae99a6d2d71d4e3874e Mon Sep 17 00:00:00 2001 From: Pablo Navarro Date: Tue, 9 Jun 2020 15:06:12 -0700 Subject: [PATCH 091/105] Update ternary_operators.rst (#208) Fix the blueprint for the ternary operator --- ternary_operators.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ternary_operators.rst b/ternary_operators.rst index 18b35c6..6f9cbbc 100644 --- a/ternary_operators.rst +++ b/ternary_operators.rst @@ -12,7 +12,7 @@ expressions. .. code:: python - condition_if_true if condition else condition_if_false + value_if_true if condition else value_if_false **Example:** From 6ed9f4542e2ec28343ac21932132c322f3af400a Mon Sep 17 00:00:00 2001 From: Yasoob Date: Thu, 11 Jun 2020 16:14:39 -0400 Subject: [PATCH 092/105] removed shynet. Too many fake views --- _templates/breadcrumbs.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index a110d90..a988ecd 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -80,5 +80,3 @@ {% endif %}
- - From 23f165f7fcb0c28c8dffc94b18b79a9611b122bc Mon Sep 17 00:00:00 2001 From: Yasoob Date: Thu, 11 Jun 2020 16:26:20 -0400 Subject: [PATCH 093/105] maybe plausible analytics works better? --- _templates/breadcrumbs.html | 1 + 1 file changed, 1 insertion(+) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index a988ecd..247493d 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -79,4 +79,5 @@ {% endif %}
+ From e7bbb9bbe26cc9076bdb5201c1c5c5f338b70479 Mon Sep 17 00:00:00 2001 From: Steven Xu <30362574+stevestar888@users.noreply.github.com> Date: Tue, 16 Jun 2020 23:51:48 -0400 Subject: [PATCH 094/105] grammar: add an apostrophe (#209) --- args_and_kwargs.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/args_and_kwargs.rst b/args_and_kwargs.rst index 544742e..34b4758 100644 --- a/args_and_kwargs.rst +++ b/args_and_kwargs.rst @@ -6,7 +6,7 @@ figuring out the \*args and \*\*kwargs magic variables. So what are they ? First of all let me tell you that it is not necessary to write \*args or \*\*kwargs. Only the ``*`` (asterisk) is necessary. You could have also written \*var and \*\*vars. Writing \*args and \*\*kwargs is just a -convention. So now lets take a look at \*args first. +convention. So now let's take a look at \*args first. Usage of \*args ^^^^^^^^^^^^^^^ From a4d1ec1b1a2c979ca71fdff9ab50cb4fb48d1bfc Mon Sep 17 00:00:00 2001 From: Steven Xu <30362574+stevestar888@users.noreply.github.com> Date: Sat, 4 Jul 2020 20:08:37 -0400 Subject: [PATCH 095/105] add output for first example (#211) --- enumerate.rst | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/enumerate.rst b/enumerate.rst index 277b679..e765ed5 100644 --- a/enumerate.rst +++ b/enumerate.rst @@ -7,12 +7,19 @@ advanced programmers are unaware of it. It allows us to loop over something and have an automatic counter. Here is an example: .. code:: python + + my_list = ['apple', 'banana', 'grapes', 'pear'] + for counter, value in enumerate(my_list): + print counter, value - for counter, value in enumerate(some_list): - print(counter, value) + # Output: + # 0 apple + # 1 banana + # 2 grapes + # 3 pear -And there is more! ``enumerate`` also accepts an optional argument which -makes it even more useful. +And there is more! ``enumerate`` also accepts an optional argument that +allows us to specify the starting index of the counter. .. code:: python @@ -26,9 +33,9 @@ makes it even more useful. # 3 grapes # 4 pear -The optional argument allows us to tell ``enumerate`` from where to -start the index. You can also create tuples containing the index and -list item using a list. Here is an example: +An example of where the optional argument of ``enumerate``comes in handy +is creating tuples containing the index and list item using a list. Here +is an example: .. code:: python From 1593256bcd5b4d0f7ced67460b2906475a2fc31f Mon Sep 17 00:00:00 2001 From: Steven Xu <30362574+stevestar888@users.noreply.github.com> Date: Fri, 10 Jul 2020 13:55:59 -0400 Subject: [PATCH 096/105] make exception execution more specific (#212) --- exceptions.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/exceptions.rst b/exceptions.rst index d6fae82..abdb571 100644 --- a/exceptions.rst +++ b/exceptions.rst @@ -5,9 +5,11 @@ Exception handling is an art which once you master grants you immense powers. I am going to show you some of the ways in which we can handle exceptions. -In basic terminology we are aware of ``try/except`` clause. The code -which can cause an exception to occur is put in the ``try`` block and +In basic terminology we are aware of the ``try/except`` structure. The code +that can cause an exception to occur is put in the ``try`` block and the handling of the exception is implemented in the ``except`` block. +The code in the ``except`` block will only execute if the ``try`` block +runs into an exception. Here is a simple example: .. code:: python From 7ca139de480aaee0fedb8df3e3a533b7ded37eb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=2EYasoob=20Ullah=20Khalid=20=E2=98=BA?= Date: Sat, 11 Jul 2020 14:24:46 -0400 Subject: [PATCH 097/105] Removed Plausible --- _templates/breadcrumbs.html | 1 - 1 file changed, 1 deletion(-) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index 247493d..a988ecd 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -79,5 +79,4 @@ {% endif %}
- From 2002172addd3cdf3be5b39514783b3a617b2de50 Mon Sep 17 00:00:00 2001 From: oliverkoo Date: Wed, 15 Jul 2020 14:40:21 -0400 Subject: [PATCH 098/105] Update enumerate.rst (#214) add missing space --- enumerate.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enumerate.rst b/enumerate.rst index e765ed5..3bcd2f6 100644 --- a/enumerate.rst +++ b/enumerate.rst @@ -33,7 +33,7 @@ allows us to specify the starting index of the counter. # 3 grapes # 4 pear -An example of where the optional argument of ``enumerate``comes in handy +An example of where the optional argument of ``enumerate`` comes in handy is creating tuples containing the index and list item using a list. Here is an example: From 42fec672382bc4e05d81559f6031671b1e617dee Mon Sep 17 00:00:00 2001 From: Steven Xu <30362574+stevestar888@users.noreply.github.com> Date: Mon, 20 Jul 2020 19:43:13 -0400 Subject: [PATCH 099/105] changed wording on *args (#210) * changed wording * Update args_and_kwargs.rst --- args_and_kwargs.rst | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/args_and_kwargs.rst b/args_and_kwargs.rst index 34b4758..85ed174 100644 --- a/args_and_kwargs.rst +++ b/args_and_kwargs.rst @@ -3,7 +3,7 @@ I have come to see that most new python programmers have a hard time figuring out the \*args and \*\*kwargs magic variables. So what are they -? First of all let me tell you that it is not necessary to write \*args +? First of all, let me tell you that it is not necessary to write \*args or \*\*kwargs. Only the ``*`` (asterisk) is necessary. You could have also written \*var and \*\*vars. Writing \*args and \*\*kwargs is just a convention. So now let's take a look at \*args first. @@ -12,12 +12,11 @@ Usage of \*args ^^^^^^^^^^^^^^^ \*args and \*\*kwargs are mostly used in function definitions. \*args -and \*\*kwargs allow you to pass a variable number of arguments to a -function. What variable means here is that you do not know beforehand -how many arguments can be passed to your function by the user -so in this case you use these two keywords. \*args is used to send a -**non-keyworded** variable length argument list to the function. Here's -an example to help you get a clear idea: +and \*\*kwargs allow you to pass an unspecified number of arguments to a +function, so when writing the function definition, you do not need to +know how many arguments will be passed to your function. \*args is used to +send a **non-keyworded** variable length argument list to the function. +Here's an example to help you get a clear idea: .. code:: python From 219193a04c9d3fa52a5926467776c4ec47a5e204 Mon Sep 17 00:00:00 2001 From: Steven Xu <30362574+stevestar888@users.noreply.github.com> Date: Mon, 20 Jul 2020 19:44:07 -0400 Subject: [PATCH 100/105] add details about catching all exceptions (#213) * add details about catching all exceptions * Small grammar/wording changes --- exceptions.rst | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/exceptions.rst b/exceptions.rst index abdb571..ebeb0d5 100644 --- a/exceptions.rst +++ b/exceptions.rst @@ -62,8 +62,16 @@ trapping ALL exceptions: # Some logging if you want raise e -This can be helpful when you have no idea about the exceptions which may -be thrown by your program. +This can be helpful when you have no idea about the exceptions that may +be thrown by your program. If you are just looking to catch all execptions, +but don't actually care about what they are, you can even exclude the +``Exception as e`` part. + +Note:: catching all exceptions may have unintended consequences because catching +all exceptions may also catch the ones you want to occur; for example, in +many command-line based programs, pressing control+c will terminate the program, +but if you catch all excepts, the ``KeyboardInterrupt`` will be caught as an +exception, so pressing control+c will NOT terminate the program. ``finally`` clause ~~~~~~~~~~~~~~~~~~ From a5c450968b100561d3ce411463161f101982af61 Mon Sep 17 00:00:00 2001 From: Jordan Bonecutter <34787245+jordan-bonecutter@users.noreply.github.com> Date: Sun, 16 Aug 2020 20:33:46 -0700 Subject: [PATCH 101/105] Unnecessary #include statement (#216) No stdio functions were used in this file. --- python_c_extension.rst | 2 -- 1 file changed, 2 deletions(-) diff --git a/python_c_extension.rst b/python_c_extension.rst index 5f49c3b..f4cf5d4 100644 --- a/python_c_extension.rst +++ b/python_c_extension.rst @@ -36,8 +36,6 @@ Simple C code to add two numbers, save it as ``add.c`` //sample C file to add 2 numbers - int and floats - #include - int add_int(int, int); float add_float(float, float); From 13764ad2b2e848495b567910770e7a25dd72ea92 Mon Sep 17 00:00:00 2001 From: Yasoob Khalid Date: Thu, 20 Aug 2020 01:11:21 -0400 Subject: [PATCH 102/105] new book released --- _templates/breadcrumbs.html | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/_templates/breadcrumbs.html b/_templates/breadcrumbs.html index a988ecd..f3f3b94 100644 --- a/_templates/breadcrumbs.html +++ b/_templates/breadcrumbs.html @@ -25,7 +25,14 @@ {% endif %}
- +
+

New book released!

+

Hi! I just released the alpha version of my new book; Practical Python Projects. + Learn more about it + on my blog. In 325+ pages, I will teach you how to implement 12 end-to-end projects. + You can buy it from Feldroy.com. +

+
    {% block breadcrumbs %}
  • {{ _('Docs') }} »
  • From 0bc5da8d01ddfc766297e82dd106ff3549eac67c Mon Sep 17 00:00:00 2001 From: John <66183716+just-linux@users.noreply.github.com> Date: Mon, 14 Sep 2020 15:40:24 -0500 Subject: [PATCH 103/105] Correct minor underline build complaints (#219) * Correct minor underline build complaints * Correct minor underline build complaints, additional file --- context_managers.rst | 2 +- decorators.rst | 4 ++-- for_-_else.rst | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/context_managers.rst b/context_managers.rst index 5a0f9d0..261ebd6 100644 --- a/context_managers.rst +++ b/context_managers.rst @@ -36,7 +36,7 @@ Let's see how we can implement our own Context Manager. This should allow us to understand exactly what's going on behind the scenes. Implementing a Context Manager as a Class: -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ At the very least a context manager has an ``__enter__`` and ``__exit__`` method defined. Let's make our own file-opening Context diff --git a/decorators.rst b/decorators.rst index 3389728..30509fe 100644 --- a/decorators.rst +++ b/decorators.rst @@ -273,7 +273,7 @@ Now let's take a look at the areas where decorators really shine and their usage makes something really easy to manage. Authorization -~~~~~~~~~~~~ +~~~~~~~~~~~~~ Decorators can help to check whether someone is authorized to use an endpoint in a web application. They are extensively used in Flask web @@ -296,7 +296,7 @@ authentication: return decorated Logging -~~~~~~~~~~~~ +~~~~~~~ Logging is another area where the decorators shine. Here is an example: diff --git a/for_-_else.rst b/for_-_else.rst index 9a68363..f7fbe82 100644 --- a/for_-_else.rst +++ b/for_-_else.rst @@ -1,5 +1,5 @@ ``for/else`` ----------- +------------ Loops are an integral part of any language. Likewise ``for`` loops are an important part of Python. However there are a few things which most @@ -22,7 +22,7 @@ That is the very basic structure of a ``for`` loop. Now let's move on to some of the lesser known features of ``for`` loops in Python. ``else`` Clause -^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^ ``for`` loops also have an ``else`` clause which most of us are unfamiliar with. The ``else`` clause executes after the loop completes normally. From 9b6262eed638dd2f5960fb959def6fe981b0b40c Mon Sep 17 00:00:00 2001 From: Keith Kong Hei Lok <70051933+LittleBigKeith@users.noreply.github.com> Date: Mon, 21 Sep 2020 01:31:31 +0800 Subject: [PATCH 104/105] Create zip.md (#218) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Create zip.md Create new file for 'zip' function * Converted to reStructured * added zip to the index Co-authored-by: M.Yasoob Ullah Khalid ☺ Co-authored-by: Yasoob Khalid --- index.rst | 1 + zip.rst | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 zip.rst diff --git a/index.rst b/index.rst index 224ae75..b45de64 100644 --- a/index.rst +++ b/index.rst @@ -50,6 +50,7 @@ Table of Contents virtual_environment collections enumerate + zip object_introspection comprehensions exceptions diff --git a/zip.rst b/zip.rst new file mode 100644 index 0000000..947fe2a --- /dev/null +++ b/zip.rst @@ -0,0 +1,71 @@ +Zip and unzip +------------- + +**Zip** + +Zip is a useful function that allows you to combine two lists easily. + +After calling zip, an iterator is returned. In order to see the content wrapped inside, we need to first convert it to a list. + +Example: + +.. code:: python + + first_name = ['Joe','Earnst','Thomas','Martin','Charles'] + + last_name = ['Schmoe','Ehlmann','Fischer','Walter','Rogan','Green'] + + age = [23, 65, 11, 36, 83] + + print(list(zip(first_name,last_name, age))) + + # Output + # + # [('Joe', 'Schmoe', 23), ('Earnst', 'Ehlmann', 65), ('Thomas', 'Fischer', 11), ('Martin', 'Walter', 36), ('Charles', 'Rogan', 83)] + +One advantage of zip is that it improves readability of for loops. + +For example, instead of needing multiple inputs, you only need one zipped list for the following for loop: + +.. code:: python + + first_name = ['Joe','Earnst','Thomas','Martin','Charles'] + last_name = ['Schmoe','Ehlmann','Fischer','Walter','Rogan','Green'] + age = [23, 65, 11, 36, 83] + + for first_name, last_name, age in zip(first_name, last_name, age): + print(f"{first_name} {last_name} is {age} years old") + + # Output + # + # Joe Schmoe is 23 years old + # Earnst Ehlmann is 65 years old + # Thomas Fischer is 11 years old + # Martin Walter is 36 years old + # Charles Rogan is 83 years old + +**Unzip** + +We can use the `zip` function to unzip a list as well. This time, we need an input of a list with an asterisk before it. + +The outputs are the separated lists. + +Example: + +.. code:: python + + full_name_list = [('Joe', 'Schmoe', 23), + ('Earnst', 'Ehlmann', 65), + ('Thomas', 'Fischer', 11), + ('Martin', 'Walter', 36), + ('Charles', 'Rogan', 83)] + + first_name, last_name, age = list(zip(*full_name_list)) + print(f"first name: {first_name}\nlast name: {last_name} \nage: {age}") + + # Output + + # first name: ('Joe', 'Earnst', 'Thomas', 'Martin', 'Charles') + # last name: ('Schmoe', 'Ehlmann', 'Fischer', 'Walter', 'Rogan') + # age: (23, 65, 11, 36, 83) + From 257709f4acb61539bf654fc6a5b72ac5e2c86ba0 Mon Sep 17 00:00:00 2001 From: absara <105458799+Abidi-S@users.noreply.github.com> Date: Fri, 18 Nov 2022 07:42:25 +0000 Subject: [PATCH 105/105] Global and Return edits (#232) * replaced "&" with "and" in article heading * fixed minor typos --- global_&_return.rst | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/global_&_return.rst b/global_&_return.rst index 39a75d4..0661752 100644 --- a/global_&_return.rst +++ b/global_&_return.rst @@ -1,9 +1,9 @@ -Global & Return +Global and Return --------------- -You might have encountered some functions written in python which have a +You might have encountered some functions written in Python which have a ``return`` keyword in the end of the function. Do you know what it does? It -is similar to return in other languages. Lets examine this little +is similar to return in other languages. Let's examine this little function: .. code:: python @@ -15,7 +15,7 @@ function: print(result) # Output: 8 -The function above takes two values as input and then output their +The function above takes two values as input and then outputs their addition. We could have also done: .. code:: python @@ -28,11 +28,11 @@ addition. We could have also done: print(result) # Output: 8 -So first lets talk about the first bit of code which involves the +So first let's talk about the first bit of code which involves the ``return`` keyword. What that function is doing is that it is assigning the value to the variable which is calling that function which in our -case is ``result``. In most cases and you won't need to use the -``global`` keyword. However lets examine the other bit of code as well +case is ``result``. In most cases you won't need to use the +``global`` keyword. However, let's examine the other bit of code as well which includes the ``global`` keyword. So what that function is doing is that it is making a global variable ``result``. What does global mean here? Global variable means that we can access that variable outside the @@ -125,11 +125,11 @@ Or by more common convention: print(profile_age) # Output: 30 -Keep in mind that even in the above example we are returning a tuple (despite the lack of paranthesis) and not separate multiple values. If you want to take it one step further, you can also make use of `namedtuple `_. Here is an example: +Keep in mind that even in the above example we are returning a tuple (despite the lack of parenthesis) and not separate multiple values. If you want to take it one step further, you can also make use of `namedtuple `_. Here is an example: .. code:: python - from collections import namedtuple + from collections import namedtuple def profile(): Person = namedtuple('Person', 'name age') return Person(name="Danny", age=31) @@ -157,4 +157,4 @@ Keep in mind that even in the above example we are returning a tuple (despite th print(age) #31 -This is a better way to do it along with returning ``lists`` and ``dicts``. Don't use ``global`` keyword unless you know what you are doing. ``global`` might be a better option in a few cases but is not in most of them. +This is a better way to do it, along with returning ``list`` and ``dict``. Don't use ``global`` keyword unless you know what you are doing. ``global`` might be a better option in a few cases but is not in most of them.