{"id":12054,"date":"2016-04-28T16:15:11","date_gmt":"2016-04-28T13:15:11","guid":{"rendered":"http:\/\/www.webcodegeeks.com\/?p=12054"},"modified":"2018-06-20T16:35:08","modified_gmt":"2018-06-20T13:35:08","slug":"best-way-learn-python","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/","title":{"rendered":"Best way to learn Python"},"content":{"rendered":"<p>In this article, we&#8217;ll talk about the most efficient way to learn Python. Of course, this article will be really subjective, as it is only based on my personal experience.<\/p>\n<p>I&#8217;ve started learning Python from it&#8217;s 3.4 version. I&#8217;ve never actually worked with previous versions, although I coded a little bit just to satisfy my curiosity. Still, the difficulty of every subject here is based on my experience with Python 3.4, the results may vary if you work with other versions.<\/p>\n<p>Python is a high-level, object oriented, interpreted programming language. It was created by Guido van Rossum, and its source code is available under the GNU General Public License.<\/p>\n<p>It\u2019s a great language for the beginner-level programmers and supports the development of a wide range of applications from simple text processing to big web applications and even games.<\/p>\n<p>[ulp id=&#8217;R7QVpFMZmjosABLC&#8217;]<\/p>\n<p>This language has a lot of awesome features:<\/p>\n<ul>\n<li>It\u2019s easy to learn, as there are few keywords and it has a simple structure and a clearly defined syntax.<\/li>\n<li>It\u2019s easy to read, as Python code is more clearly defined and visible to the eyes.<\/li>\n<li>Its code is fairly easy to maintain.<\/li>\n<li>It has a broad standard library that is very portable and cross-platform compatible with UNIX, Windows and Macintosh.<\/li>\n<li>It has an interactive mode which allows interactive testing and debugging of snippets of code.<\/li>\n<li>It can run on a wide variety of hardware platforms and has the same interface on all platforms.<\/li>\n<li>You can add low-level modules to the Python interpreter. These modules enable programmers to add to or customize their tools to be more efficient.<\/li>\n<li>Python provides interfaces to all major commercial databases.<\/li>\n<li>Python supports GUI applications that can be created and ported to many system calls, libraries and windows systems, such as Windows MFC, Macintosh, and the X Window system of Unix.<\/li>\n<li>Python provides a better structure and support for large programs than shell scripting.<\/li>\n<\/ul>\n<p>Also, it supports functional programming, which is a huge plus for me at least, and it can be used as a scripting language or be compiled to build big applications too.<\/p>\n<p>It provides high-level dynamic data types and supports dynamic type checking. It also supports automatic garbage collection.<\/p>\n<div class=\"toc\">\n<h3>Table Of Contents<\/h3>\n<dl>\n<dt><a href=\"#1\">1. Environment Set Up<\/a><\/dt>\n<dt><a href=\"#2\">2. An Extensive Introduction<\/a><\/dt>\n<dt><a href=\"#3\">3. Some Functions<\/a><\/dt>\n<dt><a href=\"#4\">4. Data Structures<\/a><\/dt>\n<dt><a href=\"#5\">5. Object Oriented<\/a><\/dt>\n<dt><a href=\"#6\">6. Getting Serious<\/a><\/dt>\n<dt><a href=\"#7\">7. Conclusion<\/a><\/dt>\n<\/dl>\n<\/div>\n<h2><a name=\"1\"><\/a>1. Environment Set Up<\/h2>\n<p>First of all, we&#8217;ll talk a little bit about how to set up your development environment. I am currently working in a Linux Mint 17.2, which is basically an Ubuntu 14.04. On this platform, I just run <code>sudo apt-get install python3<\/code> and, at the time this article was written, this will install Python 3.4.3. Other ways to install Python, and support for other platforms can be found at <a href=\"https:\/\/www.python.org\/\">https:\/\/www.python.org\/<\/a>.<\/p>\n<p>If the set up is right, if you open a console and run <code>python3<\/code> you should see something like this:<\/p>\n<pre class=\"brush:bash\">$ python3\r\nPython 3.4.3 (default, Oct 14 2015, 20:28:29)\r\n[GCC 4.8.4] on linux\r\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\r\n&gt;&gt;&gt;\r\n<\/pre>\n<p>This is the Python REPL (read\u2013eval\u2013print loop). This is an interactive language shell. You can write Python code there and execute it. Let&#8217;s see:<\/p>\n<pre class=\"brush:bash\">$ python3\r\nPython 3.4.3 (default, Oct 14 2015, 20:28:29)\r\n[GCC 4.8.4] on linux\r\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\r\n&gt;&gt;&gt; print(\"hello world!\")\r\nhello world!\r\n&gt;&gt;&gt; for i in range(10):\r\n...   print(i)\r\n...\r\n0\r\n1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n&gt;&gt;&gt;\r\n<\/pre>\n<h2><a name=\"2\"><\/a>2. An Extensive Introduction<\/h2>\n<p>If you don&#8217;t know anything about programming, <a href=\"https:\/\/www.codecademy.com\/learn\">codecademy<\/a> has a great course about Python, which will show you the basics, both about the language and about programming.<\/p>\n<p>Now, what I&#8217;d do first, If I am new to the language, but I know at least a little bit about programming, is to find a more extensive introduction to Python. I wrote what I think is an extensive, but concise example of Python <a href=\"https:\/\/www.webcodegeeks.com\/python\/python-tutorial-beginners\/\">here<\/a>. In that example you&#8217;ll find:<\/p>\n<ul>\n<li>An introduction to the language, which gives an overview about it&#8217;s implementations, it&#8217;s purposes, it&#8217;s pros and some cons.<\/li>\n<li>An introduction to the code, and the available ways there are to execute scripts.<\/li>\n<li>An overview of variables, primitive types (str, bool, int, float, long, complex), operators and data structures, with some examples and good practices which will give you an idea of how to work with data in Python.<\/li>\n<li>An extensive explanation of flow control structures, where the example actually starts to get interesting with a decimal to binary numbers translator and an example of how to read and write data to a file.<\/li>\n<li>A good introduction to functions, which is basically the core of Python. This section will talk about some awesome features Python&#8217;s functions provide, and some &#8220;gotchas&#8221; you should keep in mind.<\/li>\n<li>A talk about classes, which is the core of object oriented programming.<\/li>\n<li>And at last, a good, complete example which will make use of most of the subjects it talks about.<\/li>\n<\/ul>\n<p>After you read that example you will be able to do some really awesome stuff, like:<\/p>\n<p><span style=\"text-decoration: underline;\"><em>fibonacci.py<\/em><\/span><\/p>\n<pre class=\"brush:bash\">_cache = {\r\n    0: 0,\r\n    1: 1\r\n}\r\n\r\ndef fibonacci(i):\r\n    if i &lt; 0:\r\n        return None\r\n    if i not in _cache:\r\n        _cache[i] = fibonacci(i - 1) + fibonacci(i - 2)\r\n    return _cache[i]\r\n<\/pre>\n<p>There we defined a function that given an integer, it returns the number present in that position of the fibonacci sequence. We know the fibonacci sequence goes like (0, 1, 1, 2, 3, 5, 8, &#8230;) so if you ask for the number in the position 6 (having in mind that the first position is zero) it would return an 8.<\/p>\n<p>The algorithm is so simple and yet so beautiful. We first defined a dictionary which we&#8217;ll use as cache (that&#8217;s why it&#8217;s called <code>_cache<\/code>), with a couple default values, and then a function that receives an argument <code>i<\/code>, which first checks if <code>i<\/code> is not a key in our cache, if it is it returns the content in our cache, if it isn&#8217;t, it does a recursive call to get the two numbers in the sequence before the one that is being asked for and adds them.<\/p>\n<p>And, of course, you also have the knowledge to do that example with a non recursive solution, like this:<\/p>\n<p><span style=\"text-decoration: underline;\"><em>fibonacci.py<\/em><\/span><\/p>\n<pre class=\"brush:bash\">def fibonacci2(i):\r\n    second_last = 0\r\n    last = 1\r\n    for index in range(2, i + 1):\r\n        aux = second_last + last\r\n        second_last = last\r\n        last = aux\r\n    return last\r\n<\/pre>\n<p>If you are already familiar with these subjects, and you are looking to deepen your knowledge about the language, you should skip to the next steps.<\/p>\n<p>If not, you should read that example, and complement it with some research. <a href=\"http:\/\/stackoverflow.com\/\">Stack Overflow<\/a> is a question and answer site for professional and enthusiast programmers, here you can find some explanation about the concepts you are not familiar with. For example if you want to know what a variable is, in Stack Overflow&#8217;s search box you type <a href=\"http:\/\/stackoverflow.com\/search?q=what+is+a+variable\">what is a variable?<\/a> and one of the answers in the result will be <a href=\"http:\/\/stackoverflow.com\/questions\/1137158\/what-is-a-variable\">this one<\/a>. If the responses are too technical or advanced, you can try other similar questions and maybe even read as many answers as you can until you actually understand what they mean.<\/p>\n<p>At this point, I would also create a profile in <a href=\"https:\/\/github.com\/\">GitHub<\/a> and read about <a href=\"https:\/\/www.javacodegeeks.com\/2013\/05\/git-explained-for-beginners.html\">git<\/a>, which is a version control system. You can use git to save your code (projects, exercises, etc.) and it will also provide a history of changes and some really useful stuff. Having a GitHub account will let you share your code with friends and colleagues and they may even be able to help you or guide you when you are blocked out or anything. A facebook post is not the best way to share code.<\/p>\n<p>Of course, there are alternatives to GitHub, for private repositories, for example, <a href=\"https:\/\/about.gitlab.com\/\">GitLab<\/a> would be my first choice, althoug some people prefer <a href=\"https:\/\/bitbucket.org\/\">Bitbucket<\/a> (I&#8217;ve never actually used it, but people say it&#8217;s awesome).<\/p>\n<h2><a name=\"3\"><\/a>3. Some Functions<\/h2>\n<p>At this point you should have some strong basis of the language, so you should work on those functions to know how to work with them properly, as they are a really powerful tool and the core of Python. In essence, functions are procedures that return a value based on some given arguments. In Python, functions are first-class objects. This means that functions can be assigned to a variable, they can be defined inside another functions, they can be passed as parameters (higher-order functions), and they can return other functions (also, higher-order functions).<\/p>\n<p>I&#8217;ve actually learnt a lot about Python at <a href=\"http:\/\/www.tutorialspoint.com\/\">tutorials point<\/a>, and <a href=\"http:\/\/www.tutorialspoint.com\/python\/python_functions.htm\">here<\/a> you can find a basic but great example about functions. Most tutorials at tutorials point are based on Python 2.7, but most of the knowledge you&#8217;ll get there can be applied to more recent versions of Python, and of course, tutorials about conversions can be found almost everywhere.<\/p>\n<p>My <a href=\"https:\/\/www.webcodegeeks.com\/python\/python-decorator-tutorial\/\">Python Decorators Tutorial<\/a> will show you how powerful functions are in Python, and how you can extend their behavior without actually modifying them. Before it jumps into decorators, it will explain functions in a more detailed way. It will also explain how and why functions are first-class objects in Python, which is the main reason they are awesome.<\/p>\n<p>Another useful example to practice with functions is <a href=\"https:\/\/www.webcodegeeks.com\/python\/python-map-example\/\">this<\/a> example about the built-in function <code>map<\/code>, which is a really useful built-in function to transform iterable objects. Strictly speaking, a map function, is a function that accepts a function and an array as arguments, and applies the given function to each element of the array, returning another array with the result of each transformation. So, in other words, a map applies a transformation to each element of an array and returns the results.<\/p>\n<p>Now we have a strong knowledge about functions, we can solve more complex problem. For example, if we wanted to write a function that returns the lowest common multiple of n numbers, where n is not a fixed integer, we could do something like this:<\/p>\n<p><span style=\"text-decoration: underline;\"><em>lcm.py<\/em><\/span><\/p>\n<pre class=\"brush:python\">from functools import reduce\r\n\r\ndef greatest_common_divisor(a, b):\r\n    if b == 0:\r\n        return a\r\n    return greatest_common_divisor(b, a % b)\r\n\r\ndef _lowest_common_multiple(a, b):\r\n    return a * b \/\/ greatest_common_divisor(a, b)\r\n\r\ndef lowest_common_multiple(*args):\r\n    return reduce(_lowest_common_multiple, args)\r\n<\/pre>\n<p>Here we are using <code>reduce<\/code> from <code>functools<\/code> (if you are not familiar with this function <a href=\"https:\/\/en.wikipedia.org\/wiki\/Fold_(higher-order_function)\">wikipedia<\/a> has a good explanation about it) to combine de results of applying <code>_lowest_common_multiple<\/code> to the arguments received. That <code>_lowest_common_multiple<\/code> function, receives 2 arguments, and as you see it calls <code>greatest_common_divisor<\/code> to divide <code>a * b<\/code>, and <code>greatest_common_divisor<\/code> is a recursive function which uses the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Euclidean_algorithm\">Euclidean algorithm<\/a> to return the greatest common divisor.<\/p>\n<p>So, with this utility we can do things like:<\/p>\n<pre class=\"brush:python\">lowest_common_multiple(6, 1, 6) # 6\r\nlowest_common_multiple(2, 4, 6) # 12\r\nlowest_common_multiple(10, 8) # 40\r\nlowest_common_multiple(5, 9, 3, 7) # 315\r\n<\/pre>\n<h2><a name=\"4\"><\/a>4. Data Structures<\/h2>\n<p>Now we know functions, I would strongly recommend to deepen your knowledge of data structures, although in the example given at the beginning of this article they are pretty well explained. The most used data structures in Python are lists and dictionaries, read my <a href=\"https:\/\/www.webcodegeeks.com\/python\/python-dictionary-example\/\">Python Dictionary Example<\/a>, which explains in detail how to define a dictionary, the best way to read from it, how to write data to it and some useful built-in functions and keywords.<\/p>\n<p>Also, an <a href=\"https:\/\/www.webcodegeeks.com\/python\/python-array-example\/\">example<\/a> about a not so used data structure will come in handy, as it explains how <code>arrays<\/code> in Python work just as lists do. It will show you something actually new, but that is very familiar to you at this point. Also, the practice is never enough.<\/p>\n<p>At <a href=\"https:\/\/codility.com\/programmers\/lessons\/\">codility<\/a> you can find some really fun and awesome exercises to practice your functions, data structures, programming skills and algorithm knowledge. Keep in mind that some of the tasks are actually pretty hard, so you may take a while to solve them. If you actually have no idea of what to do there, you should practice more, maybe read about a couple subjects and then try again.<\/p>\n<p>There are a lot of exercises in codility where we can train our skills with arrays and dictionaries, but I will talk about three here.<\/p>\n<p>The first one is <a href=\"https:\/\/codility.com\/programmers\/task\/odd_occurrences_in_array\/\">Odd Ocurrences in Array<\/a>. The problem says something like:<\/p>\n<p><em>A non-empty zero-indexed array A consisting of N integers is given. The array contains an odd number of elements, and each element of the array can be paired with another element that has the same value, except for one element that is left unpaired. Write a function that, given an array A consisting of N integers fulfilling the above conditions, returns the value of the unpaired element.<\/em><\/p>\n<p>I&#8217;m sure there are more than one ways to solve this problem, but the one solution I came up with was this one:<\/p>\n<p><span style=\"text-decoration: underline;\"><em>codiliti.py<\/em><\/span><\/p>\n<pre class=\"brush:python\">def solution(array):\r\n    my_dict = {}\r\n    for i in array:\r\n        my_dict[i] = my_dict.get(i, 0) + 1\r\n    for key, value in my_dict.items():\r\n        if value % 2 &gt; 0:\r\n            return key\r\n    return None\r\n<\/pre>\n<p>Codility does not test our validation skills, so the last statement, the one that says <code>return None<\/code> will never execute. As you may know at this point, dictionaries are indexed, so they are a good option when you want to check some data that you will infer from iterating over an array without adding time complexity to your solution. And that&#8217;s what I did, I iterate over the array, and increase a counter for every number I find in the array, at last I iterate over the dictionary and return the number that appeared an odd number of times.<\/p>\n<p>In this solution I&#8217;m abusing of the <code>get<\/code> and <code>items<\/code> methods that dictionaries provide, and the fact that they are indexed.<\/p>\n<p>The second problem, <a href=\"https:\/\/codility.com\/programmers\/task\/tape_equilibrium\/\">Tape Equilibrium<\/a>, says something like this:<\/p>\n<p><em>A non-empty zero-indexed array A consisting of N integers is given. Array A represents numbers on a tape. Any integer P, such that 0 &lt; P &lt; N, splits this tape into two non-empty parts: A[0], A[1], &#8230;, A[P \u2212 1] and A[P], A[P + 1], &#8230;, A[N \u2212 1]. The difference between the two parts is the value of: |(A[0] + A[1] + &#8230; + A[P \u2212 1]) \u2212 (A[P] + A[P + 1] + &#8230; + A[N \u2212 1])|. <\/em><\/p>\n<p><em>In other words, it is the absolute difference between the sum of the first part and the sum of the second part. Write a function that, given a non-empty zero-indexed array A of N integers, returns the minimal difference that can be achieved.<\/em><\/p>\n<p>Again, I&#8217;m sure there is more than one solution, but I came out with this one:<\/p>\n<p><span style=\"text-decoration: underline;\"><em>codiliti.py<\/em><\/span><\/p>\n<pre class=\"brush:python\">def solution(array):\r\n    first_part = array[0]\r\n    second_part = sum(array[1:])\r\n    min_absolute_difference = abs(first_part - second_part)\r\n    for i in range(1, len(array) - 1):\r\n        first_part += array[i]\r\n        second_part -= array[i]\r\n        new_absolute_difference = abs(first_part - second_part)\r\n        if new_absolute_difference &lt; min_absolute_difference:\r\n            min_absolute_difference = new_absolute_difference\r\n    return min_absolute_difference\r\n<\/pre>\n<p>I create my first and second parts of the tape. The first one is only the head of the array, the second one is the sum of the tail. Then I iterate over the array, until the element before the last one, and subtract from the second part and add to the first part. I have a variable called <code>min_absolute_difference<\/code> which is updated every time I find a difference smaller than the actual value and after I iterate over the whole array, I return it. As you see, I&#8217;m exploiting the capabilities of slicing arrays and a couple built-in functions.<\/p>\n<p>The third and last exercise I&#8217;ll talk about is <a href=\"https:\/\/codility.com\/programmers\/task\/missing_integer\/\">Missing Integer<\/a>, and it says something like:<\/p>\n<p><em>Write a function that, given a non-empty zero-indexed array A of N integers, returns the minimal positive integer (greater than 0) that does not occur in A.<\/em><\/p>\n<p>I solved this problem using an algorithm that uses dictionaries like in the first exercise:<\/p>\n<p><span style=\"text-decoration: underline;\"><em>codiliti.py<\/em><\/span><\/p>\n<pre class=\"brush:python\">def solution(array):\r\n    my_dict = {}\r\n    max = 0\r\n    for i in array:\r\n        my_dict[i] = True\r\n        if i &gt; max:\r\n            max = i\r\n    for i in range(1, len(array) + 1):\r\n        if not my_dict.get(i):\r\n            return i\r\n    return max + 1\r\n<\/pre>\n<p>As you see, I am using the dictionary as a buffer to store the values I&#8217;ve already found in the array, and by the way I register the maximum value present in the array in question. Then, I iterate over a range from 1 to the length of the array plus one, and return the first number in that range that is not a key in my dictionary. If none of those elements is absent in the dictionary, then I return the maximum value of the array plus one. Here I&#8217;m only using dictionaries because they are indexed.<\/p>\n<h2><a name=\"5\"><\/a>5. Object Oriented<\/h2>\n<p>At this point, you would actually be capable of writing a really interesting program, but if it gets too big, maybe classes would be a nice way to make your program more modular. Of course, you can always solve that problem with modules, but still, a deep knowledge of classes will come handy.<\/p>\n<p>Read <a href=\"https:\/\/www.webcodegeeks.com\/python\/python-class-example\/\">this<\/a> article about classes, it explains how easy it is to write a class in Python, how an instance of a class is an object but in Python a class is also an object, which let&#8217;s you do some real fun stuff. It will talk about inheritance, and best practices and standards that the community defined to tell users of you API that some members are not meant to be accessed from outside (private members).<\/p>\n<p>Also, <a href=\"https:\/\/jeffknupp.com\/blog\/2014\/06\/18\/improve-your-python-python-classes-and-object-oriented-programming\/\">this<\/a> article about object oriented programming, is a more advanced tutorial about classes and objects in Python, if you read mine before, you could skip a couple sections and stop where you see something that doesn&#8217;t ring a bell.<\/p>\n<p>At <a href=\"http:\/\/learnpython.pbworks.com\/w\/page\/15956531\/FrontPage#Trainingtasks\">this<\/a> section, you can find some good exercises for beginners and even for advanced programmers. Some of them where actually written for Java, but you can solve them in Python, the result should finally work the same. Of course, to actually become good at anything, you should put it in practice for real. Maybe you should start a project at this point. An application that solves some kind of problem that you don&#8217;t want to do it manually.<\/p>\n<p>I, for example, when I learnt scala, made an application that took care of my accounts. I input how much money I make, how much I spend, in what, and it does some calculations that I don&#8217;t want to do and tells me how much money I can save, how much I should be able to save, when will I run out of cash, and some other useful information.<\/p>\n<p>With classes in hand, you can start doing some really interesting stuff. You can, by example, start working with threads. A really extensive example about threading and concurrency can be found <a href=\"https:\/\/www.webcodegeeks.com\/python\/python-threading-concurrency-example\/\">here<\/a>. This threading tutorial will give you an overview of the deprecated <code>_thread<\/code> module, which is no longer used after Python 2.4. Then it will walk you through the newer <code>threading<\/code> module.<\/p>\n<p>You&#8217;ll see how to extend a thread, how to get thread&#8217;s information, what is and how can you create a daemon thread, how to join threads and some concurrency utilities, like events, locking, limiting concurrent access, and thread locals. Threads are processes which run in parallel to other threads. In a utopian scenario, if you split a big process in 2 threads, these threads will run in parallel so it would take half the time.<\/p>\n<p>IBM also provides a really detailed example about threading with Python <a href=\"http:\/\/www.ibm.com\/developerworks\/aix\/library\/au-threadingpython\/\">here<\/a>, it may bee a little too advanced, but if you got this far I&#8217;m sure you can get pass this article.<\/p>\n<p>With this knowledge about functions, objects and threads in hand, there is a lot of things we can do now some more interesting things, like asynchronous programming. Let&#8217;s see:<\/p>\n<p><span style=\"text-decoration: underline;\"><em>asynch.py<\/em><\/span><\/p>\n<pre class=\"brush:python\">from threading import Thread\r\nfrom time import sleep\r\nfrom types import FunctionType\r\n\r\nimport datetime\r\n\r\n\r\ndef asynchronous_task(callback: FunctionType):\r\n    sleep(3)\r\n    callback()\r\n\r\nstart_time = datetime.datetime.now()\r\nt1 = Thread(target=asynchronous_task, args=[lambda: print(\"first task is done\")])\r\nt2 = Thread(target=asynchronous_task, args=[lambda: print(\"second task is done\")])\r\n\r\nt1.start()\r\nt2.start()\r\n\r\nt1.join()\r\nt2.join()\r\n\r\nend_time = datetime.datetime.now()\r\nprint(\"job done in {}\".format(end_time - start_time))\r\n<\/pre>\n<p>You have 2 threads here, which are executing tasks in parallel, we can say they are asynchronous as they receive callbacks so we can run them, tell them what to do when they finish and continue with our execution on the main thread. When we run the script we&#8217;ll see:<\/p>\n<pre class=\"brush:bash\">second task is done\r\nfirst task is done\r\njob done in 0:00:03.003682\r\n<\/pre>\n<p>As you see, the script is taking a little more than 3 seconds to run, which proves these tasks are being run in parallel as they are both sleeping for three seconds.<\/p>\n<p>Once you get the hang of threads, you can learn the basics of sockets with <a href=\"https:\/\/www.webcodegeeks.com\/python\/python-sockets-example\/\">this<\/a> tutorial, which will explain in detail sockets, it&#8217;s perks and best practices. Sockets are behind any kind of network communications done by your computer.<\/p>\n<p>We all know that, when you type a url in your browser, it\u2019s connecting to a server somewhere in the world which receives a request, returns a response and then the connection is closed. All of this is made through sockets, always. It doesn\u2019t matter if your are communicating through HTTP, UDP or whatever, there is a socket behind every one of those protocols.<\/p>\n<p>Once you read this article you should jump into <a href=\"https:\/\/www.webcodegeeks.com\/python\/python-network-programming-tutorial\/\">network programming<\/a> and learn how to write a p2p messenger and a simple chat room.<\/p>\n<p>Then, as you are getting into big applications, I would recommend reading <a href=\"https:\/\/www.webcodegeeks.com\/python\/python-logging-example\/\">this<\/a> article about logging, which is necessary, as <code>print<\/code> is not the best option to show information about your program. When you have an application that it is not you the one that uses it, most of the time you&#8217;ll need something that tells you what the application is doing, how, how long does it take it, if it fails and if it does why. The <code>logging<\/code> module provides a pretty straight forward solution to this problem, and you will find that it is quite easy to make your application log.<\/p>\n<p>After you&#8217;ve done all of this, you will find it very easy to integrate with a big web framework as Django, and you can use <a href=\"https:\/\/www.webcodegeeks.com\/python\/python-django-tutorial\/\">this<\/a> article as a cheat sheet. The article will walk you through the basics of this complete web framework, and with a little more research in <a href=\"https:\/\/docs.djangoproject.com\/en\/1.9\/\">Django&#8217;s docs<\/a> you will be able to build your first full, productive web application with Python. Django is an open source web framework which solves most common problems of a web application development.<\/p>\n<p>It has some very useful features like an auto generated admin page and an ORM. It\u2019s a high-level framework, so we just need to focus on the actual core logic of our business and let Django take care of mappings, filters and such. It works by defining some standards that, if you follow them, will make the application\u2019s development so much easier and faster.<\/p>\n<p>A good alternative, more lightweight but also minimal, to Django is <a href=\"http:\/\/flask.pocoo.org\/\">Flask<\/a>, I found out that Flask is easy to setup, runs fine. <a href=\"http:\/\/klen.github.io\/py-frameworks-bench\/\">Here<\/a> you can find a benchmark that compares some response times of a lot of Python frameworks in some interesting scenarios. You&#8217;ll find that Django and Flask behave almost the same, even Flask wins in a couple scenarios.<\/p>\n<h2><a name=\"6\"><\/a>6. Getting Serious<\/h2>\n<p>Now, if you&#8217;ve got this far, you are probably starting to think about writing a big project, like a product, that you may be able to sell or at least make popular. You might be thinking about looking for a job to use these new skills. You would recommend having <a href=\"https:\/\/docs.python.org\/3.4\/\">Python&#8217;s docs<\/a> in speed dial, get the hang of Stack Overflow and prepare yourself to learn a lot. Every project, every new project you face, has something new to teach you.<\/p>\n<p>If it&#8217;s big you may learn how important it is to make modular and testable code. If it gets really popular you will learn about concurrency and performance. If it&#8217;s open source you will learn about reading someone else&#8217;s code, and writing code that is readable by anyone (this one is <strong>REALLY<\/strong> important) (that&#8217;s my first bold text in this article, that&#8217;s how important readable code is).<\/p>\n<p>A good activity to get really fluent with a language is to see some GitHub projects written in it and try to understand what they are doing and how are they doing it. Maybe, if it&#8217;s an open source project, you could contribute to it, an example of a contribution of mine is <a href=\"https:\/\/github.com\/jfarcand\/WCS\/pull\/17\">this pull request<\/a> I made for a web socket client which didn&#8217;t have support for Scala 2.11, so I implemented it as I was learning Scala myself, the issue is <a href=\"https:\/\/github.com\/jfarcand\/WCS\/issues\/16\">this one<\/a>. The process can be pretty long, it gets worse if you and the owner of the project are in different timezones, but once it gets done it is really awesome to see people use a tool you contributed to.<\/p>\n<p>I think at this point I have no more guidance to give. Keep in mind that by doing you learn. The more you read, the more prepared you are to face new problems, so sit down, open google and start researching. The most stupid idea, the most stupid problem you can think of, I can guarantee that if you write a program that solves it, you will learn something new from it.<\/p>\n<p>Spend time updating you knowledge, join a programming community, if you are from Argentina, for example, there is <a href=\"http:\/\/www.python.org.ar\/\">PyAr<\/a>, which is a pretty big, nerd, awesome community.<\/p>\n<p>A programming community has a lot to give you, you will know whenever a new update is coming, a new big useful framework\/library gets released, a good convention is near and more. It will help you keep updated and interested, you will be able to socialize with awesome, really smart and experienced people, and even help newbies (it sounds like an insult, but I don&#8217;t see it that way) get to speed. You should never underestimate a community.<\/p>\n<h2><a name=\"7\"><\/a>7. Conclusion<\/h2>\n<p>Python is, in my humble opinion, the perfect language for the beginners level of programmers. If I had to tell someone which language should he\/she use to learn programming from scratch, I would automatically say &#8220;Python!&#8221;. Also, it really is powerful, you can write web applications that will perform just as good as in any other language, you just have to keep in mind the existence of the GIL and try not to do long blocking operations inside it, which is not a difficult task once you get the hang of the language.<\/p>\n<p>So, that&#8217;s it. Python is one of my favourite languages, it&#8217;s actually my second favourite. I have a lot of fun coding with it, I think it&#8217;s really versatile and powerful. I hope you have fun with it too. Thanks for reading!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this article, we&#8217;ll talk about the most efficient way to learn Python. Of course, this article will be really subjective, as it is only based on my personal experience. I&#8217;ve started learning Python from it&#8217;s 3.4 version. I&#8217;ve never actually worked with previous versions, although I coded a little bit just to satisfy my &hellip;<\/p>\n","protected":false},"author":109,"featured_media":1651,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[53],"tags":[],"class_list":["post-12054","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Best way to learn Python - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"Interested to learn more about python? Check out our article how to learn Python which is a high-level, object oriented, interpreted programming language!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Best way to learn Python - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"Interested to learn more about python? Check out our article how to learn Python which is a high-level, object oriented, interpreted programming language!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/sgvinci\" \/>\n<meta property=\"article:published_time\" content=\"2016-04-28T13:15:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-06-20T13:35:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Sebastian Vinci\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@sebastianvinci_\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sebastian Vinci\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/\"},\"author\":{\"name\":\"Sebastian Vinci\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/06a43c63e373dff2e159bbc029b405aa\"},\"headline\":\"Best way to learn Python\",\"datePublished\":\"2016-04-28T13:15:11+00:00\",\"dateModified\":\"2018-06-20T13:35:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/\"},\"wordCount\":4101,\"commentCount\":4,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"articleSection\":[\"Python\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/\",\"name\":\"Best way to learn Python - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"datePublished\":\"2016-04-28T13:15:11+00:00\",\"dateModified\":\"2018-06-20T13:35:08+00:00\",\"description\":\"Interested to learn more about python? Check out our article how to learn Python which is a high-level, object oriented, interpreted programming language!\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Python\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/python\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Best way to learn Python\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/06a43c63e373dff2e159bbc029b405aa\",\"name\":\"Sebastian Vinci\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/12d0233b49dd2a282330a987b16e81c3fbd4a8a8f5d5338348a6edd47cfff99e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/12d0233b49dd2a282330a987b16e81c3fbd4a8a8f5d5338348a6edd47cfff99e?s=96&d=mm&r=g\",\"caption\":\"Sebastian Vinci\"},\"description\":\"Sebastian is a full stack programmer, who has strong experience in Java and Scala enterprise web applications. He is currently studying Computers Science in UBA (University of Buenos Aires) and working a full time job at a .com company as a Semi-Senior developer, involving architectural design, implementation and monitoring. He also worked in automating processes (such as data base backups, building, deploying and monitoring applications).\",\"sameAs\":[\"http:\/\/www.webcodegeeks.com\/\",\"https:\/\/www.facebook.com\/sgvinci\",\"https:\/\/x.com\/sebastianvinci_\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/sebastian-vinci\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Best way to learn Python - Web Code Geeks - 2026","description":"Interested to learn more about python? Check out our article how to learn Python which is a high-level, object oriented, interpreted programming language!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/","og_locale":"en_US","og_type":"article","og_title":"Best way to learn Python - Web Code Geeks - 2026","og_description":"Interested to learn more about python? Check out our article how to learn Python which is a high-level, object oriented, interpreted programming language!","og_url":"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_author":"https:\/\/www.facebook.com\/sgvinci","article_published_time":"2016-04-28T13:15:11+00:00","article_modified_time":"2018-06-20T13:35:08+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","type":"image\/jpeg"}],"author":"Sebastian Vinci","twitter_card":"summary_large_image","twitter_creator":"@sebastianvinci_","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Sebastian Vinci","Est. reading time":"22 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/"},"author":{"name":"Sebastian Vinci","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/06a43c63e373dff2e159bbc029b405aa"},"headline":"Best way to learn Python","datePublished":"2016-04-28T13:15:11+00:00","dateModified":"2018-06-20T13:35:08+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/"},"wordCount":4101,"commentCount":4,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","articleSection":["Python"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/","url":"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/","name":"Best way to learn Python - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","datePublished":"2016-04-28T13:15:11+00:00","dateModified":"2018-06-20T13:35:08+00:00","description":"Interested to learn more about python? Check out our article how to learn Python which is a high-level, object oriented, interpreted programming language!","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/11\/python-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/python\/best-way-learn-python\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Python","item":"https:\/\/www.webcodegeeks.com\/category\/python\/"},{"@type":"ListItem","position":3,"name":"Best way to learn Python"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/06a43c63e373dff2e159bbc029b405aa","name":"Sebastian Vinci","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/12d0233b49dd2a282330a987b16e81c3fbd4a8a8f5d5338348a6edd47cfff99e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/12d0233b49dd2a282330a987b16e81c3fbd4a8a8f5d5338348a6edd47cfff99e?s=96&d=mm&r=g","caption":"Sebastian Vinci"},"description":"Sebastian is a full stack programmer, who has strong experience in Java and Scala enterprise web applications. He is currently studying Computers Science in UBA (University of Buenos Aires) and working a full time job at a .com company as a Semi-Senior developer, involving architectural design, implementation and monitoring. He also worked in automating processes (such as data base backups, building, deploying and monitoring applications).","sameAs":["http:\/\/www.webcodegeeks.com\/","https:\/\/www.facebook.com\/sgvinci","https:\/\/x.com\/sebastianvinci_"],"url":"https:\/\/www.webcodegeeks.com\/author\/sebastian-vinci\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/12054","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/109"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=12054"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/12054\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/1651"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=12054"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=12054"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=12054"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}