From 8c5459e5c9462a6dc86b2efb2f9194af5b35c9f4 Mon Sep 17 00:00:00 2001 From: Josh McCullough Date: Mon, 24 Aug 2015 11:44:51 -0400 Subject: [PATCH 01/76] 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 02/76] 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 9410a38e790feb14314d65017866aff6a27e681c Mon Sep 17 00:00:00 2001 From: Victor Shih Date: Mon, 21 May 2018 09:43:45 -0700 Subject: [PATCH 03/76] 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 04/76] 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 05/76] 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 06/76] 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 07/76] 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 08/76] 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 09/76] 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 10/76] 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 11/76] 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 12/76] 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 13/76] 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 14/76] 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 15/76] 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 16/76] 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 17/76] 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 18/76] 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 19/76] 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 20/76] 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 21/76] 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 22/76] 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 23/76] 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 24/76] 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 25/76] 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 26/76] 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 27/76] 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 28/76] 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 29/76] 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 30/76] 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 31/76] 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 32/76] 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 33/76] 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 34/76] 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 35/76] 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 36/76] 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 37/76] 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 38/76] 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 39/76] 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 40/76] 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 41/76] 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 42/76] 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 43/76] 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 44/76] 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 45/76] 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 46/76] 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 47/76] 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 48/76] 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 49/76] 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 50/76] 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 51/76] 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 52/76] 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 53/76] 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 54/76] 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 55/76] 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 56/76] 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 57/76] 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 58/76] 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 59/76] 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 60/76] 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 61/76] 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 62/76] 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 63/76] 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 64/76] 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 65/76] 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 66/76] 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 67/76] 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 68/76] 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 69/76] 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 70/76] 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 71/76] 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 72/76] 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 73/76] 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 74/76] 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 75/76] 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 76/76] 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.