Jekyll2021-07-28T16:35:10+00:00http://adnan-alam.github.io/feed.xmlAdnan AlamSelf taught programmer | PythonistaTesting Your Django App With pytest - A Beginner’s Guide2021-07-28T00:00:00+00:002021-07-28T00:00:00+00:00http://adnan-alam.github.io/django-pytest-beginner<p><strong>pytest</strong> is a very mature testing tool for testing Python and Django based projects.</p>
<p>These are two of my blog posts on testing Django app with pytest:</p>
<ul>
<li>Testing Your Django App With pytest : A Beginner’s Guide (Part 1) https://blog.dreamcatcherit.com/wp/2020/01/02/testing-your-django-app-with-pytest-a-beginners-guide-part-1/</li>
<li>Testing Your Django App With pytest : A Beginner’s Guide (Part 2) https://blog.dreamcatcherit.com/wp/2020/01/13/testing-your-django-app-with-pytest-a-beginners-guide-part-2/</li>
</ul>
<p>I hope these posts help you to give a basic overview of pytest. See you next time!</p>pytest is a very mature testing tool for testing Python and Django based projects.Datetime module - working with date and time2017-12-09T00:00:00+00:002017-12-09T00:00:00+00:00http://adnan-alam.github.io/datetime<p>Among many built-in modules in Python one module we use frequently is <strong>datetime</strong> module. So , today I’m gonna share what I’ve learned about <strong>datetime</strong> module and how to use it.</p>
<p>Why should we use <strong>datetime</strong> module ? This question may have arrived in your mind, the ans is- if you want to work with date and time , manipulate them and format them for better user experiences in Python , you should get your hands dirty working with this specific module.</p>
<p>Okay, first let’s import the <strong>datetime</strong> module</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">datetime</span>
</code></pre></div></div>
<p>Now, if you want to output any arbitrary date in the standard form like: <strong>yy-mm-dd</strong> ; then we will need to work with <strong>datetime.date()</strong> which is basically a class which is derived from <strong>datetime</strong> module and takes the arguments as year, month and date respectively,</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">datetime</span>
<span class="n">date_1</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">date</span><span class="p">(</span><span class="mi">2017</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">7</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">date_1</span><span class="p">)</span>
</code></pre></div></div>
<p>in the 2nd line we’re passing the arguments- 2017, 12 and 7 which are year, month and date respectively ; at the 3rd line we’re printing that and the result is something like this:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">>>></span> <span class="mi">2017</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">07</span>
</code></pre></div></div>
<p>What about you don’t remember what is date of today ? No need to worry, cause <strong>datetime.date.today()</strong> can do that for you!</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">tday</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">date</span><span class="p">.</span><span class="n">today</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="n">tday</span><span class="p">)</span>
<span class="o">>>></span> <span class="mi">2017</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">07</span>
</code></pre></div></div>
<p>We want to know which weekday is today ,there are two classes <strong>weekday() and isoweekday()</strong> to do that work for us. In Python each weekday is equal to a specific number. The <strong>weekday()</strong> class considers day as (mon=0, tue=1, wed=2, thu=3, fri=4, sat= 5, sun=6) but <strong>isoweekday()</strong> class do as (mon=1, tue=2, wed=3, thu=4, fri=5, sat= 6, sun=7).</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">print</span><span class="p">(</span><span class="n">tday</span><span class="p">.</span><span class="n">weekday</span><span class="p">())</span>
<span class="o">>>></span> <span class="mi">3</span> <span class="c1"># the date is 2017-12-07 and day is Thursday and which is equal to 3
</span>
<span class="k">print</span><span class="p">(</span><span class="n">tday</span><span class="p">.</span><span class="n">isoweekday</span><span class="p">())</span>
<span class="o">>>></span> <span class="mi">4</span> <span class="c1"># as this class considers Thursday=4
</span></code></pre></div></div>
<p>To find out the difference between two date and time we can use <strong>datetime.timdelta()</strong> ,</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">tday</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">date</span><span class="p">.</span><span class="n">today</span><span class="p">()</span>
<span class="n">tdelta</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">7</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">tday</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">tday</span> <span class="err">–</span> <span class="n">tdelta</span><span class="p">)</span>
<span class="o">>>></span> <span class="mi">2017</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">08</span>
<span class="o">>>></span> <span class="mi">2017</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">01</span>
</code></pre></div></div>
<p>you can use to find out how many days are remained till birthday like below one</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">birthday</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">date</span><span class="p">(</span><span class="mi">2018</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">till_birthday</span> <span class="o">=</span> <span class="n">birthday</span> <span class="err">–</span> <span class="n">tday</span>
<span class="k">print</span><span class="p">(</span><span class="err">“</span><span class="n">Days</span> <span class="n">remained</span> <span class="n">till</span> <span class="n">birthday</span><span class="p">:</span> <span class="p">{}</span><span class="err">”</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">till_birthday</span><span class="p">.</span><span class="n">days</span><span class="p">))</span>
<span class="o">>>></span> <span class="n">Days</span> <span class="n">remained</span> <span class="n">till</span> <span class="n">birthday</span><span class="p">:</span> <span class="mi">24</span>
</code></pre></div></div>
<p>the result we get from the above is actually <strong>timedelta!</strong></p>
<p>When you need to access both date and time at the same time , we can use <strong>datetime.datetime()</strong> ,</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">dt</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2017</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">100000</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">dt</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="err">“</span><span class="n">Date</span><span class="p">:</span> <span class="p">{}</span><span class="err">”</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">dt</span><span class="p">.</span><span class="n">date</span><span class="p">()))</span>
<span class="k">print</span><span class="p">(</span><span class="err">“</span><span class="n">Time</span><span class="p">:</span> <span class="p">{}</span><span class="err">”</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">dt</span><span class="p">.</span><span class="n">time</span><span class="p">()))</span>
<span class="o">>>></span> <span class="mi">2017</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">08</span> <span class="mi">09</span><span class="p">:</span><span class="mi">30</span><span class="p">:</span><span class="mf">15.100000</span>
<span class="o">>>></span> <span class="n">Date</span><span class="p">:</span> <span class="mi">2017</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">08</span>
<span class="o">>>></span> <span class="n">Time</span><span class="p">:</span> <span class="mi">09</span><span class="p">:</span><span class="mi">30</span><span class="p">:</span><span class="mf">15.100000</span>
</code></pre></div></div>
<p>Also to know what time it is right now and today’s date,</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">dt1</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">()</span>
<span class="c1"># for utc standard time
</span><span class="n">dt2</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="n">utcnow</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Datetime1: {}"</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">dt1</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Datetime2: {}"</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="n">dt2</span><span class="p">))</span>
<span class="o">>>></span> <span class="n">Datetime1</span><span class="p">:</span> <span class="mi">2017</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">27</span> <span class="mi">21</span><span class="p">:</span><span class="mi">09</span><span class="p">:</span><span class="mf">43.908397</span>
<span class="o">>>></span> <span class="n">Datetime2</span><span class="p">:</span> <span class="mi">2017</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">27</span> <span class="mi">15</span><span class="p">:</span><span class="mi">09</span><span class="p">:</span><span class="mf">43.908513</span>
</code></pre></div></div>
<p>Sometimes we have to work with timezone , so dealing with this there is a library for us which is <strong>“pytz”</strong>. As it is not built-in, we have to install it first using pip. If you don’t know what is pip, read this documentation : https://packaging.python.org/tutorials/installing-packages/</p>
<p>so first install pytz in your machine ,</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>pip <span class="nb">install </span>pytz
</code></pre></div></div>
<p>then you can import it.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">pytz</span>
</code></pre></div></div>
<p>for using a key is used which is <strong>tzinfo</strong>, and from pytz we can get UTC standard time,</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">dt_1</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">(</span><span class="mi">2017</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span><span class="n">tzinfo</span><span class="o">=</span><span class="n">pytz</span><span class="p">.</span><span class="n">UTC</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">dt_1</span><span class="p">)</span>
<span class="o">>>></span> <span class="mi">2017</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">27</span> <span class="mi">09</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mi">30</span><span class="o">+</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span>
</code></pre></div></div>
<p>We can also use specific timezone, here I’m using “Asia/Dhaka” as I’m from Bangladesh</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">dt_mytz</span> <span class="o">=</span> <span class="n">dt_1</span><span class="p">.</span><span class="n">astimezone</span><span class="p">(</span><span class="n">pytz</span><span class="p">.</span><span class="n">timezone</span><span class="p">(</span><span class="s">"Asia/Dhaka"</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="n">dt_mytz</span><span class="p">)</span>
<span class="o">>>></span> <span class="mi">2017</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">27</span> <span class="mi">15</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mi">30</span><span class="o">+</span><span class="mi">06</span><span class="p">:</span><span class="mi">00</span>
<span class="n">dt_utcnow</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="n">now</span><span class="p">(</span><span class="n">tz</span><span class="o">=</span><span class="n">pytz</span><span class="p">.</span><span class="n">timezone</span><span class="p">(</span><span class="s">"Asia/Dhaka"</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="n">dt_utcnow</span><span class="p">)</span>
<span class="o">>>></span> <span class="mi">2017</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">08</span> <span class="mi">23</span><span class="p">:</span><span class="mi">34</span><span class="p">:</span><span class="mf">19.171335</span><span class="o">+</span><span class="mi">06</span><span class="p">:</span><span class="mi">00</span>
</code></pre></div></div>
<p>for more readable format there is <strong>strftime(format)</strong> method, returns a string representing the date. There is a list of all format codes that supported by <strong>strftime(format)</strong> method here, https://docs.python.org/3/library/datetime.html</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">print</span><span class="p">(</span><span class="n">dt_utcnow</span><span class="p">.</span><span class="n">strftime</span><span class="p">(</span><span class="s">"%B %d, %Y and %I:%M %p"</span><span class="p">))</span>
<span class="o">>>></span> <span class="n">December</span> <span class="mi">08</span><span class="p">,</span> <span class="mi">2017</span> <span class="ow">and</span> <span class="mi">11</span><span class="p">:</span><span class="mi">34</span> <span class="n">PM</span>
</code></pre></div></div>
<p>Here, “%B %d, %Y and %I:%M %p” are format code for Month, day of the month, Year, Hour(12-hour-clock), Minute and AM/PM respectively.</p>
<p>If we have date and time as string we can convert it into a datetime according to given format by <strong>strptime(format)</strong> method,</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">t1</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="n">datetime</span><span class="p">.</span><span class="n">strptime</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="nb">input</span><span class="p">()),</span> <span class="s">"%a %d %b %Y %H:%M:%S %z"</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">t1</span><span class="p">)</span>
<span class="o">>>></span>
<span class="n">Sun</span> <span class="mi">10</span> <span class="n">May</span> <span class="mi">2015</span> <span class="mi">13</span><span class="p">:</span><span class="mi">54</span><span class="p">:</span><span class="mi">36</span> <span class="o">-</span><span class="mi">0700</span>
<span class="o">>>></span> <span class="mi">2015</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">10</span> <span class="mi">13</span><span class="p">:</span><span class="mi">54</span><span class="p">:</span><span class="mi">36</span><span class="o">-</span><span class="mi">07</span><span class="p">:</span><span class="mi">00</span>
</code></pre></div></div>
<p>I hope from this post you’ve got some hints how to use datetime module. To explore more , check out the official documentation: https://docs.python.org/3/library/datetime.html and also this video tutorial from Corey Schafer : https://www.youtube.com/watch?v=eirjjyP2qcQ&index=15&list=PL-osiE80TeTskrapNbzXhwoFUiLCjGgY7 . Actually , what I’ve written so far in this post is that what I’ve learned from his tutorial.</p>
<p>Any kind of question occurs in your mind regarding this post, you can comment that below. Thanks!</p>Among many built-in modules in Python one module we use frequently is datetime module. So , today I’m gonna share what I’ve learned about datetime module and how to use it.Queue (data structure) implementation using singly linked list in Python2017-08-12T00:00:00+00:002017-08-12T00:00:00+00:00http://adnan-alam.github.io/Queue-implementation-in-python<p>Today I’ll talk about how to implement <b>Queue data structure</b> using another data structure Singly linked list in Python. If you want to know how to implement Singly linked list in Python then read this previous blog post <a href="https://adnan-alam.github.io/Singly-linked-list/">Singly linked list</a>.</p>
<p>First, let’s know about Queue data structure. Queue is a particular kind of abstract type data structure, it is a <b>FIFO (First in First out)</b> data structure. In a FIFO data structure , an item inserted in first , will be removed first. Inserting an element in Queue is called <b>enqueue</b> and removing an element from it is called <b>dequeue</b>.</p>
<p><img src="/images/queue.png" alt="Queue data structure" /></p>
<p>Here I’ll show you how to enqueue , dequeue and in addition - how to get the size of queue , check if queue is empty or not, and at last how to print it as a list/array.</p>
<p>So , let’s start coding.</p>
<p>I’m gonna use Singly linked list to implement Queue data structure, so according to linked list first create a <b>Node class</b> , by which we can create an element with a given data to be enqueued in Queue.</p>
<p>In the Node class, we will set the data and next_node(i.e pointer) equal to None as parameter in <b><strong>init</strong> </b>method so that if we don’t send any data and pointer to the next node, it will return None. Then <b>get_data </b>and <b>get_next</b> methods will return the data and the next node respectively. We will add another method <b>set_next</b> which will take a new_node as a parameter and will set the pointer from previous Node towards this Node.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Node</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">data</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span><span class="n">next_node</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">data</span>
<span class="bp">self</span><span class="p">.</span><span class="n">next_node</span> <span class="o">=</span> <span class="n">next_node</span>
<span class="k">def</span> <span class="nf">get_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">.</span><span class="n">data</span>
<span class="k">def</span> <span class="nf">get_next</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">.</span><span class="n">next_node</span>
<span class="k">def</span> <span class="nf">set_next</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">new_node</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">next_node</span> <span class="o">=</span> <span class="n">new_node</span>
</code></pre></div></div>
<p>After that create another class named <b>Queue</b>, and set the head (1st element of Queue) = None as parameter in <b><strong>init</strong></b> method. Then we will insert an element at first of Queue using <b>enqueue</b> method. The enqueue method takes a data as parameter and create a Node using it. Now, we’ll check if there is any head in Queue! If it hasn’t one,we set the Node(new_item)/element created previously as head. If there is already a head i.e. there are elements in Queue. So, we will go to the end of Queue using while loop and when we find that pointer of the previous node is null, we set the pointer of last Node/element towards the Node we created.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Queue</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">head</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">head</span> <span class="o">=</span> <span class="n">head</span>
<span class="k">def</span> <span class="nf">enqueue</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">data</span><span class="p">):</span>
<span class="n">new_item</span> <span class="o">=</span> <span class="n">Node</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="n">current</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">head</span>
<span class="k">if</span> <span class="n">current</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="bp">self</span><span class="p">.</span><span class="n">head</span> <span class="o">=</span> <span class="n">new_item</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">while</span> <span class="n">current</span><span class="p">.</span><span class="n">get_next</span><span class="p">():</span>
<span class="n">current</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="n">get_next</span><span class="p">()</span>
<span class="n">current</span><span class="p">.</span><span class="n">set_next</span><span class="p">(</span><span class="n">new_item</span><span class="p">)</span>
</code></pre></div></div>
<p>Now it’s time to add a method <b>dequeue</b> to remove the first element from the Queue. First, we check whether the Queue is empty or not , if it is not empty then we set the second element of Queue as head and first element(self.head) which was initially stored in current get removed. Again, if the Queue is empty, we simply print “Queue is empty.” .</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">dequeue</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">current</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">head</span>
<span class="k">if</span> <span class="n">current</span> <span class="o">!=</span> <span class="bp">None</span><span class="p">:</span>
<span class="bp">self</span><span class="p">.</span><span class="n">head</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="n">get_next</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">print</span><span class="p">(</span><span class="s">"Queue is empty."</span><span class="p">)</span>
</code></pre></div></div>
<p>Using dunder method <strong>len</strong>, so that we can get the size of Queue using len() over the Queue we have written.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">temp</span><span class="p">)</span>
</code></pre></div></div>
<p>Let’s create another method <b>is_empty</b> which tells us whether the Queue is empty or not! If self.head(1st element of Queue) is None i.e. there is no element it returns False , else returns True.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">is_empty</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="p">.</span><span class="n">head</span> <span class="o">==</span> <span class="bp">None</span>
</code></pre></div></div>
<p>It’ll be better if can visualize the Queue as a list/array. So, this <b>print_queue</b> method gets the job done. First, just set the head/1st element to <b>current</b> variable and create an empty list which we can store in a variable , let’s name it <b>temp</b>. Now, we go through the whole Queue using while loop and every time we find an element ,just append it to temp list and go to next element. At the end print temp.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">print_queue</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">current</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">head</span>
<span class="bp">self</span><span class="p">.</span><span class="n">temp</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">while</span> <span class="n">current</span><span class="p">:</span>
<span class="bp">self</span><span class="p">.</span><span class="n">temp</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">current</span><span class="p">.</span><span class="n">get_data</span><span class="p">())</span>
<span class="n">current</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="n">get_next</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">temp</span><span class="p">)</span>
</code></pre></div></div>
<p>Okay,you see that we have implemented a Queue using Singly linked list in Python. It’s checking time whether the code works as expected.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">q</span> <span class="o">=</span> <span class="n">Queue</span><span class="p">()</span>
<span class="n">q</span><span class="p">.</span><span class="n">enqueue</span><span class="p">(</span><span class="s">"User01"</span><span class="p">)</span>
<span class="n">q</span><span class="p">.</span><span class="n">enqueue</span><span class="p">(</span><span class="s">"User02"</span><span class="p">)</span>
<span class="n">q</span><span class="p">.</span><span class="n">enqueue</span><span class="p">(</span><span class="s">"User03"</span><span class="p">)</span>
<span class="n">q</span><span class="p">.</span><span class="n">enqueue</span><span class="p">(</span><span class="s">"User04"</span><span class="p">)</span>
<span class="n">q</span><span class="p">.</span><span class="n">enqueue</span><span class="p">(</span><span class="s">"User05"</span><span class="p">)</span>
</code></pre></div></div>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">q</span><span class="p">.</span><span class="n">print_queue</span><span class="p">()</span>
<span class="o">>>></span> <span class="p">[</span><span class="s">'User01'</span><span class="p">,</span> <span class="s">'User02'</span><span class="p">,</span> <span class="s">'User03'</span><span class="p">,</span> <span class="s">'User04'</span><span class="p">,</span> <span class="s">'User05'</span><span class="p">]</span>
<span class="n">q</span><span class="p">.</span><span class="n">dequeue</span><span class="p">()</span>
<span class="n">q</span><span class="p">.</span><span class="n">print_queue</span><span class="p">()</span>
<span class="o">>>></span> <span class="p">[</span><span class="s">'User02'</span><span class="p">,</span> <span class="s">'User03'</span><span class="p">,</span> <span class="s">'User04'</span><span class="p">,</span> <span class="s">'User05'</span><span class="p">]</span>
<span class="n">q</span><span class="p">.</span><span class="n">dequeue</span><span class="p">()</span>
<span class="n">q</span><span class="p">.</span><span class="n">print_queue</span><span class="p">()</span>
<span class="o">>>></span> <span class="p">[</span><span class="s">'User03'</span><span class="p">,</span> <span class="s">'User04'</span><span class="p">,</span> <span class="s">'User05'</span><span class="p">]</span>
<span class="k">print</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">q</span><span class="p">))</span>
<span class="o">>>></span> <span class="mi">3</span>
<span class="k">print</span><span class="p">(</span><span class="n">q</span><span class="p">.</span><span class="n">is_empty</span><span class="p">())</span>
<span class="o">>>></span> <span class="bp">False</span>
</code></pre></div></div>
<p>That’s how you can implement a Queue data structure using Singly linked list in Python. Hope , my explanation helps the guys out there who are learning data structure using Python. Keep learning!</p>Today I’ll talk about how to implement Queue data structure using another data structure Singly linked list in Python. If you want to know how to implement Singly linked list in Python then read this previous blog post Singly linked list.Singly Linked list implementation in Python2017-08-01T00:00:00+00:002017-08-01T00:00:00+00:00http://adnan-alam.github.io/Singly-linked-list<p>In computer science, a linked list is a linear collection of data elements, in which linear order is not given by their physical placement in memory. Each pointing to next node by means of a pointer. It is a data structure consisting of a group of nodes which together represent a sequence. Under the simplest form, each node is composed of data and a reference (in other words, a link) to the next node in the sequence. This structure allows for efficient insertion or removal of elements from any position in the sequence during iteration.(Source: https://en.wikipedia.org/wiki/Linked_list)</p>
<p>Today I will explain how to implement a “Singly linked list” in Python, which will contain functions to insert , delete and search any item in the linked list and functions to get the size and print the whole linked list. So, first of all we should know what is a singly linked list ?</p>
<p>Singly linked list: Singly linked lists contain nodes which have a data field as well as a ‘next’ field, which points to the next node in line of nodes. Operations that can be performed on singly linked lists include insertion, deletion and traversal.</p>
<p><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/Singly-linked-list.svg/408px-Singly-linked-list.svg.png" /></p>
<h6>(A singly linked list whose nodes contain two fields: an integer value and a link to the next node, Source:https://en.wikipedia.org/wiki/Linked_list )</h6>
<p>Let’s get started!</p>
<p>First , we will create a class named “Node” which will contain a data and a pointer (which is here as next_node) to the next node. Initially we will set the data and next_node(pointer) equal to None so that if we don’t send any data and pointer to the next node, it will return None.</p>
<p>Then create two methods named “get_data” and “get_next” and will return the data and the next node respectively.
We will add another method “set_next” which will take a new node as a parameter and will set the pointer from previous node towards this node.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Node</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">data</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span><span class="n">next_node</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">data</span> <span class="o">=</span> <span class="n">data</span>
<span class="bp">self</span><span class="p">.</span><span class="n">next_node</span> <span class="o">=</span> <span class="n">next_node</span>
<span class="k">def</span> <span class="nf">get_data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">.</span><span class="n">data</span>
<span class="k">def</span> <span class="nf">get_next</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="p">.</span><span class="n">next_node</span>
<span class="k">def</span> <span class="nf">set_next</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">new_node</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">next_node</span> <span class="o">=</span> <span class="n">new_node</span>
</code></pre></div></div>
<p>Now, create a class Linked_list and set the head of the list to None in the <strong>init</strong> method.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Linked_list</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">head</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
<span class="bp">self</span><span class="p">.</span><span class="n">head</span> <span class="o">=</span> <span class="n">head</span>
</code></pre></div></div>
<p>Add a method “insert_head” , first it will take a data and create a Node by it and set it to the variable new_node. Then set the pointer of this node towards the next node by sending self.head as parameter. As at the beginning the head is None so the pointer will be set to the None. Now, we will set the node we created as head. So, what does this method do ? The method take data and insert is as head in the linked list.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">insert_head</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">data</span><span class="p">):</span>
<span class="n">new_node</span> <span class="o">=</span> <span class="n">Node</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="n">new_node</span><span class="p">.</span><span class="n">set_next</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">head</span><span class="p">)</span>
<span class="bp">self</span><span class="p">.</span><span class="n">head</span> <span class="o">=</span> <span class="n">new_node</span>
</code></pre></div></div>
<p>A question can come across your mind, can I insert data as tail ? The answer is yes ,so let’s see how to do it!</p>
<p>This “insert_tail” method take a data and make a node from it and set it to the variable. Now , two things to be considered. What to do if the list is empty ? Or the list is not empty ? So at first we check if head is None and if it is then we are assured that list is empty and we set the node as head(because there must be an element to add another element as tail). But if head is not None then the list isn’t empty and we traverse the list using the get_next method to go to the end of it. When we find that pointer of the previous node is null, we set the pointer towards the node we created. Yeah! we have inserted an element in the list as tail.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">insert_tail</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">data</span><span class="p">):</span>
<span class="n">new_node</span> <span class="o">=</span> <span class="n">Node</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="n">current</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">head</span>
<span class="k">if</span> <span class="n">current</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
<span class="bp">self</span><span class="p">.</span><span class="n">head</span> <span class="o">=</span> <span class="n">new_node</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">while</span> <span class="n">current</span><span class="p">.</span><span class="n">get_next</span><span class="p">():</span>
<span class="n">current</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="n">get_next</span><span class="p">()</span>
<span class="n">current</span><span class="p">.</span><span class="n">set_next</span><span class="p">(</span><span class="n">new_node</span><span class="p">)</span>
</code></pre></div></div>
<p>To delete an element from the linked list create a method named “delete” which takes a data you want to delete as a parameter. Set head to the variable current and create variable prev which will store the previous element , initially it is equal to None. Now, we traverse through the list to check whether it contains our data or not, if the data is in any Node then we check if there is any previous Node of the Node that contains our data. If there is any previous Node then we set the pointer of the previous Node to the next Node of our data. If there is no previous Node that means our data is the head so we set the next element as head. If we don’t find the data then we go to the next Node by setting current Node to prev variable and next Node of the current Node to current variable</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">delete</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">data</span><span class="p">):</span>
<span class="n">current</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">head</span>
<span class="n">prev</span> <span class="o">=</span> <span class="bp">None</span>
<span class="k">while</span> <span class="n">current</span><span class="p">:</span>
<span class="k">if</span> <span class="n">current</span><span class="p">.</span><span class="n">get_data</span><span class="p">()</span> <span class="o">==</span> <span class="n">data</span><span class="p">:</span>
<span class="k">if</span> <span class="n">prev</span><span class="p">:</span>
<span class="n">prev</span><span class="p">.</span><span class="n">set_next</span><span class="p">(</span><span class="n">current</span><span class="p">.</span><span class="n">get_next</span><span class="p">())</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="p">.</span><span class="n">head</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="n">get_next</span><span class="p">()</span>
<span class="k">break</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">prev</span> <span class="o">=</span> <span class="n">current</span>
<span class="n">current</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="n">get_next</span><span class="p">()</span>
</code></pre></div></div>
<p>To check whether an element is in the linked list or not ,create a method named “search” which takes a data that we want check if it is in the linked list. First , we set the head to the current variable and we iterate through the list while current is not None and if we get the data in the list we return True and if we don’t we go to next Node. If we don’t find the data and current is None then we return False.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">search</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">data</span><span class="p">):</span>
<span class="n">current</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">head</span>
<span class="k">while</span> <span class="n">current</span><span class="p">:</span>
<span class="k">if</span> <span class="n">current</span><span class="p">.</span><span class="n">get_data</span><span class="p">()</span> <span class="o">==</span> <span class="n">data</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">current</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="n">get_next</span><span class="p">()</span>
<span class="k">return</span> <span class="bp">False</span>
</code></pre></div></div>
<p>To know the size of the linked list, we are going to use dunder/magic method <strong>len</strong> . Because of using this dunder method we can get the size using len(). This makes our work easier and readable.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">temp</span><span class="p">)</span>
</code></pre></div></div>
<p>At last we want to print the linked list as a list we usually see.
So, create a method “print_list”, declare a variable to store the head
and another variable temp which initially stores an empty list. Now we traverse through the linked list while current is not None and we append every element in the temp list till current is None then we print the list.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">print_list</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">current</span> <span class="o">=</span> <span class="bp">self</span><span class="p">.</span><span class="n">head</span>
<span class="bp">self</span><span class="p">.</span><span class="n">temp</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">while</span> <span class="n">current</span><span class="p">:</span>
<span class="bp">self</span><span class="p">.</span><span class="n">temp</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">current</span><span class="p">.</span><span class="n">get_data</span><span class="p">())</span>
<span class="n">current</span> <span class="o">=</span> <span class="n">current</span><span class="p">.</span><span class="n">get_next</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="bp">self</span><span class="p">.</span><span class="n">temp</span><span class="p">)</span>
</code></pre></div></div>
<p>Now it’s time to check out the linked list we have written,</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">item1</span> <span class="o">=</span> <span class="mi">1020</span>
<span class="n">item2</span> <span class="o">=</span> <span class="mi">2040</span>
<span class="n">item3</span> <span class="o">=</span> <span class="mi">3060</span>
<span class="n">item4</span> <span class="o">=</span> <span class="mi">4080</span>
<span class="n">li</span> <span class="o">=</span> <span class="n">Linked_list</span><span class="p">()</span>
<span class="n">li</span><span class="p">.</span><span class="n">insert_head</span><span class="p">(</span><span class="n">item1</span><span class="p">)</span>
<span class="n">li</span><span class="p">.</span><span class="n">insert_head</span><span class="p">(</span><span class="n">item2</span><span class="p">)</span>
<span class="n">li</span><span class="p">.</span><span class="n">insert_head</span><span class="p">(</span><span class="n">item3</span><span class="p">)</span>
<span class="n">li</span><span class="p">.</span><span class="n">insert_head</span><span class="p">(</span><span class="n">item4</span><span class="p">)</span>
<span class="n">li</span><span class="p">.</span><span class="n">print_list</span><span class="p">()</span>
<span class="o">>>></span> <span class="p">[</span><span class="mi">4080</span><span class="p">,</span> <span class="mi">3060</span><span class="p">,</span> <span class="mi">2040</span><span class="p">,</span> <span class="mi">1020</span><span class="p">]</span>
<span class="k">print</span><span class="p">(</span><span class="n">li</span><span class="p">.</span><span class="n">search</span><span class="p">(</span><span class="mi">3060</span><span class="p">))</span>
<span class="o">>>></span> <span class="bp">True</span>
<span class="k">print</span><span class="p">(</span><span class="n">li</span><span class="p">.</span><span class="n">search</span><span class="p">(</span><span class="mi">9010</span><span class="p">))</span>
<span class="o">>>></span> <span class="bp">False</span>
<span class="n">li</span><span class="p">.</span><span class="n">delete</span><span class="p">(</span><span class="mi">2040</span><span class="p">)</span>
<span class="n">li</span><span class="p">.</span><span class="n">print_list</span><span class="p">()</span>
<span class="o">>>></span> <span class="p">[</span><span class="mi">4080</span><span class="p">,</span> <span class="mi">3060</span><span class="p">,</span> <span class="mi">1020</span><span class="p">]</span>
<span class="k">print</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">li</span><span class="p">))</span>
<span class="o">>>></span> <span class="mi">3</span>
<span class="n">li</span><span class="p">.</span><span class="n">insert_tail</span><span class="p">(</span><span class="mi">50100</span><span class="p">)</span>
<span class="n">li</span><span class="p">.</span><span class="n">print_list</span><span class="p">()</span>
<span class="o">>>></span> <span class="p">[</span><span class="mi">4080</span><span class="p">,</span> <span class="mi">3060</span><span class="p">,</span> <span class="mi">1020</span><span class="p">,</span> <span class="mi">50100</span><span class="p">]</span>
</code></pre></div></div>
<p>It works!</p>
<p>Feel free to ask any question and comment for any kind of correction.</p>In computer science, a linked list is a linear collection of data elements, in which linear order is not given by their physical placement in memory. Each pointing to next node by means of a pointer. It is a data structure consisting of a group of nodes which together represent a sequence. Under the simplest form, each node is composed of data and a reference (in other words, a link) to the next node in the sequence. This structure allows for efficient insertion or removal of elements from any position in the sequence during iteration.(Source: https://en.wikipedia.org/wiki/Linked_list)