<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ashutosh Sarangi</title>
    <description>The latest articles on Forem by Ashutosh Sarangi (@ashutoshsarangi).</description>
    <link>https://forem.com/ashutoshsarangi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1763687%2F88e07feb-78b2-4367-8f50-c79b74c53c63.jpeg</url>
      <title>Forem: Ashutosh Sarangi</title>
      <link>https://forem.com/ashutoshsarangi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ashutoshsarangi"/>
    <language>en</language>
    <item>
      <title>(aiohttp &amp; asyncio) vs Requests: Comparing Python HTTP Libraries</title>
      <dc:creator>Ashutosh Sarangi</dc:creator>
      <pubDate>Tue, 04 Nov 2025 06:34:22 +0000</pubDate>
      <link>https://forem.com/ashutoshsarangi/aiohttp-asyncio-vs-requests-comparing-python-http-libraries-46j9</link>
      <guid>https://forem.com/ashutoshsarangi/aiohttp-asyncio-vs-requests-comparing-python-http-libraries-46j9</guid>
      <description>&lt;h2&gt;
  
  
  1. &lt;strong&gt;Requests&lt;/strong&gt; - The Simple Synchronous Library
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What it is:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Synchronous&lt;/strong&gt; blocking HTTP library&lt;/li&gt;
&lt;li&gt;Simple, intuitive API&lt;/li&gt;
&lt;li&gt;Most popular for basic HTTP operations&lt;/li&gt;
&lt;li&gt;Blocks execution until response is received&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When to use:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Simple scripts&lt;/li&gt;
&lt;li&gt;Sequential API calls&lt;/li&gt;
&lt;li&gt;Learning/prototyping&lt;/li&gt;
&lt;li&gt;When performance isn't critical&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="c1"&gt;# Basic GET request
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://api.github.com/users/github&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="c1"&gt;# Making multiple requests (BLOCKING - one at a time)
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_multiple_sync&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;urls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://api.github.com/users/github&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://api.github.com/users/google&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://api.github.com/users/microsoft&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Time taken: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; seconds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Output: ~3 seconds (1 second per request, sequential)
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;

&lt;span class="c1"&gt;# POST request with headers and data
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://httpbin.org/post&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;key&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Bearer token&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Session for connection pooling
&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;User-Agent&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MyApp&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://api.github.com/users/github&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ Dead simple API&lt;/li&gt;
&lt;li&gt;✅ Excellent documentation&lt;/li&gt;
&lt;li&gt;✅ Perfect for beginners&lt;/li&gt;
&lt;li&gt;✅ Built-in JSON decoding&lt;/li&gt;
&lt;li&gt;✅ Session management&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cons:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;❌ Synchronous/blocking&lt;/li&gt;
&lt;li&gt;❌ Slow for multiple requests&lt;/li&gt;
&lt;li&gt;❌ Not suitable for high-concurrency&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. &lt;strong&gt;asyncio&lt;/strong&gt; - The Foundation (Not an HTTP Library!)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What it is:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Asynchronous I/O framework&lt;/strong&gt; built into Python 3.4+&lt;/li&gt;
&lt;li&gt;NOT an HTTP library itself&lt;/li&gt;
&lt;li&gt;Provides the foundation for async programming&lt;/li&gt;
&lt;li&gt;Event loop for concurrent operations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Concepts:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;async def&lt;/code&gt; - Defines coroutine functions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;await&lt;/code&gt; - Waits for async operations&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;asyncio.gather()&lt;/code&gt; - Runs multiple coroutines concurrently&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example (without HTTP):
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="c1"&gt;# Basic async function
&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;say_hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Non-blocking sleep
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;

&lt;span class="c1"&gt;# Running async functions
&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Sequential execution (3 seconds total)
&lt;/span&gt;    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;say_hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;say_hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bob&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;say_hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Charlie&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sequential time: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Concurrent execution (1 second total!)
&lt;/span&gt;    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nf"&gt;say_hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nf"&gt;say_hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bob&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nf"&gt;say_hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Charlie&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Concurrent time: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Run the async function
&lt;/span&gt;&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why asyncio alone isn't enough for HTTP:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# This WON'T work - requests is synchronous!
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_url&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# ❌ requests.get() blocks the event loop!
&lt;/span&gt;    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Even with asyncio.gather(), this is still sequential
# because requests.get() blocks
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. &lt;strong&gt;aiohttp&lt;/strong&gt; - Async HTTP Client/Server
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What it is:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Asynchronous HTTP client and server&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Built on top of asyncio&lt;/li&gt;
&lt;li&gt;Non-blocking I/O for concurrent requests&lt;/li&gt;
&lt;li&gt;Supports WebSockets&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When to use:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Multiple concurrent HTTP requests&lt;/li&gt;
&lt;li&gt;High-performance web scraping&lt;/li&gt;
&lt;li&gt;API integrations with many endpoints&lt;/li&gt;
&lt;li&gt;WebSocket connections&lt;/li&gt;
&lt;li&gt;Building async web servers&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📊 Side-by-Side Comparison---
&lt;/h2&gt;

&lt;h2&gt;
  
  
  🔥 Real Performance Example
&lt;/h2&gt;

&lt;p&gt;Let me show you a &lt;strong&gt;real-world scenario&lt;/strong&gt; comparing both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;aiohttp&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="c1"&gt;# Scenario: Fetch data from 20 different API endpoints
&lt;/span&gt;
&lt;span class="n"&gt;urls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://jsonplaceholder.typicode.com/posts/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="c1"&gt;# ============ REQUESTS (SYNCHRONOUS) ============
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_with_requests&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="n"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Requests (sync): &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;elapsed&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; seconds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;

&lt;span class="c1"&gt;# ============ AIOHTTP (ASYNCHRONOUS) ============
&lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_with_aiohttp&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;aiohttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ClientSession&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;fetch_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;elapsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aiohttp (async): &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;elapsed&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; seconds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;

&lt;span class="c1"&gt;# Run both
&lt;/span&gt;&lt;span class="nf"&gt;fetch_with_requests&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# ~5-10 seconds
&lt;/span&gt;&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fetch_with_aiohttp&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;  &lt;span class="c1"&gt;# ~0.5-1 second
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Results:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Requests&lt;/strong&gt;: 8.5 seconds (sequential)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;aiohttp&lt;/strong&gt;: 0.9 seconds (concurrent)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speedup&lt;/strong&gt;: ~9.4x faster! 🚀&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔍 What exactly happens with &lt;code&gt;session.get(url)&lt;/code&gt;?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;fetch_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Answer: NO, the API is NOT called yet!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's what's actually happening step by step:&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Understanding what &lt;code&gt;fetch_one(url)&lt;/code&gt; returns
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# When you call this:
&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# ❌ API NOT called yet!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you call an &lt;code&gt;async def&lt;/code&gt; function &lt;strong&gt;without &lt;code&gt;await&lt;/code&gt;&lt;/strong&gt;, it returns a &lt;strong&gt;coroutine object&lt;/strong&gt; (not the result). The function body &lt;strong&gt;doesn't execute yet&lt;/strong&gt;!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Fetching &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# This won't print yet!
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# This creates a coroutine object but doesn't run it
&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# &amp;lt;class 'coroutine'&amp;gt;
&lt;/span&gt;
&lt;span class="c1"&gt;# The function body hasn't run yet!
# "Fetching https://example.com" hasn't printed!
&lt;/span&gt;
&lt;span class="c1"&gt;# To actually run it, you need await:
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;  &lt;span class="c1"&gt;# NOW it runs and prints "Fetching..."
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: What's in the tasks list?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;fetch_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# tasks = [&amp;lt;coroutine&amp;gt;, &amp;lt;coroutine&amp;gt;, &amp;lt;coroutine&amp;gt;, ...]
# These are "suspended" function calls waiting to be executed
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;tasks&lt;/code&gt; list contains &lt;strong&gt;coroutine objects&lt;/strong&gt; - basically "promises" or "blueprints" of work to be done, but &lt;strong&gt;the work hasn't started yet&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: What does &lt;code&gt;asyncio.gather()&lt;/code&gt; do?
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NOW&lt;/strong&gt; the magic happens! &lt;code&gt;asyncio.gather()&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Takes all the coroutine objects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schedules them to run concurrently&lt;/strong&gt; on the event loop&lt;/li&gt;
&lt;li&gt;Waits for all of them to complete&lt;/li&gt;
&lt;li&gt;Returns their results as a list&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  &lt;code&gt;*&lt;/code&gt; and &lt;code&gt;**&lt;/code&gt; Unpacking
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;*&lt;/code&gt; (Single asterisk) - Unpacking Iterables
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Unpacks lists, tuples, sets, etc.
&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;task1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# These are equivalent:
&lt;/span&gt;&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Another example:
&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Same as: print(1, 2, 3)
# Output: 1 2 3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;It's not just for lists&lt;/strong&gt; - it works with ANY iterable (lists, tuples, sets, generators, etc.)&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;**&lt;/code&gt; (Double asterisk) - Unpacking Dictionaries
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Unpacks dictionaries as keyword arguments
&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;timeout&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;headers&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;User-Agent&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MyApp&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;

&lt;span class="c1"&gt;# These are equivalent:
&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;User-Agent&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;MyApp&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;# Another example:
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; is &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; years old&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Same as: greet(name='Alice', age=30)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>python</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>Python Performance Optimization: Detailed Guide</title>
      <dc:creator>Ashutosh Sarangi</dc:creator>
      <pubDate>Fri, 03 Oct 2025 07:06:32 +0000</pubDate>
      <link>https://forem.com/ashutoshsarangi/python-performance-optimization-detailed-guide-5739</link>
      <guid>https://forem.com/ashutoshsarangi/python-performance-optimization-detailed-guide-5739</guid>
      <description>&lt;h2&gt;
  
  
  **product Object.model_dump()
&lt;/h2&gt;

&lt;h1&gt;
  
  
  Python Performance Optimization: Detailed Guide
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Overview: Optimize What Needs Optimizing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why This Matters
&lt;/h3&gt;

&lt;p&gt;Premature optimization is the root of all evil. Optimizing the wrong parts of your code wastes time and can make code harder to maintain.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Right Approach
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Step 1: Get it right first
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate_total&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Step 2: Test it's right
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_calculate_total&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;quantity&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;calculate_total&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;

&lt;span class="c1"&gt;# Step 3: Profile if slow
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cProfile&lt;/span&gt;
&lt;span class="n"&gt;cProfile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;calculate_total(large_item_list)&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Step 4: Optimize based on profiling results
# Step 5: Repeat testing after optimization
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key Point:&lt;/strong&gt; Always profile first. What you think is slow might not be the bottleneck!&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Sorting Optimization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ &lt;strong&gt;Avoid: Using Comparison Functions&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# BAD - Comparison function called O(n log n) times
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;compare_by_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;person1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;person2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;person1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;person2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;person1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;person2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="n"&gt;people&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Bob&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="c1"&gt;# Python 2 style - SLOW
# people.sort(cmp=compare_by_age)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why This is Slow:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Comparison function is a Python function call (expensive!)&lt;/li&gt;
&lt;li&gt;Called O(n log n) times during sorting&lt;/li&gt;
&lt;li&gt;For 10,000 items, ~130,000 function calls&lt;/li&gt;
&lt;li&gt;Each call has Python interpreter overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Use: key Parameter with operator.itemgetter&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;operator&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;itemgetter&lt;/span&gt;

&lt;span class="c1"&gt;# GOOD - key function called only O(n) times
&lt;/span&gt;&lt;span class="n"&gt;people&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;salary&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Bob&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;salary&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80000&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Charlie&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;salary&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;120000&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Sort by single field
&lt;/span&gt;&lt;span class="n"&gt;people&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;itemgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# [{'name': 'Bob', 'age': 25, ...}, {'name': 'Alice', 'age': 30, ...}, ...]
&lt;/span&gt;
&lt;span class="c1"&gt;# Sort by multiple fields (age, then salary)
&lt;/span&gt;&lt;span class="n"&gt;people&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;itemgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;salary&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# For tuples/lists, use index
&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;apple&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;banana&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cherry&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;itemgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Sort by third element
# [(2, 'banana', 3), (1, 'apple', 5), (3, 'cherry', 8)]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why This is Fast:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;itemgetter&lt;/code&gt; is implemented in C&lt;/li&gt;
&lt;li&gt;Key function called only once per item (O(n) calls)&lt;/li&gt;
&lt;li&gt;Native comparisons on extracted keys (fast C code)&lt;/li&gt;
&lt;li&gt;For 10,000 items: 10,000 key calls vs 130,000 comparison calls&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Use: sorted() for Non-Destructive Sorting&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ❌ Bad - modifies original list
&lt;/span&gt;&lt;span class="n"&gt;original&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;original&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;original&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# [1, 1, 3, 4, 5] - original destroyed!
&lt;/span&gt;
&lt;span class="c1"&gt;# ✅ Good - preserves original
&lt;/span&gt;&lt;span class="n"&gt;original&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;sorted_copy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;original&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;original&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# [3, 1, 4, 1, 5] - unchanged
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sorted_copy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# [1, 1, 3, 4, 5]
&lt;/span&gt;
&lt;span class="c1"&gt;# Works with any iterable
&lt;/span&gt;&lt;span class="n"&gt;sorted_set&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;  &lt;span class="c1"&gt;# [1, 3, 4, 5]
&lt;/span&gt;&lt;span class="n"&gt;sorted_dict_keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;z&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;  &lt;span class="c1"&gt;# ['a', 'm', 'z']
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Advanced Sorting Techniques
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;operator&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;itemgetter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attrgetter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methodcaller&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Sort objects by attribute
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__repr__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Person(&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;people&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nc"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Bob&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Charlie&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="c1"&gt;# Sort by attribute
&lt;/span&gt;&lt;span class="n"&gt;people&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;attrgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# [Person(Bob, 25), Person(Alice, 30), Person(Charlie, 35)]
&lt;/span&gt;
&lt;span class="c1"&gt;# Sort by multiple attributes
&lt;/span&gt;&lt;span class="n"&gt;people&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;attrgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Sort by method result
&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Python&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;java&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;C++&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;javascript&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;methodcaller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;lower&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Case-insensitive sort
# ['C++', 'java', 'javascript', 'Python']
&lt;/span&gt;
&lt;span class="c1"&gt;# 3. Reverse sorting (descending)
&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# [9, 5, 4, 3, 1, 1]
&lt;/span&gt;
&lt;span class="c1"&gt;# Or with key
&lt;/span&gt;&lt;span class="n"&gt;people&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;attrgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Oldest first
&lt;/span&gt;
&lt;span class="c1"&gt;# 4. Complex sorting with lambda (when operator functions won't work)
&lt;/span&gt;&lt;span class="n"&gt;points&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="c1"&gt;# Sort by distance from origin
&lt;/span&gt;&lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# But prefer operator when possible (faster):
&lt;/span&gt;&lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;itemgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Sort by y-coordinate
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Decorate-Sort-Undecorate (DSU) Pattern (Legacy)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Old Python 2 pattern - now obsolete with key parameter
# But understanding it helps explain how key works internally
&lt;/span&gt;
&lt;span class="c1"&gt;# ❌ Manual DSU (old way)
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sortby_manual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;somelist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Decorate
&lt;/span&gt;    &lt;span class="n"&gt;decorated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;somelist&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="c1"&gt;# Sort
&lt;/span&gt;    &lt;span class="n"&gt;decorated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="c1"&gt;# Undecorate
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="nf"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;decorated&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# ✅ Modern way (Python 2.4+)
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sortby_modern&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;somelist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;somelist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;itemgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sorting Stability (Important!)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python's sort is STABLE (since 2.3)
# Equal elements maintain their relative order
&lt;/span&gt;
&lt;span class="n"&gt;students&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;grade&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Bob&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;grade&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;B&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Charlie&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;grade&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;David&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;grade&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;B&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# Sort by grade (stable)
&lt;/span&gt;&lt;span class="n"&gt;students&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;itemgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;grade&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# Within same grade, original order preserved
&lt;/span&gt;
&lt;span class="c1"&gt;# Multi-level sorting using stability
# Sort by secondary key first, then primary key
&lt;/span&gt;&lt;span class="n"&gt;students&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;itemgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;      &lt;span class="c1"&gt;# Sort by age first
&lt;/span&gt;&lt;span class="n"&gt;students&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;itemgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;grade&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;    &lt;span class="c1"&gt;# Then by grade (stable!)
# Result: Sorted by grade, and within same grade, sorted by age
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Performance Comparison
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;timeit&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;operator&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;itemgetter&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="c1"&gt;# Using lambda
&lt;/span&gt;&lt;span class="n"&gt;time_lambda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;timeit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Using itemgetter
&lt;/span&gt;&lt;span class="n"&gt;time_itemgetter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;timeit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;itemgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Lambda: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;time_lambda&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Output: ~2.5s
&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;itemgetter: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;time_itemgetter&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Output: ~1.8s (30-40% faster!)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When to Use What
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Use .sort() when:
# - You want to modify the list in place
# - You don't need the original order
# - Slightly more memory efficient
&lt;/span&gt;&lt;span class="n"&gt;my_list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;itemgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;field&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Use sorted() when:
# - You need to keep the original
# - Sorting any iterable (not just lists)
# - More functional programming style
&lt;/span&gt;&lt;span class="n"&gt;new_list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;itemgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;field&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Use itemgetter when:
# - Sorting by dictionary keys or tuple/list indices
# - Need maximum performance
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;operator&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;itemgetter&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;itemgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Use attrgetter when:
# - Sorting objects by attributes
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;operator&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;attrgetter&lt;/span&gt;
&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;attrgetter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;attribute&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Use lambda when:
# - Complex transformation needed
# - itemgetter/attrgetter won't work
&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;category&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;priority&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. String Concatenation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ &lt;strong&gt;Avoid: Using += for String Building&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# BAD - Creates a new string object on every iteration
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build_html_bad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;# Creates new string each time
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt;

&lt;span class="c1"&gt;# Why it's slow:
# Iteration 1: "" -&amp;gt; "&amp;lt;li&amp;gt;apple&amp;lt;/li&amp;gt;" (new string created)
# Iteration 2: "&amp;lt;li&amp;gt;apple&amp;lt;/li&amp;gt;" -&amp;gt; "&amp;lt;li&amp;gt;apple&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;banana&amp;lt;/li&amp;gt;" (another new string)
# Each concatenation copies ALL previous characters again!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why This is Slow:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strings are immutable in Python&lt;/li&gt;
&lt;li&gt;Each &lt;code&gt;+=&lt;/code&gt; creates a completely new string object&lt;/li&gt;
&lt;li&gt;For n items, this copies characters O(n²) times&lt;/li&gt;
&lt;li&gt;With 10,000 items, you might copy millions of characters&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Use: join() Method&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# GOOD - Builds list first, then joins once
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build_html_good&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Even better - list comprehension
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;build_html_best&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why This is Fast:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List operations are cheap&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;join()&lt;/code&gt; calculates total size once and allocates memory once&lt;/li&gt;
&lt;li&gt;Only one string copy operation at the end&lt;/li&gt;
&lt;li&gt;O(n) time complexity instead of O(n²)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance Comparison
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;item&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="c1"&gt;# Bad approach
&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Concatenation: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Output: ~2-5 seconds
&lt;/span&gt;
&lt;span class="c1"&gt;# Good approach
&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Join: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Output: ~0.001 seconds (1000x faster!)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  String Formatting
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ❌ Avoid concatenation
&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;head&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;prologue&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;tail&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# ✅ Use formatting (better)
&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;html&amp;gt;%s%s%s%s&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prologue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# ✅ Use f-strings (Python 3.6+, best)
&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="si"&gt;}{&lt;/span&gt;&lt;span class="n"&gt;prologue&lt;/span&gt;&lt;span class="si"&gt;}{&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="si"&gt;}{&lt;/span&gt;&lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Loops and Iteration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ &lt;strong&gt;Avoid: Manual Loop with Append&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# BAD - Slow due to repeated attribute lookups and Python loop overhead
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_words_bad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why This is Slow:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python interpreter overhead for each iteration&lt;/li&gt;
&lt;li&gt;Repeated method lookups (&lt;code&gt;.append&lt;/code&gt;, &lt;code&gt;.upper&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Function call overhead for each operation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Use: List Comprehensions&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# GOOD - Optimized by interpreter
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_words_good&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why This is Fast:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;List comprehensions are optimized at the bytecode level&lt;/li&gt;
&lt;li&gt;Reduces interpreter overhead&lt;/li&gt;
&lt;li&gt;More concise and readable&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Use: map() for Simple Operations&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ALSO GOOD - Pushes loop into C code
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_words_map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why This is Fast:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;map()&lt;/code&gt; is implemented in C&lt;/li&gt;
&lt;li&gt;No Python interpreter overhead per iteration&lt;/li&gt;
&lt;li&gt;Very efficient for simple transformations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Map in detail
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;map()&lt;/code&gt; function in Python is used to apply a function to every item in an iterable (like a list or tuple) and return a map object (which can be converted to a list, set, etc.).&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 &lt;strong&gt;Syntax of &lt;code&gt;map()&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;iterable&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;function&lt;/code&gt;&lt;/strong&gt;: A function that will be applied to each item in the iterable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;iterable&lt;/code&gt;&lt;/strong&gt;: A sequence (like a list, tuple, etc.) whose items will be processed by the function.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Example 1: Using Built-in Function &lt;code&gt;str.upper&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;world&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Output: ['HELLO', 'WORLD']
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;str.upper&lt;/code&gt; is applied to each word in the list.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Example 2: Using a Lambda Function&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;squared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;squared&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Output: [1, 4, 9, 16]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The lambda function &lt;code&gt;lambda x: x**2&lt;/code&gt; squares each number.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Example 3: Using a Custom Function&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_prefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;word&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pre_&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt;

&lt;span class="n"&gt;words&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fix&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;view&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dict&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;add_prefix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;words&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Output: ['pre_fix', 'pre_view', 'pre_dict']
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Generator Expressions (Memory Efficient)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# When you don't need the full list at once
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_large_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# ❌ Bad - loads entire file into memory
&lt;/span&gt;        &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="c1"&gt;# ✅ Good - processes one line at a time
&lt;/span&gt;        &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Only one line in memory at a time
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Generator Expression in Detail
&lt;/h3&gt;

&lt;p&gt;You're asking a great question — and it's a common point of confusion for many Python learners. Let's clarify the difference between &lt;strong&gt;&lt;code&gt;yield&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;generators&lt;/strong&gt;, and how they relate to each other.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 &lt;strong&gt;What Is a Generator?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;generator&lt;/strong&gt; is a special type of iterator in Python that &lt;strong&gt;produces values one at a time&lt;/strong&gt;, only when requested. It’s useful for working with large datasets or streams of data because it &lt;strong&gt;doesn’t store everything in memory&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There are &lt;strong&gt;two ways&lt;/strong&gt; to create a generator:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Using a Generator Function with &lt;code&gt;yield&lt;/code&gt;&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;my_generator&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;When you call &lt;code&gt;my_generator()&lt;/code&gt;, it returns a &lt;strong&gt;generator object&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Each time you iterate over it (e.g., with a &lt;code&gt;for&lt;/code&gt; loop), it runs until it hits a &lt;code&gt;yield&lt;/code&gt;, returns that value, and &lt;strong&gt;pauses&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;When you ask for the next value, it &lt;strong&gt;resumes&lt;/strong&gt; from where it left off.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Using a Generator Expression&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;gen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;This is similar to a list comprehension, but with &lt;strong&gt;()` instead of []&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It also returns a generator object and evaluates lazily (one item at a time).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔄 &lt;strong&gt;What Is &lt;code&gt;yield&lt;/code&gt;?&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;yield&lt;/code&gt; is a &lt;strong&gt;keyword&lt;/strong&gt; used inside a function to &lt;strong&gt;turn it into a generator function&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It’s like &lt;code&gt;return&lt;/code&gt;, but instead of ending the function, it &lt;strong&gt;pauses&lt;/strong&gt; and allows the function to continue later.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ &lt;strong&gt;Example: Using &lt;code&gt;yield&lt;/code&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;br&gt;
def count_up_to(n):&lt;br&gt;
    count = 1&lt;br&gt;
    while count &amp;lt;= n:&lt;br&gt;
        yield count&lt;br&gt;
        count += 1&lt;/p&gt;

&lt;p&gt;gen = count_up_to(3)&lt;br&gt;
for num in gen:&lt;br&gt;
    print(num)&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Output:
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;&lt;br&gt;
1&lt;br&gt;
2&lt;br&gt;
3&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each call to &lt;code&gt;next(gen)&lt;/code&gt; gives the next number.&lt;/li&gt;
&lt;li&gt;The function &lt;strong&gt;remembers its state&lt;/strong&gt; between calls.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🔁 &lt;strong&gt;What a Generator Does&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When you write:&lt;br&gt;
&lt;code&gt;&lt;/code&gt;&lt;code&gt;python&lt;br&gt;
lines = (line.upper() for line in f)&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This creates a &lt;strong&gt;generator object&lt;/strong&gt;. It doesn’t actually read or process any lines yet. It just sets up the logic for how each line will be processed &lt;strong&gt;when requested&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 &lt;strong&gt;Why the &lt;code&gt;for&lt;/code&gt; Loop Is Needed&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;python&lt;br&gt;
for line in lines:&lt;br&gt;
    process(line)&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;for&lt;/code&gt; loop triggers** the generator to start reading the file line by line, converting each line to uppercase, and passing it to &lt;code&gt;process()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Without the loop, the generator just sits there — it doesn’t do anything.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Avoiding Dots (Attribute Lookups)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ &lt;strong&gt;Avoid: Repeated Attribute Lookups&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;

&lt;h1&gt;
  
  
  BAD - Looks up .append and .upper on every iteration
&lt;/h1&gt;

&lt;p&gt;def process_bad(words):&lt;br&gt;
    result = []&lt;br&gt;
    for word in words:&lt;br&gt;
        result.append(word.upper())  # Two lookups per iteration&lt;br&gt;
    return result&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This is Slow:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python does attribute lookup at runtime&lt;/li&gt;
&lt;li&gt;Each dot (&lt;code&gt;.&lt;/code&gt;) triggers a dictionary lookup&lt;/li&gt;
&lt;li&gt;For 1 million items, that's 2 million dictionary lookups!&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Use: Cache Attribute Lookups&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;

&lt;h1&gt;
  
  
  GOOD - Lookup once, use many times
&lt;/h1&gt;

&lt;p&gt;def process_good(words):&lt;br&gt;
    result = []&lt;br&gt;
    append = result.append  # Cache the method&lt;br&gt;
    upper = str.upper       # Cache the function&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for word in words:
    append(upper(word))  # Direct reference, no lookup

return result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This is Fast:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Attribute lookup happens only once&lt;/li&gt;
&lt;li&gt;Direct variable access is much faster&lt;/li&gt;
&lt;li&gt;Reduces bytecode instructions per iteration&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Real-World Example
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;

&lt;h1&gt;
  
  
  ❌ Bad - repeated lookups
&lt;/h1&gt;

&lt;p&gt;def parse_data_bad(data):&lt;br&gt;
    results = []&lt;br&gt;
    for item in data:&lt;br&gt;
        if item.value &amp;gt; 0:  # Lookup 'value'&lt;br&gt;
            results.append({  # Lookup 'append'&lt;br&gt;
                'id': item.id,  # Lookup 'id'&lt;br&gt;
                'name': item.name  # Lookup 'name'&lt;br&gt;
            })&lt;br&gt;
    return results&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Good - cache lookups
&lt;/h1&gt;

&lt;p&gt;def parse_data_good(data):&lt;br&gt;
    results = []&lt;br&gt;
    append = results.append&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for item in data:
    value = item.value
    if value &amp;gt; 0:
        append({
            'id': item.id,
            'name': item.name
        })
return results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caution:&lt;/strong&gt; Only use this technique in performance-critical loops. It reduces readability, so use it judiciously.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Local vs Global Variables
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ &lt;strong&gt;Avoid: Global Variables in Loops&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;

&lt;h1&gt;
  
  
  BAD - Accessing globals is slow
&lt;/h1&gt;

&lt;p&gt;counter = 0&lt;/p&gt;

&lt;p&gt;def process_global():&lt;br&gt;
    global counter&lt;br&gt;
    for i in range(1000000):&lt;br&gt;
        counter += 1  # Global lookup on every iteration&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This is Slow:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Global variables are stored in a dictionary (&lt;code&gt;globals()&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Each access requires a dictionary lookup&lt;/li&gt;
&lt;li&gt;Much slower than local variable access&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Use: Local Variables&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;

&lt;h1&gt;
  
  
  GOOD - Local variables use optimized storage
&lt;/h1&gt;

&lt;p&gt;def process_local():&lt;br&gt;
    counter = 0  # Local variable&lt;br&gt;
    for i in range(1000000):&lt;br&gt;
        counter += 1  # Fast local access&lt;br&gt;
    return counter&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This is Fast:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local variables are stored in an array-like structure&lt;/li&gt;
&lt;li&gt;Access is by index, not dictionary lookup&lt;/li&gt;
&lt;li&gt;Much faster at the C level&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Best Practice
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;

&lt;h1&gt;
  
  
  ❌ Avoid
&lt;/h1&gt;

&lt;p&gt;import math&lt;/p&gt;

&lt;p&gt;def calculate_distances(points):&lt;br&gt;
    distances = []&lt;br&gt;
    for p1, p2 in points:&lt;br&gt;
        # math.sqrt is a global lookup each time&lt;br&gt;
        dist = math.sqrt((p2[0]-p1[0])&lt;strong&gt;2 + (p2[1]-p1[1])&lt;/strong&gt;2)&lt;br&gt;
        distances.append(dist)&lt;br&gt;
    return distances&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Use
&lt;/h1&gt;

&lt;p&gt;import math&lt;/p&gt;

&lt;p&gt;def calculate_distances_fast(points):&lt;br&gt;
    distances = []&lt;br&gt;
    append = distances.append&lt;br&gt;
    sqrt = math.sqrt  # Make it local!&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;for p1, p2 in points:
    dist = sqrt((p2[0]-p1[0])**2 + (p2[1]-p1[1])**2)
    append(dist)

return distances
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Dictionary Initialization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ &lt;strong&gt;Avoid: if-else for Dictionary Keys&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;

&lt;h1&gt;
  
  
  BAD - Dictionary lookup happens twice on every iteration
&lt;/h1&gt;

&lt;p&gt;def count_words_bad(words):&lt;br&gt;
    word_count = {}&lt;br&gt;
    for word in words:&lt;br&gt;
        if word not in word_count:  # First lookup&lt;br&gt;
            word_count[word] = 0&lt;br&gt;
        word_count[word] += 1  # Second lookup&lt;br&gt;
    return word_count&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This is Slow:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Double dictionary lookup for existing keys&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;if&lt;/code&gt; statement evaluated every single time&lt;/li&gt;
&lt;li&gt;After first occurrence, the &lt;code&gt;if&lt;/code&gt; always fails but still gets checked&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Use: try-except (EAFP)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;

&lt;h1&gt;
  
  
  GOOD - Only one lookup for existing keys
&lt;/h1&gt;

&lt;p&gt;def count_words_try(words):&lt;br&gt;
    word_count = {}&lt;br&gt;
    for word in words:&lt;br&gt;
        try:&lt;br&gt;
            word_count[word] += 1  # Try to increment&lt;br&gt;
        except KeyError:&lt;br&gt;
            word_count[word] = 1  # Only runs once per unique word&lt;br&gt;
    return word_count&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This is Fast:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python's EAFP (Easier to Ask for Forgiveness than Permission) philosophy&lt;/li&gt;
&lt;li&gt;Exceptions are cheap when not raised&lt;/li&gt;
&lt;li&gt;Only one dictionary lookup for existing keys&lt;/li&gt;
&lt;li&gt;Exception only raised once per unique word&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Use: dict.get() with Default&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;

&lt;h1&gt;
  
  
  ALSO GOOD - Clear and concise
&lt;/h1&gt;

&lt;p&gt;def count_words_get(words):&lt;br&gt;
    word_count = {}&lt;br&gt;
    for word in words:&lt;br&gt;
        word_count[word] = word_count.get(word, 0) + 1&lt;br&gt;
    return word_count&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Use: defaultdict (Best for Most Cases)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;

&lt;h1&gt;
  
  
  BEST - Most Pythonic and readable
&lt;/h1&gt;

&lt;p&gt;from collections import defaultdict&lt;/p&gt;

&lt;p&gt;def count_words_defaultdict(words):&lt;br&gt;
    word_count = defaultdict(int)  # int() returns 0&lt;br&gt;
    for word in words:&lt;br&gt;
        word_count[word] += 1  # No checking needed!&lt;br&gt;
    return word_count&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This is Best:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No explicit initialization needed&lt;/li&gt;
&lt;li&gt;Clear intent&lt;/li&gt;
&lt;li&gt;Very efficient&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. Import Statement Overhead
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ❌ &lt;strong&gt;Avoid: Imports Inside Tight Loops&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;

&lt;h1&gt;
  
  
  BAD - Imports module on every function call
&lt;/h1&gt;

&lt;p&gt;def process_data_bad():&lt;br&gt;
    for i in range(100000):&lt;br&gt;
        import string  # Module lookup happens 100,000 times!&lt;br&gt;
        result = string.ascii_lowercase&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This is Slow:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python checks &lt;code&gt;sys.modules&lt;/code&gt; on every import&lt;/li&gt;
&lt;li&gt;Even though module isn't reloaded, the lookup is expensive&lt;/li&gt;
&lt;li&gt;Adds unnecessary overhead to every iteration&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Use: Import at Module Level&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;

&lt;h1&gt;
  
  
  GOOD - Import once
&lt;/h1&gt;

&lt;p&gt;import string&lt;/p&gt;

&lt;p&gt;def process_data_good():&lt;br&gt;
    for i in range(100000):&lt;br&gt;
        result = string.ascii_lowercase  # Direct access&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This is Fast:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Module imported only once when file is loaded&lt;/li&gt;
&lt;li&gt;No import overhead in the function&lt;/li&gt;
&lt;li&gt;Variable lookup is much faster&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Use: Import Specific Names&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;

&lt;h1&gt;
  
  
  EVEN BETTER - No attribute lookup
&lt;/h1&gt;

&lt;p&gt;from string import ascii_lowercase&lt;/p&gt;

&lt;p&gt;def process_data_better():&lt;br&gt;
    for i in range(100000):&lt;br&gt;
        result = ascii_lowercase  # No dot lookup!&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Lazy Imports (When Needed) see import email part
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;

&lt;h1&gt;
  
  
  When module might not be needed
&lt;/h1&gt;

&lt;p&gt;class EmailProcessor:&lt;br&gt;
    def &lt;strong&gt;init&lt;/strong&gt;(self):&lt;br&gt;
        self._email_module = None&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def parse_email(self, email_string):
    # ✅ Import only when first needed
    if self._email_module is None:
        import email
        self._email_module = email

    return self._email_module.message_from_string(email_string)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  This is useful when:
&lt;/h1&gt;
&lt;h1&gt;
  
  
  1. Import is expensive (large module)
&lt;/h1&gt;
&lt;h1&gt;
  
  
  2. Module might not be used in this execution
&lt;/h1&gt;
&lt;h1&gt;
  
  
  3. You want faster startup time
&lt;/h1&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  8. Data Aggregation
&lt;/h2&gt;
&lt;h3&gt;
  
  
  ❌ &lt;strong&gt;Avoid: Processing Items One at a Time&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;
&lt;h1&gt;
  
  
  BAD - Function call overhead for each item
&lt;/h1&gt;

&lt;p&gt;def process_items_bad(items):&lt;br&gt;
    total = 0&lt;br&gt;
    for item in items:&lt;br&gt;
        total = add_to_total(total, item)  # Function call per item&lt;br&gt;
    return total&lt;/p&gt;

&lt;p&gt;def add_to_total(total, item):&lt;br&gt;
    return total + item&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This is Slow:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python function calls are expensive&lt;/li&gt;
&lt;li&gt;Stack frame creation/destruction for each call&lt;/li&gt;
&lt;li&gt;Parameter passing overhead&lt;/li&gt;
&lt;li&gt;For 1 million items, 1 million function calls!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Use: Process Data in Batches&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;
&lt;h1&gt;
  
  
  GOOD - Process entire collection at once
&lt;/h1&gt;

&lt;p&gt;def process_items_good(items):&lt;br&gt;
    return sum(items)  # Built-in, implemented in C&lt;/p&gt;
&lt;h1&gt;
  
  
  Or if you need custom processing
&lt;/h1&gt;

&lt;p&gt;def process_items_batch(items):&lt;br&gt;
    total = 0&lt;br&gt;
    for item in items:  # Loop inside the function&lt;br&gt;
        total += item&lt;br&gt;
    return total&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why This is Fast:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Single function call regardless of data size&lt;/li&gt;
&lt;li&gt;Loop overhead amortized over all items&lt;/li&gt;
&lt;li&gt;Built-in functions use optimized C code&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Real-World Example
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;
&lt;h1&gt;
  
  
  ❌ Bad - one API call per item
&lt;/h1&gt;

&lt;p&gt;def save_users_bad(users):&lt;br&gt;
    for user in users:&lt;br&gt;
        database.save(user)  # Network round-trip each time&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Good - batch API call
&lt;/h1&gt;

&lt;p&gt;def save_users_good(users):&lt;br&gt;
    database.bulk_save(users)  # Single network round-trip&lt;/p&gt;
&lt;h1&gt;
  
  
  ❌ Bad - one validation per call
&lt;/h1&gt;

&lt;p&gt;def validate_emails_bad(emails):&lt;br&gt;
    valid = []&lt;br&gt;
    for email in emails:&lt;br&gt;
        if is_valid_email(email):  # Function call per email&lt;br&gt;
            valid.append(email)&lt;br&gt;
    return valid&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Good - validate in batch
&lt;/h1&gt;

&lt;p&gt;def validate_emails_good(emails):&lt;br&gt;
    return [email for email in emails &lt;br&gt;
            if '@' in email and '.' in email]  # Inline check&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  9. Advanced Built-in Functions and Techniques
&lt;/h2&gt;
&lt;h3&gt;
  
  
  all() and any() - Short-Circuit Evaluation
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;
&lt;h1&gt;
  
  
  ❌ Bad - checks every element even after finding result
&lt;/h1&gt;

&lt;p&gt;def has_negative_manual(numbers):&lt;br&gt;
    found = False&lt;br&gt;
    for num in numbers:&lt;br&gt;
        if num &amp;lt; 0:&lt;br&gt;
            found = True&lt;br&gt;
            break  # Manual short-circuit&lt;br&gt;
    return found&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Good - built-in with automatic short-circuit
&lt;/h1&gt;

&lt;p&gt;def has_negative_builtin(numbers):&lt;br&gt;
    return any(num &amp;lt; 0 for num in numbers)&lt;/p&gt;
&lt;h1&gt;
  
  
  Why it's better:
&lt;/h1&gt;

&lt;p&gt;numbers = list(range(-1, 1000000))&lt;/p&gt;
&lt;h1&gt;
  
  
  any() stops at -1 (first element)
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Manual loop in Python is slower even with break
&lt;/h1&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Point:&lt;/strong&gt; &lt;code&gt;any()&lt;/code&gt; and &lt;code&gt;all()&lt;/code&gt; are implemented in C and stop as soon as the result is determined.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;
&lt;h1&gt;
  
  
  Real-world examples
&lt;/h1&gt;

&lt;p&gt;def validate_data(records):&lt;br&gt;
    # Check if all records are valid (stops at first invalid)&lt;br&gt;
    return all(record.get('id') and record.get('name') for record in records)&lt;/p&gt;

&lt;p&gt;def has_error(responses):&lt;br&gt;
    # Check if any response has error (stops at first error)&lt;br&gt;
    return any(resp.status_code &amp;gt;= 400 for resp in responses)&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  enumerate() - Better Than range(len())
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;
&lt;h1&gt;
  
  
  ❌ Bad - manual indexing
&lt;/h1&gt;

&lt;p&gt;items = ['apple', 'banana', 'cherry']&lt;br&gt;
for i in range(len(items)):&lt;br&gt;
    print(f"{i}: {items[i]}")  # Extra lookup&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Good - enumerate provides index and value
&lt;/h1&gt;

&lt;p&gt;for i, item in enumerate(items):&lt;br&gt;
    print(f"{i}: {item}")  # No lookup needed&lt;/p&gt;
&lt;h1&gt;
  
  
  Start from different index
&lt;/h1&gt;

&lt;p&gt;for i, item in enumerate(items, start=1):&lt;br&gt;
    print(f"{i}: {item}")  # 1: apple, 2: banana, 3: cherry&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  zip() - Parallel Iteration
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;
&lt;h1&gt;
  
  
  ❌ Bad - manual indexing for parallel lists
&lt;/h1&gt;

&lt;p&gt;names = ['Alice', 'Bob', 'Charlie']&lt;br&gt;
ages = [30, 25, 35]&lt;br&gt;
cities = ['NYC', 'LA', 'Chicago']&lt;/p&gt;

&lt;p&gt;for i in range(len(names)):&lt;br&gt;
    print(f"{names[i]}, {ages[i]}, {cities[i]}")&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Good - zip combines iterables
&lt;/h1&gt;

&lt;p&gt;for name, age, city in zip(names, ages, cities):&lt;br&gt;
    print(f"{name}, {age}, {city}")&lt;/p&gt;
&lt;h1&gt;
  
  
  Create dictionary from two lists
&lt;/h1&gt;

&lt;p&gt;keys = ['a', 'b', 'c']&lt;br&gt;
values = [1, 2, 3]&lt;br&gt;
dict_from_zip = dict(zip(keys, values))  # {'a': 1, 'b': 2, 'c': 3}&lt;/p&gt;
&lt;h1&gt;
  
  
  Unzip (transpose)
&lt;/h1&gt;

&lt;p&gt;pairs = [(1, 'a'), (2, 'b'), (3, 'c')]&lt;br&gt;
numbers, letters = zip(*pairs)&lt;/p&gt;
&lt;h1&gt;
  
  
  numbers = (1, 2, 3), letters = ('a', 'b', 'c')
&lt;/h1&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  itertools - The Power Tools
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;br&gt;
from itertools import chain, islice, groupby, accumulate, product, combinations&lt;/p&gt;
&lt;h1&gt;
  
  
  1. chain - flatten multiple iterables (no intermediate list!)
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ❌ Bad
&lt;/h1&gt;

&lt;p&gt;list1 = [1, 2, 3]&lt;br&gt;
list2 = [4, 5, 6]&lt;br&gt;
combined = list1 + list2  # Creates new list&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Good
&lt;/h1&gt;

&lt;p&gt;combined = chain(list1, list2)  # Lazy iterator&lt;br&gt;
for item in combined:&lt;br&gt;
    print(item)  # No intermediate list created&lt;/p&gt;
&lt;h1&gt;
  
  
  2. islice - slicing iterators without loading everything
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ❌ Bad - loads entire file
&lt;/h1&gt;

&lt;p&gt;with open('huge_file.txt') as f:&lt;br&gt;
    first_10 = list(f)[:10]  # Loads entire file!&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Good - only reads what's needed
&lt;/h1&gt;

&lt;p&gt;from itertools import islice&lt;br&gt;
with open('huge_file.txt') as f:&lt;br&gt;
    first_10 = list(islice(f, 10))  # Reads only 10 lines&lt;/p&gt;
&lt;h1&gt;
  
  
  3. groupby - group consecutive items
&lt;/h1&gt;

&lt;p&gt;from operator import itemgetter&lt;br&gt;
data = [&lt;br&gt;
    {'category': 'A', 'value': 1},&lt;br&gt;
    {'category': 'A', 'value': 2},&lt;br&gt;
    {'category': 'B', 'value': 3},&lt;br&gt;
    {'category': 'B', 'value': 4}&lt;br&gt;
]&lt;br&gt;
data.sort(key=itemgetter('category'))  # MUST be sorted first!&lt;/p&gt;

&lt;p&gt;for category, items in groupby(data, key=itemgetter('category')):&lt;br&gt;
    print(f"{category}: {list(items)}")&lt;/p&gt;
&lt;h1&gt;
  
  
  4. accumulate - running totals
&lt;/h1&gt;

&lt;p&gt;from itertools import accumulate&lt;br&gt;
numbers = [1, 2, 3, 4, 5]&lt;br&gt;
running_sum = list(accumulate(numbers))  # [1, 3, 6, 10, 15]&lt;/p&gt;
&lt;h1&gt;
  
  
  Custom operation
&lt;/h1&gt;

&lt;p&gt;running_product = list(accumulate(numbers, lambda x, y: x * y))&lt;/p&gt;
&lt;h1&gt;
  
  
  [1, 2, 6, 24, 120]
&lt;/h1&gt;
&lt;h1&gt;
  
  
  5. product - cartesian product (nested loops)
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ❌ Bad - manual nested loops
&lt;/h1&gt;

&lt;p&gt;result = []&lt;br&gt;
for color in ['red', 'blue']:&lt;br&gt;
    for size in ['S', 'M', 'L']:&lt;br&gt;
        result.append((color, size))&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Good - itertools.product
&lt;/h1&gt;

&lt;p&gt;from itertools import product&lt;br&gt;
result = list(product(['red', 'blue'], ['S', 'M', 'L']))&lt;/p&gt;
&lt;h1&gt;
  
  
  [('red', 'S'), ('red', 'M'), ('red', 'L'), ('blue', 'S'), ...]
&lt;/h1&gt;
&lt;h1&gt;
  
  
  6. combinations and permutations
&lt;/h1&gt;

&lt;p&gt;from itertools import combinations, permutations&lt;br&gt;
items = ['A', 'B', 'C']&lt;/p&gt;
&lt;h1&gt;
  
  
  All 2-item combinations (order doesn't matter)
&lt;/h1&gt;

&lt;p&gt;list(combinations(items, 2))&lt;/p&gt;
&lt;h1&gt;
  
  
  [('A', 'B'), ('A', 'C'), ('B', 'C')]
&lt;/h1&gt;
&lt;h1&gt;
  
  
  All 2-item permutations (order matters)
&lt;/h1&gt;

&lt;p&gt;list(permutations(items, 2))&lt;/p&gt;
&lt;h1&gt;
  
  
  [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
&lt;/h1&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  set Operations - O(1) Membership Testing
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;
&lt;h1&gt;
  
  
  ❌ Bad - O(n) lookup in list
&lt;/h1&gt;

&lt;p&gt;allowed_users = ['alice', 'bob', 'charlie']  # List&lt;br&gt;
for user in all_users:&lt;br&gt;
    if user in allowed_users:  # O(n) check!&lt;br&gt;
        process(user)&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Good - O(1) lookup in set
&lt;/h1&gt;

&lt;p&gt;allowed_users = {'alice', 'bob', 'charlie'}  # Set&lt;br&gt;
for user in all_users:&lt;br&gt;
    if user in allowed_users:  # O(1) check!&lt;br&gt;
        process(user)&lt;/p&gt;
&lt;h1&gt;
  
  
  Set operations
&lt;/h1&gt;

&lt;p&gt;set1 = {1, 2, 3, 4, 5}&lt;br&gt;
set2 = {4, 5, 6, 7, 8}&lt;/p&gt;
&lt;h1&gt;
  
  
  Intersection (common elements)
&lt;/h1&gt;

&lt;p&gt;common = set1 &amp;amp; set2  # {4, 5}&lt;/p&gt;
&lt;h1&gt;
  
  
  Union (all elements)
&lt;/h1&gt;

&lt;p&gt;all_elements = set1 | set2  # {1, 2, 3, 4, 5, 6, 7, 8}&lt;/p&gt;
&lt;h1&gt;
  
  
  Difference (in set1 but not set2)
&lt;/h1&gt;

&lt;p&gt;only_in_set1 = set1 - set2  # {1, 2, 3}&lt;/p&gt;
&lt;h1&gt;
  
  
  Symmetric difference (in either but not both)
&lt;/h1&gt;

&lt;p&gt;symmetric = set1 ^ set2  # {1, 2, 3, 6, 7, 8}&lt;/p&gt;
&lt;h1&gt;
  
  
  Remove duplicates while preserving order (Python 3.7+)
&lt;/h1&gt;

&lt;p&gt;items = [1, 2, 2, 3, 1, 4, 3, 5]&lt;br&gt;
unique = list(dict.fromkeys(items))  # [1, 2, 3, 4, 5]&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  functools - Function Tools
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;br&gt;
from functools import lru_cache, partial, reduce&lt;/p&gt;
&lt;h1&gt;
  
  
  1. lru_cache - Memoization (caching results)
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ❌ Bad - recalculates same values
&lt;/h1&gt;

&lt;p&gt;def fibonacci_slow(n):&lt;br&gt;
    if n &amp;lt; 2:&lt;br&gt;
        return n&lt;br&gt;
    return fibonacci_slow(n-1) + fibonacci_slow(n-2)&lt;/p&gt;
&lt;h1&gt;
  
  
  fibonacci_slow(35) takes ~5 seconds
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ✅ Good - caches results
&lt;/h1&gt;

&lt;p&gt;@lru_cache(maxsize=128)&lt;br&gt;
def fibonacci_fast(n):&lt;br&gt;
    if n &amp;lt; 2:&lt;br&gt;
        return n&lt;br&gt;
    return fibonacci_fast(n-1) + fibonacci_fast(n-2)&lt;/p&gt;
&lt;h1&gt;
  
  
  fibonacci_fast(35) takes ~0.0001 seconds!
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Real-world example: expensive API call
&lt;/h1&gt;

&lt;p&gt;@lru_cache(maxsize=100)&lt;br&gt;
def get_user_data(user_id):&lt;br&gt;
    # Expensive database query or API call&lt;br&gt;
    return database.query(user_id)&lt;/p&gt;
&lt;h1&gt;
  
  
  2. partial - Pre-fill function arguments
&lt;/h1&gt;

&lt;p&gt;def power(base, exponent):&lt;br&gt;
    return base ** exponent&lt;/p&gt;

&lt;p&gt;square = partial(power, exponent=2)&lt;br&gt;
cube = partial(power, exponent=3)&lt;/p&gt;

&lt;p&gt;print(square(5))  # 25&lt;br&gt;
print(cube(5))    # 125&lt;/p&gt;
&lt;h1&gt;
  
  
  Useful with map/filter
&lt;/h1&gt;

&lt;p&gt;from functools import partial&lt;br&gt;
from operator import mul&lt;/p&gt;

&lt;p&gt;double = partial(mul, 2)&lt;br&gt;
numbers = [1, 2, 3, 4, 5]&lt;br&gt;
doubled = list(map(double, numbers))  # [2, 4, 6, 8, 10]&lt;/p&gt;
&lt;h1&gt;
  
  
  3. reduce - Cumulative operations
&lt;/h1&gt;

&lt;p&gt;from functools import reduce&lt;br&gt;
from operator import mul&lt;/p&gt;

&lt;p&gt;numbers = [1, 2, 3, 4, 5]&lt;br&gt;
product = reduce(mul, numbers)  # 1*2*3*4*5 = 120&lt;/p&gt;
&lt;h1&gt;
  
  
  More readable alternatives exist for common cases:
&lt;/h1&gt;
&lt;h1&gt;
  
  
  sum() instead of reduce(add, numbers)
&lt;/h1&gt;
&lt;h1&gt;
  
  
  math.prod() (Python 3.8+) instead of reduce(mul, numbers)
&lt;/h1&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  collections Module Power Tools
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;br&gt;
from collections import deque, namedtuple, ChainMap&lt;/p&gt;
&lt;h1&gt;
  
  
  1. deque - Fast appends/pops from both ends
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ❌ Bad - list is O(n) for left operations
&lt;/h1&gt;

&lt;p&gt;my_list = [1, 2, 3]&lt;br&gt;
my_list.insert(0, 0)  # O(n) - shifts all elements&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Good - deque is O(1) for both ends
&lt;/h1&gt;

&lt;p&gt;from collections import deque&lt;br&gt;
my_deque = deque([1, 2, 3])&lt;br&gt;
my_deque.appendleft(0)  # O(1)&lt;br&gt;
my_deque.append(4)      # O(1)&lt;br&gt;
my_deque.popleft()      # O(1)&lt;br&gt;
my_deque.pop()          # O(1)&lt;/p&gt;
&lt;h1&gt;
  
  
  Ring buffer / sliding window
&lt;/h1&gt;

&lt;p&gt;recent_items = deque(maxlen=5)  # Only keeps last 5 items&lt;br&gt;
for item in range(10):&lt;br&gt;
    recent_items.append(item)&lt;br&gt;
print(recent_items)  # deque([5, 6, 7, 8, 9])&lt;/p&gt;
&lt;h1&gt;
  
  
  2. namedtuple - Lightweight object
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ❌ Bad - dictionary overhead
&lt;/h1&gt;

&lt;p&gt;user = {'name': 'Alice', 'age': 30, 'email': '&lt;a href="mailto:alice@example.com"&gt;alice@example.com&lt;/a&gt;'}&lt;br&gt;
print(user['name'])  # Dictionary lookup&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Good - namedtuple is faster and cleaner
&lt;/h1&gt;

&lt;p&gt;from collections import namedtuple&lt;br&gt;
User = namedtuple('User', ['name', 'age', 'email'])&lt;br&gt;
user = User('Alice', 30, '&lt;a href="mailto:alice@example.com"&gt;alice@example.com&lt;/a&gt;')&lt;br&gt;
print(user.name)  # Attribute access (faster)&lt;br&gt;
print(user[0])    # Also supports indexing&lt;/p&gt;
&lt;h1&gt;
  
  
  Immutable and memory efficient
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Uses tuple's memory layout but with named access
&lt;/h1&gt;
&lt;h1&gt;
  
  
  3. ChainMap - Combine multiple dictionaries
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ❌ Bad - creates new dictionary
&lt;/h1&gt;

&lt;p&gt;config = {**defaults, **user_config, **override}  # Memory overhead&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Good - ChainMap provides view without copying
&lt;/h1&gt;

&lt;p&gt;from collections import ChainMap&lt;br&gt;
combined = ChainMap(override, user_config, defaults)&lt;/p&gt;
&lt;h1&gt;
  
  
  Lookups check each dict in order, no copying
&lt;/h1&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Context Managers - Resource Management
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;
&lt;h1&gt;
  
  
  ❌ Bad - manual resource management
&lt;/h1&gt;

&lt;p&gt;file = open('data.txt', 'r')&lt;br&gt;
try:&lt;br&gt;
    data = file.read()&lt;br&gt;
    process(data)&lt;br&gt;
finally:&lt;br&gt;
    file.close()  # Easy to forget!&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Good - automatic cleanup
&lt;/h1&gt;

&lt;p&gt;with open('data.txt', 'r') as file:&lt;br&gt;
    data = file.read()&lt;br&gt;
    process(data)&lt;/p&gt;
&lt;h1&gt;
  
  
  File automatically closed even if exception occurs
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Multiple context managers
&lt;/h1&gt;

&lt;p&gt;with open('input.txt') as infile, open('output.txt', 'w') as outfile:&lt;br&gt;
    for line in infile:&lt;br&gt;
        outfile.write(process(line))&lt;/p&gt;
&lt;h1&gt;
  
  
  Custom context manager with contextlib
&lt;/h1&gt;

&lt;p&gt;from contextlib import contextmanager&lt;br&gt;
import time&lt;/p&gt;

&lt;p&gt;@contextmanager&lt;br&gt;
def timer(name):&lt;br&gt;
    start = time.time()&lt;br&gt;
    yield  # Control returns to caller&lt;br&gt;
    end = time.time()&lt;br&gt;
    print(f"{name} took {end-start:.4f}s")&lt;/p&gt;
&lt;h1&gt;
  
  
  Usage
&lt;/h1&gt;

&lt;p&gt;with timer("Data processing"):&lt;br&gt;
    process_large_dataset()&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Assignment Expressions (Walrus Operator) - Python 3.8+
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;
&lt;h1&gt;
  
  
  ❌ Bad - compute twice or extra variable
&lt;/h1&gt;

&lt;p&gt;data = get_data()&lt;br&gt;
if len(data) &amp;gt; 0:&lt;br&gt;
    process(data)&lt;/p&gt;
&lt;h1&gt;
  
  
  Or
&lt;/h1&gt;

&lt;p&gt;if len(get_data()) &amp;gt; 0:  # Calls get_data() twice!&lt;br&gt;
    process(get_data())&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Good - compute once, use in condition
&lt;/h1&gt;

&lt;p&gt;if (n := len(data)) &amp;gt; 0:&lt;br&gt;
    print(f"Processing {n} items")&lt;br&gt;
    process(data)&lt;/p&gt;
&lt;h1&gt;
  
  
  Useful in list comprehensions
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ❌ Bad - expensive_function called twice per item
&lt;/h1&gt;

&lt;p&gt;results = [expensive_function(x) for x in items &lt;br&gt;
           if expensive_function(x) &amp;gt; threshold]&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Good - called once per item
&lt;/h1&gt;

&lt;p&gt;results = [y for x in items &lt;br&gt;
           if (y := expensive_function(x)) &amp;gt; threshold]&lt;/p&gt;
&lt;h1&gt;
  
  
  While loop pattern
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ❌ Bad
&lt;/h1&gt;

&lt;p&gt;line = file.readline()&lt;br&gt;
while line:&lt;br&gt;
    process(line)&lt;br&gt;
    line = file.readline()&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Good
&lt;/h1&gt;

&lt;p&gt;while (line := file.readline()):&lt;br&gt;
    process(line)&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Great! Let's break down this line of Python code and explain it in detail:&lt;/p&gt;


&lt;h3&gt;
  
  
  🔍 &lt;strong&gt;Code in Question&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;python&lt;br&gt;
if (n := len(data)) &amp;gt; 0:&lt;br&gt;
    print(f"Processing {n} items")&lt;br&gt;
    process(data)&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  ✅ &lt;strong&gt;What’s Happening Here?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;This line uses the &lt;strong&gt;walrus operator&lt;/strong&gt; &lt;code&gt;:=&lt;/code&gt;, which was introduced in &lt;strong&gt;Python 3.8&lt;/strong&gt;. It allows you to &lt;strong&gt;assign a value to a variable as part of an expression&lt;/strong&gt; — especially useful in conditions.&lt;/p&gt;


&lt;h3&gt;
  
  
  🧠 &lt;strong&gt;Step-by-Step Explanation&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;len(data)&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Calculates the number of items in the &lt;code&gt;data&lt;/code&gt; list (or any iterable).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;n := len(data)&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assigns the result of &lt;code&gt;len(data)&lt;/code&gt; to the variable &lt;code&gt;n&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;This is done &lt;strong&gt;inside the &lt;code&gt;if&lt;/code&gt; condition&lt;/strong&gt;, so you don’t need a separate line like:
&lt;code&gt;&lt;/code&gt;&lt;code&gt;python
n = len(data)
if n &amp;gt; 0:
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;if (n := len(data)) &amp;gt; 0:&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Checks if the length of &lt;code&gt;data&lt;/code&gt; is greater than 0.&lt;/li&gt;
&lt;li&gt;If true, it enters the block and uses &lt;code&gt;n&lt;/code&gt; (already computed) without recalculating &lt;code&gt;len(data)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;print(f"Processing {n} items")&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prints how many items are being processed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;process(data)&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Calls a function named &lt;code&gt;process()&lt;/code&gt; and passes the &lt;code&gt;data&lt;/code&gt; to it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;h3&gt;
  
  
  📌 &lt;strong&gt;Why Is This Good Practice?&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Efficiency&lt;/strong&gt;: You compute &lt;code&gt;len(data)&lt;/code&gt; &lt;strong&gt;once&lt;/strong&gt;, but use it &lt;strong&gt;twice&lt;/strong&gt; — in the condition and in the print statement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleaner Code&lt;/strong&gt;: Avoids repetition and keeps logic compact.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Readability&lt;/strong&gt;: Once you're familiar with the walrus operator, it makes code more expressive.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  🧪 &lt;strong&gt;Example Without Walrus Operator&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;python&lt;br&gt;
n = len(data)&lt;br&gt;
if n &amp;gt; 0:&lt;br&gt;
    print(f"Processing {n} items")&lt;br&gt;
    process(data)&lt;br&gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This is perfectly fine too — but the walrus operator lets you do it in one line.&lt;/p&gt;


&lt;h2&gt;
  
  
  10. Profiling: Finding the Real Bottlenecks
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Why Profile?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;
&lt;h1&gt;
  
  
  You might think THIS is slow:
&lt;/h1&gt;

&lt;p&gt;def process_data(data):&lt;br&gt;
    # Complex calculation&lt;br&gt;
    results = [x*&lt;em&gt;2 + x&lt;/em&gt;&lt;em&gt;3 + x&lt;/em&gt;*4 for x in data]  # Suspicious!&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Simple operation
return '\n'.join(map(str, results))  # Looks innocent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  But profiling reveals the truth:
&lt;/h1&gt;
&lt;h1&gt;
  
  
  95% of time is spent in join()!
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Only 5% in the calculation
&lt;/h1&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Basic Profiling with cProfile
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;br&gt;
import cProfile&lt;br&gt;
import pstats&lt;/p&gt;

&lt;p&gt;def my_function():&lt;br&gt;
    # Your code here&lt;br&gt;
    data = list(range(10000))&lt;br&gt;
    result = [x**2 for x in data]&lt;br&gt;
    return sum(result)&lt;/p&gt;
&lt;h1&gt;
  
  
  Profile the function
&lt;/h1&gt;

&lt;p&gt;cProfile.run('my_function()', 'output.prof')&lt;/p&gt;
&lt;h1&gt;
  
  
  Analyze results
&lt;/h1&gt;

&lt;p&gt;stats = pstats.Stats('output.prof')&lt;br&gt;
stats.sort_stats('cumulative')&lt;br&gt;
stats.print_stats(10)  # Top 10 slowest&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Line-by-Line Profiling
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;
&lt;h1&gt;
  
  
  Install: pip install line_profiler
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Add &lt;a class="mentioned-user" href="https://dev.to/profile"&gt;@profile&lt;/a&gt; decorator
&lt;/h1&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/profile"&gt;@profile&lt;/a&gt;&lt;br&gt;
def slow_function():&lt;br&gt;
    result = []&lt;br&gt;
    for i in range(10000):&lt;br&gt;
        result.append(i ** 2)  # How slow is this?&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;total = sum(result)  # How about this?

return total
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  Run: kernprof -l -v script.py
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Shows time spent on EACH LINE
&lt;/h1&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Memory Profiling
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;
&lt;h1&gt;
  
  
  Install: pip install memory_profiler
&lt;/h1&gt;

&lt;p&gt;from memory_profiler import profile&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/profile"&gt;@profile&lt;/a&gt;&lt;br&gt;
def memory_hog():&lt;br&gt;
    # ❌ Bad - creates huge list&lt;br&gt;
    big_list = [i for i in range(10000000)]&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# ✅ Good - uses generator
big_gen = (i for i in range(10000000))

return sum(big_gen)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  Run: python -m memory_profiler script.py
&lt;/h1&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Quick Timing with timeit
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;br&gt;
import timeit&lt;/p&gt;
&lt;h1&gt;
  
  
  Compare different approaches
&lt;/h1&gt;

&lt;p&gt;setup = "data = list(range(1000))"&lt;/p&gt;
&lt;h1&gt;
  
  
  Approach 1
&lt;/h1&gt;

&lt;p&gt;time1 = timeit.timeit(&lt;br&gt;
    "result = [x**2 for x in data]",&lt;br&gt;
    setup=setup,&lt;br&gt;
    number=10000&lt;br&gt;
)&lt;/p&gt;
&lt;h1&gt;
  
  
  Approach 2
&lt;/h1&gt;

&lt;p&gt;time2 = timeit.timeit(&lt;br&gt;
    "result = list(map(lambda x: x**2, data))",&lt;br&gt;
    setup=setup,&lt;br&gt;
    number=10000&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;print(f"List comp: {time1:.4f}s")&lt;br&gt;
print(f"Map: {time2:.4f}s")&lt;br&gt;
print(f"Winner: {'List comp' if time1 &amp;lt; time2 else 'Map'}")&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  13. Memory Optimization Techniques
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Generators vs Lists
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;
&lt;h1&gt;
  
  
  ❌ Bad - loads everything into memory
&lt;/h1&gt;

&lt;p&gt;def read_large_file_bad(filename):&lt;br&gt;
    with open(filename) as f:&lt;br&gt;
        return [line.strip() for line in f]  # All lines in memory!&lt;/p&gt;
&lt;h1&gt;
  
  
  For 1GB file, needs 1GB+ RAM
&lt;/h1&gt;

&lt;p&gt;lines = read_large_file_bad('huge.txt')&lt;br&gt;
for line in lines:&lt;br&gt;
    process(line)&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Good - processes one line at a time
&lt;/h1&gt;

&lt;p&gt;def read_large_file_good(filename):&lt;br&gt;
    with open(filename) as f:&lt;br&gt;
        for line in f:  # Generator, not list!&lt;br&gt;
            yield line.strip()&lt;/p&gt;
&lt;h1&gt;
  
  
  Only one line in memory at a time
&lt;/h1&gt;

&lt;p&gt;for line in read_large_file_good('huge.txt'):&lt;br&gt;
    process(line)&lt;/p&gt;
&lt;h1&gt;
  
  
  Generator expression vs list comprehension
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ❌ List comprehension - immediate memory allocation
&lt;/h1&gt;

&lt;p&gt;squares_list = [x**2 for x in range(1000000)]  # ~8MB memory&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Generator expression - lazy evaluation
&lt;/h1&gt;

&lt;p&gt;squares_gen = (x**2 for x in range(1000000))   # ~128 bytes&lt;/p&gt;
&lt;h1&gt;
  
  
  Values computed on-demand
&lt;/h1&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to Use Generators:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Processing large datasets&lt;/li&gt;
&lt;li&gt;Pipeline operations (one result feeds into another)&lt;/li&gt;
&lt;li&gt;You don't need the entire result set at once&lt;/li&gt;
&lt;li&gt;Memory is a concern&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When to Use Lists:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Need multiple passes over data&lt;/li&gt;
&lt;li&gt;Need random access (indexing)&lt;/li&gt;
&lt;li&gt;Need to know the length&lt;/li&gt;
&lt;li&gt;Dataset is small&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;slots&lt;/strong&gt; - Reduce Object Memory
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;
&lt;h1&gt;
  
  
  ❌ Bad - each instance has &lt;strong&gt;dict&lt;/strong&gt; (overhead)
&lt;/h1&gt;

&lt;p&gt;class Point:&lt;br&gt;
    def &lt;strong&gt;init&lt;/strong&gt;(self, x, y):&lt;br&gt;
        self.x = x&lt;br&gt;
        self.y = y&lt;/p&gt;
&lt;h1&gt;
  
  
  Each instance: ~280 bytes (with &lt;strong&gt;dict&lt;/strong&gt;)
&lt;/h1&gt;

&lt;p&gt;p = Point(1, 2)&lt;br&gt;
print(p.&lt;strong&gt;dict&lt;/strong&gt;)  # {'x': 1, 'y': 2}&lt;/p&gt;
&lt;h1&gt;
  
  
  ✅ Good - use &lt;strong&gt;slots&lt;/strong&gt; for memory efficiency
&lt;/h1&gt;

&lt;p&gt;class PointSlots:&lt;br&gt;
    &lt;strong&gt;slots&lt;/strong&gt; = ['x', 'y']  # Fixed attributes&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def __init__(self, x, y):
    self.x = x
    self.y = y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  Each instance: ~48 bytes (no &lt;strong&gt;dict&lt;/strong&gt;)
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ~80% memory reduction!
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Real impact with many objects
&lt;/h1&gt;
&lt;h1&gt;
  
  
  1 million Points: ~280MB vs ~48MB
&lt;/h1&gt;

&lt;p&gt;points = [PointSlots(i, i) for i in range(1000000)]&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to Use &lt;strong&gt;slots&lt;/strong&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating millions of instances&lt;/li&gt;
&lt;li&gt;Objects have fixed set of attributes&lt;/li&gt;
&lt;li&gt;Memory is critical (e.g., data science, games)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tradeoffs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can't add attributes dynamically&lt;/li&gt;
&lt;li&gt;Slightly less flexible&lt;/li&gt;
&lt;li&gt;No &lt;strong&gt;dict&lt;/strong&gt; attribute&lt;/li&gt;
&lt;li&gt;Can't use with multiple inheritance (complex rules)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Array Module - Compact Numeric Arrays
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;
&lt;h1&gt;
  
  
  ❌ Bad - list of numbers (lots of overhead)
&lt;/h1&gt;

&lt;p&gt;numbers_list = [1, 2, 3, 4, 5] * 100000&lt;/p&gt;
&lt;h1&gt;
  
  
  Each integer object: ~28 bytes
&lt;/h1&gt;
&lt;h1&gt;
  
  
  500,000 integers: ~14MB
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ✅ Good - array module (C-style array)
&lt;/h1&gt;

&lt;p&gt;from array import array&lt;br&gt;
numbers_array = array('i', [1, 2, 3, 4, 5] * 100000)&lt;/p&gt;
&lt;h1&gt;
  
  
  Each integer: 4 bytes
&lt;/h1&gt;
&lt;h1&gt;
  
  
  500,000 integers: ~2MB (7x less memory!)
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Type codes:
&lt;/h1&gt;
&lt;h1&gt;
  
  
  'b': signed char (1 byte)
&lt;/h1&gt;
&lt;h1&gt;
  
  
  'i': signed int (4 bytes)
&lt;/h1&gt;
&lt;h1&gt;
  
  
  'f': float (4 bytes)
&lt;/h1&gt;
&lt;h1&gt;
  
  
  'd': double (8 bytes)
&lt;/h1&gt;
&lt;h1&gt;
  
  
  For numerical computing, use numpy (even better)
&lt;/h1&gt;

&lt;p&gt;import numpy as np&lt;br&gt;
numbers_numpy = np.array([1, 2, 3, 4, 5] * 100000, dtype=np.int32)&lt;/p&gt;
&lt;h1&gt;
  
  
  Optimized for mathematical operations
&lt;/h1&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  String Interning
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;
&lt;h1&gt;
  
  
  Python automatically interns some strings
&lt;/h1&gt;

&lt;p&gt;a = "hello"&lt;br&gt;
b = "hello"&lt;br&gt;
print(a is b)  # True - same object in memory&lt;/p&gt;
&lt;h1&gt;
  
  
  Force interning for frequently used strings
&lt;/h1&gt;

&lt;p&gt;from sys import intern&lt;/p&gt;
&lt;h1&gt;
  
  
  ❌ Bad - many identical strings
&lt;/h1&gt;

&lt;p&gt;tags = ["python", "python", "python"] * 10000&lt;/p&gt;
&lt;h1&gt;
  
  
  Each "python" might be a separate object
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ✅ Good - intern frequently used strings
&lt;/h1&gt;

&lt;p&gt;tags = [intern("python")] * 30000&lt;/p&gt;
&lt;h1&gt;
  
  
  All reference same object
&lt;/h1&gt;
&lt;h1&gt;
  
  
  Useful for:
&lt;/h1&gt;
&lt;h1&gt;
  
  
  - Large datasets with repeated string values
&lt;/h1&gt;
&lt;h1&gt;
  
  
  - Dictionary keys that repeat
&lt;/h1&gt;
&lt;h1&gt;
  
  
  - Tag systems, category labels
&lt;/h1&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Weak References - Avoid Circular References
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;br&gt;
import weakref&lt;/p&gt;
&lt;h1&gt;
  
  
  ❌ Bad - circular reference prevents garbage collection
&lt;/h1&gt;

&lt;p&gt;class Node:&lt;br&gt;
    def &lt;strong&gt;init&lt;/strong&gt;(self, value):&lt;br&gt;
        self.value = value&lt;br&gt;
        self.parent = None&lt;br&gt;
        self.children = []&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def add_child(self, child):
    child.parent = self  # Strong reference cycle!
    self.children.append(child)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
  
  
  Creates memory leak - nodes never freed
&lt;/h1&gt;
&lt;h1&gt;
  
  
  ✅ Good - use weak references
&lt;/h1&gt;

&lt;p&gt;class NodeWeak:&lt;br&gt;
    def &lt;strong&gt;init&lt;/strong&gt;(self, value):&lt;br&gt;
        self.value = value&lt;br&gt;
        self._parent = None&lt;br&gt;
        self.children = []&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@property
def parent(self):
    return self._parent() if self._parent else None

@parent.setter
def parent(self, node):
    self._parent = weakref.ref(node) if node else None

def add_child(self, child):
    child.parent = self  # Weak reference, can be freed
    self.children.append(child)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  14. Algorithm Complexity Matters
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Choose the Right Data Structure
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`python&lt;/p&gt;

&lt;h1&gt;
  
  
  Searching: O(n) vs O(1)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ❌ Bad - O(n) lookup in list
&lt;/h1&gt;

&lt;p&gt;valid_ids = [1, 5, 10, 15, 20, 25, 30]  # 7 items&lt;br&gt;
if user_id in valid_ids:  # Checks each item: O(n)&lt;br&gt;
    grant_access()&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Good - O(1) lookup in set
&lt;/h1&gt;

&lt;p&gt;valid_ids = {1, 5, 10, 15, 20, 25, 30}&lt;br&gt;
if user_id in valid_ids:  # Hash lookup: O(1)&lt;br&gt;
    grant_access()&lt;/p&gt;

&lt;h1&gt;
  
  
  For 1 million IDs, 1 million lookups:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  List: ~trillion operations
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Set: ~1 million operations (1000x faster!)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Removing duplicates
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ❌ Bad - O(n²)
&lt;/h1&gt;

&lt;p&gt;def remove_duplicates_bad(items):&lt;br&gt;
    result = []&lt;br&gt;
    for item in items:&lt;br&gt;
        if item not in result:  # O(n) check&lt;br&gt;
            result.append(item)&lt;br&gt;
    return result&lt;/p&gt;

&lt;h1&gt;
  
  
  10,000 items: ~100 million operations
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ✅ Good - O(n)
&lt;/h1&gt;

&lt;p&gt;def remove_duplicates_good(items):&lt;br&gt;
    return list(dict.fromkeys(items))  # Preserves order (3.7+)&lt;/p&gt;

&lt;h1&gt;
  
  
  10,000 items: ~10,000 operations
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Or if order doesn't matter:
&lt;/h1&gt;

&lt;p&gt;def remove_duplicates_set(items):&lt;br&gt;
    return list(set(items))&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  Avoid Nested Loops When Possible
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;/p&gt;

&lt;h1&gt;
  
  
  ❌ Bad - O(n²) complexity
&lt;/h1&gt;

&lt;p&gt;def find_common_bad(list1, list2):&lt;br&gt;
    common = []&lt;br&gt;
    for item1 in list1:        # O(n)&lt;br&gt;
        for item2 in list2:    # O(m)&lt;br&gt;
            if item1 == item2:&lt;br&gt;
                common.append(item1)&lt;br&gt;
    return common&lt;/p&gt;

&lt;h1&gt;
  
  
  1000 items each: 1 million comparisons
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ✅ Good - O(n + m) complexity
&lt;/h1&gt;

&lt;p&gt;def find_common_good(list1, list2):&lt;br&gt;
    set2 = set(list2)  # O(m)&lt;br&gt;
    return [item for item in list1 if item in set2]  # O(n)&lt;/p&gt;

&lt;h1&gt;
  
  
  1000 items each: ~2000 operations (500x faster!)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Even better - use set intersection
&lt;/h1&gt;

&lt;p&gt;def find_common_best(list1, list2):&lt;br&gt;
    return list(set(list1) &amp;amp; set(list2))  # O(min(n, m))&lt;/p&gt;

&lt;h1&gt;
  
  
  Practical example: finding duplicate emails
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ❌ Bad - O(n²)
&lt;/h1&gt;

&lt;p&gt;def find_duplicate_emails_bad(users):&lt;br&gt;
    duplicates = []&lt;br&gt;
    for i, user1 in enumerate(users):&lt;br&gt;
        for user2 in users[i+1:]:&lt;br&gt;
            if user1['email'] == user2['email']:&lt;br&gt;
                duplicates.append(user1['email'])&lt;br&gt;
    return duplicates&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Good - O(n)
&lt;/h1&gt;

&lt;p&gt;def find_duplicate_emails_good(users):&lt;br&gt;
    seen = set()&lt;br&gt;
    duplicates = set()&lt;br&gt;
    for user in users:&lt;br&gt;
        email = user['email']&lt;br&gt;
        if email in seen:&lt;br&gt;
            duplicates.add(email)&lt;br&gt;
        else:&lt;br&gt;
            seen.add(email)&lt;br&gt;
    return list(duplicates)&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  Use bisect for Sorted Data
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;br&gt;
import bisect&lt;/p&gt;

&lt;h1&gt;
  
  
  ❌ Bad - linear search in sorted list O(n)
&lt;/h1&gt;

&lt;p&gt;sorted_numbers = list(range(0, 1000000, 2))  # Even numbers&lt;/p&gt;

&lt;p&gt;def find_position_bad(numbers, value):&lt;br&gt;
    for i, num in enumerate(numbers):&lt;br&gt;
        if num &amp;gt;= value:&lt;br&gt;
            return i&lt;br&gt;
    return len(numbers)&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Good - binary search O(log n)
&lt;/h1&gt;

&lt;p&gt;def find_position_good(numbers, value):&lt;br&gt;
    return bisect.bisect_left(numbers, value)&lt;/p&gt;

&lt;h1&gt;
  
  
  Insert while maintaining sort order
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ❌ Bad - O(n log n) due to sort
&lt;/h1&gt;

&lt;p&gt;def insert_sorted_bad(numbers, value):&lt;br&gt;
    numbers.append(value)&lt;br&gt;
    numbers.sort()&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Good - O(n) just for insertion
&lt;/h1&gt;

&lt;p&gt;def insert_sorted_good(numbers, value):&lt;br&gt;
    bisect.insort(numbers, value)&lt;/p&gt;

&lt;h1&gt;
  
  
  Real-world example: maintaining sorted timestamps
&lt;/h1&gt;

&lt;p&gt;from bisect import insort&lt;br&gt;
timestamps = []&lt;/p&gt;

&lt;p&gt;def add_event(event_time):&lt;br&gt;
    insort(timestamps, event_time)  # Keeps sorted&lt;/p&gt;

&lt;p&gt;def get_events_in_range(start, end):&lt;br&gt;
    # O(log n) to find positions&lt;br&gt;
    left = bisect.bisect_left(timestamps, start)&lt;br&gt;
    right = bisect.bisect_right(timestamps, end)&lt;br&gt;
    return timestamps[left:right]&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;




&lt;h2&gt;
  
  
  15. String Operations Optimization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  String Methods vs Regex
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;br&gt;
import re&lt;br&gt;
import time&lt;/p&gt;

&lt;p&gt;text = "Hello, World! This is a test." * 1000&lt;/p&gt;

&lt;h1&gt;
  
  
  ❌ Slower - regex for simple operations
&lt;/h1&gt;

&lt;p&gt;start = time.time()&lt;br&gt;
for _ in range(10000):&lt;br&gt;
    result = re.sub(r'test', 'exam', text)&lt;br&gt;
print(f"Regex: {time.time() - start:.4f}s")&lt;/p&gt;

&lt;h1&gt;
  
  
  Output: ~0.8s
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ✅ Faster - string method
&lt;/h1&gt;

&lt;p&gt;start = time.time()&lt;br&gt;
for _ in range(10000):&lt;br&gt;
    result = text.replace('test', 'exam')&lt;br&gt;
print(f"String method: {time.time() - start:.4f}s")&lt;/p&gt;

&lt;h1&gt;
  
  
  Output: ~0.1s (8x faster!)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Use regex only when you need pattern matching
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ❌ Overkill
&lt;/h1&gt;

&lt;p&gt;if re.match(r'hello', text.lower()):&lt;br&gt;
    pass&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Better
&lt;/h1&gt;

&lt;p&gt;if text.lower().startswith('hello'):&lt;br&gt;
    pass&lt;/p&gt;

&lt;h1&gt;
  
  
  When regex is appropriate:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Pattern matching: r'\d{3}-\d{3}-\d{4}' for phone numbers
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Complex replacements: r'(\w+)\s+(\w+)' -&amp;gt; r'\2 \1'
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Multiple patterns: r'(cat|dog|bird)'
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  String Building with f-strings (Python 3.6+)
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;/p&gt;

&lt;h1&gt;
  
  
  Performance comparison
&lt;/h1&gt;

&lt;p&gt;name = "Alice"&lt;br&gt;
age = 30&lt;br&gt;
city = "NYC"&lt;/p&gt;

&lt;h1&gt;
  
  
  ❌ Slowest - concatenation
&lt;/h1&gt;

&lt;p&gt;result = "Name: " + name + ", Age: " + str(age) + ", City: " + city&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Fast - % formatting
&lt;/h1&gt;

&lt;p&gt;result = "Name: %s, Age: %d, City: %s" % (name, age, city)&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Fast - .format()
&lt;/h1&gt;

&lt;p&gt;result = "Name: {}, Age: {}, City: {}".format(name, age, city)&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Fastest - f-strings (and most readable!)
&lt;/h1&gt;

&lt;p&gt;result = f"Name: {name}, Age: {age}, City: {city}"&lt;/p&gt;

&lt;h1&gt;
  
  
  f-strings can also include expressions
&lt;/h1&gt;

&lt;p&gt;prices = [10.50, 23.75, 5.25]&lt;br&gt;
result = f"Total: ${sum(prices):.2f}"  # Total: $39.50&lt;/p&gt;

&lt;h1&gt;
  
  
  Multi-line f-strings
&lt;/h1&gt;

&lt;p&gt;message = (&lt;br&gt;
    f"User: {name}\n"&lt;br&gt;
    f"Age: {age}\n"&lt;br&gt;
    f"City: {city}"&lt;br&gt;
)&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  str.translate() - Fast Character Replacement
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;/p&gt;

&lt;h1&gt;
  
  
  ❌ Bad - multiple replace calls
&lt;/h1&gt;

&lt;p&gt;def remove_punctuation_bad(text):&lt;br&gt;
    for char in '.,;:!?':&lt;br&gt;
        text = text.replace(char, '')&lt;br&gt;
    return text&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Good - single translate call
&lt;/h1&gt;

&lt;p&gt;def remove_punctuation_good(text):&lt;br&gt;
    translator = str.maketrans('', '', '.,;:!?')&lt;br&gt;
    return text.translate(translator)&lt;/p&gt;

&lt;h1&gt;
  
  
  Even more complex translations
&lt;/h1&gt;

&lt;p&gt;def leetspeak(text):&lt;br&gt;
    translation_table = str.maketrans({&lt;br&gt;
        'a': '4',&lt;br&gt;
        'e': '3',&lt;br&gt;
        'i': '1',&lt;br&gt;
        'o': '0',&lt;br&gt;
        's': '5',&lt;br&gt;
        't': '7'&lt;br&gt;
    })&lt;br&gt;
    return text.lower().translate(translation_table)&lt;/p&gt;

&lt;p&gt;print(leetspeak("Hello World"))  # h3ll0 w0rld&lt;/p&gt;

&lt;h1&gt;
  
  
  Performance comparison
&lt;/h1&gt;

&lt;p&gt;import time&lt;br&gt;
text = "Hello, World! How are you today?" * 10000&lt;/p&gt;

&lt;p&gt;start = time.time()&lt;br&gt;
for _ in range(1000):&lt;br&gt;
    result = remove_punctuation_bad(text)&lt;br&gt;
print(f"Multiple replace: {time.time() - start:.4f}s")&lt;/p&gt;

&lt;h1&gt;
  
  
  Output: ~1.2s
&lt;/h1&gt;

&lt;p&gt;start = time.time()&lt;br&gt;
for _ in range(1000):&lt;br&gt;
    result = remove_punctuation_good(text)&lt;br&gt;
print(f"Translate: {time.time() - start:.4f}s")&lt;/p&gt;

&lt;h1&gt;
  
  
  Output: ~0.15s (8x faster!)
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;




&lt;h2&gt;
  
  
  16. Comprehensions vs map/filter
&lt;/h2&gt;

&lt;h3&gt;
  
  
  When to Use Each
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;br&gt;
numbers = range(1000)&lt;/p&gt;

&lt;h1&gt;
  
  
  List comprehension - clear and Pythonic
&lt;/h1&gt;

&lt;p&gt;squares = [x**2 for x in numbers]&lt;/p&gt;

&lt;h1&gt;
  
  
  map with lambda - slower due to lambda
&lt;/h1&gt;

&lt;p&gt;squares = list(map(lambda x: x**2, numbers))&lt;/p&gt;

&lt;h1&gt;
  
  
  map with built-in function - FASTEST
&lt;/h1&gt;

&lt;p&gt;from operator import mul&lt;br&gt;
from functools import partial&lt;br&gt;
double = partial(mul, 2)&lt;br&gt;
doubled = list(map(double, numbers))&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Use list comprehension when:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Transformation is complex
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Need filtering with transformation
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Readability is priority
&lt;/h1&gt;

&lt;p&gt;result = [x**2 for x in numbers if x % 2 == 0]&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Use map when:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Applying built-in function or C-function
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Don't need intermediate list (return iterator)
&lt;/h1&gt;

&lt;p&gt;result = map(str.upper, words)  # Iterator, no list created&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Use filter when:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Simple predicate function
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Don't need transformation
&lt;/h1&gt;

&lt;p&gt;result = filter(str.isdigit, characters)&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  Nested Comprehensions
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;/p&gt;

&lt;h1&gt;
  
  
  ❌ Bad - hard to read
&lt;/h1&gt;

&lt;p&gt;matrix = []&lt;br&gt;
for i in range(3):&lt;br&gt;
    row = []&lt;br&gt;
    for j in range(3):&lt;br&gt;
        row.append(i * j)&lt;br&gt;
    matrix.append(row)&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Good - nested comprehension
&lt;/h1&gt;

&lt;p&gt;matrix = [[i * j for j in range(3)] for i in range(3)]&lt;/p&gt;

&lt;h1&gt;
  
  
  [[0, 0, 0], [0, 1, 2], [0, 2, 4]]
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Flatten nested list
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ❌ Bad - manual loops
&lt;/h1&gt;

&lt;p&gt;nested = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]&lt;br&gt;
flat = []&lt;br&gt;
for sublist in nested:&lt;br&gt;
    for item in sublist:&lt;br&gt;
        flat.append(item)&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Good - list comprehension
&lt;/h1&gt;

&lt;p&gt;flat = [item for sublist in nested for item in sublist]&lt;/p&gt;

&lt;h1&gt;
  
  
  [1, 2, 3, 4, 5, 6, 7, 8, 9]
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ✅ Best for deeply nested - use itertools
&lt;/h1&gt;

&lt;p&gt;from itertools import chain&lt;br&gt;
flat = list(chain.from_iterable(nested))&lt;/p&gt;

&lt;h1&gt;
  
  
  Dictionary comprehension
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ❌ Bad
&lt;/h1&gt;

&lt;p&gt;word_lengths = {}&lt;br&gt;
for word in words:&lt;br&gt;
    word_lengths[word] = len(word)&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Good
&lt;/h1&gt;

&lt;p&gt;word_lengths = {word: len(word) for word in words}&lt;/p&gt;

&lt;h1&gt;
  
  
  Set comprehension
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ❌ Bad
&lt;/h1&gt;

&lt;p&gt;unique_lengths = set()&lt;br&gt;
for word in words:&lt;br&gt;
    unique_lengths.add(len(word))&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Good
&lt;/h1&gt;

&lt;p&gt;unique_lengths = {len(word) for word in words}&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;




&lt;h2&gt;
  
  
  17. Number Operations Optimization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Integer Operations
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;/p&gt;

&lt;h1&gt;
  
  
  In Python, some operations are faster than others
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ❌ Slower
&lt;/h1&gt;

&lt;p&gt;x = 47&lt;br&gt;
result = x * 2      # Multiplication&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Faster (though less readable)
&lt;/h1&gt;

&lt;p&gt;result = x &amp;lt;&amp;lt; 1     # Bit shift (left shift by 1 = multiply by 2)&lt;/p&gt;

&lt;h1&gt;
  
  
  BUT: In practice, the difference is tiny
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Only optimize this in extremely tight loops
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Readability usually trumps micro-optimization
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Division: // (floor division) vs / (true division)
&lt;/h1&gt;

&lt;p&gt;import time&lt;/p&gt;

&lt;h1&gt;
  
  
  True division (returns float)
&lt;/h1&gt;

&lt;p&gt;start = time.time()&lt;br&gt;
for i in range(10000000):&lt;br&gt;
    result = i / 2&lt;br&gt;
print(f"True division: {time.time() - start:.4f}s")&lt;/p&gt;

&lt;h1&gt;
  
  
  Output: ~0.5s
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Floor division (returns int)
&lt;/h1&gt;

&lt;p&gt;start = time.time()&lt;br&gt;
for i in range(10000000):&lt;br&gt;
    result = i // 2&lt;br&gt;
print(f"Floor division: {time.time() - start:.4f}s")&lt;/p&gt;

&lt;h1&gt;
  
  
  Output: ~0.4s (20% faster if you need integer result)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Modulo operations
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Use &amp;amp; for power-of-2 modulo (much faster)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ❌ Slower
&lt;/h1&gt;

&lt;p&gt;if x % 2 == 0:  # Check if even&lt;br&gt;
    pass&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Faster (but less clear)
&lt;/h1&gt;

&lt;p&gt;if x &amp;amp; 1 == 0:  # Check if even using bitwise AND&lt;br&gt;
    pass&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  Float Operations
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;/p&gt;

&lt;h1&gt;
  
  
  Avoid float when integers work
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ❌ Slower - unnecessary float operations
&lt;/h1&gt;

&lt;p&gt;total = 0.0&lt;br&gt;
for i in range(1000000):&lt;br&gt;
    total += float(i)&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Faster - integer operations
&lt;/h1&gt;

&lt;p&gt;total = 0&lt;br&gt;
for i in range(1000000):&lt;br&gt;
    total += i&lt;/p&gt;

&lt;h1&gt;
  
  
  Use math module for complex operations
&lt;/h1&gt;

&lt;p&gt;import math&lt;/p&gt;

&lt;h1&gt;
  
  
  ❌ Slower - repeated exponentiation
&lt;/h1&gt;

&lt;p&gt;result = x ** 0.5&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Faster - dedicated function
&lt;/h1&gt;

&lt;p&gt;result = math.sqrt(x)&lt;/p&gt;

&lt;h1&gt;
  
  
  ❌ Slower
&lt;/h1&gt;

&lt;p&gt;result = x ** 2&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Faster (and clearer)
&lt;/h1&gt;

&lt;p&gt;result = x * x&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  Decimal for Financial Calculations
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;/p&gt;

&lt;h1&gt;
  
  
  ❌ Bad - float precision issues
&lt;/h1&gt;

&lt;p&gt;price = 0.1&lt;br&gt;
quantity = 3&lt;br&gt;
total = price * quantity&lt;br&gt;
print(total)  # 0.30000000000000004 (WRONG for money!)&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Good - Decimal for exact precision
&lt;/h1&gt;

&lt;p&gt;from decimal import Decimal&lt;/p&gt;

&lt;p&gt;price = Decimal('0.1')&lt;br&gt;
quantity = 3&lt;br&gt;
total = price * quantity&lt;br&gt;
print(total)  # 0.3 (CORRECT)&lt;/p&gt;

&lt;h1&gt;
  
  
  Real-world example
&lt;/h1&gt;

&lt;p&gt;from decimal import Decimal, ROUND_HALF_UP&lt;/p&gt;

&lt;p&gt;def calculate_total(prices):&lt;br&gt;
    total = sum(Decimal(str(price)) for price in prices)&lt;br&gt;
    # Round to 2 decimal places for currency&lt;br&gt;
    return total.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)&lt;/p&gt;

&lt;p&gt;prices = [10.10, 20.20, 30.33]&lt;br&gt;
print(calculate_total(prices))  # 60.63&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;




&lt;h2&gt;
  
  
  18. Exception Handling Performance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  EAFP vs LBYL
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;/p&gt;

&lt;h1&gt;
  
  
  LBYL (Look Before You Leap)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ❌ Slower when condition is usually true
&lt;/h1&gt;

&lt;p&gt;if key in dictionary:&lt;br&gt;
    value = dictionary[key]&lt;br&gt;
else:&lt;br&gt;
    value = default&lt;/p&gt;

&lt;h1&gt;
  
  
  EAFP (Easier to Ask for Forgiveness than Permission)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ✅ Faster when exception is rare
&lt;/h1&gt;

&lt;p&gt;try:&lt;br&gt;
    value = dictionary[key]&lt;br&gt;
except KeyError:&lt;br&gt;
    value = default&lt;/p&gt;

&lt;h1&gt;
  
  
  Why EAFP is faster:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - No extra dictionary lookup when key exists
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Exceptions are cheap when not raised
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Only pays penalty on actual error
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Performance comparison
&lt;/h1&gt;

&lt;p&gt;import time&lt;/p&gt;

&lt;p&gt;data = {i: i*2 for i in range(10000)}&lt;/p&gt;

&lt;h1&gt;
  
  
  LBYL approach
&lt;/h1&gt;

&lt;p&gt;start = time.time()&lt;br&gt;
for i in range(10000):&lt;br&gt;
    if i in data:  # Extra lookup&lt;br&gt;
        value = data[i]  # Second lookup&lt;br&gt;
print(f"LBYL: {time.time() - start:.4f}s")&lt;/p&gt;

&lt;h1&gt;
  
  
  Output: ~0.003s
&lt;/h1&gt;

&lt;h1&gt;
  
  
  EAFP approach
&lt;/h1&gt;

&lt;p&gt;start = time.time()&lt;br&gt;
for i in range(10000):&lt;br&gt;
    try:&lt;br&gt;
        value = data[i]  # Single lookup&lt;br&gt;
    except KeyError:&lt;br&gt;
        pass&lt;br&gt;
print(f"EAFP: {time.time() - start:.4f}s")&lt;/p&gt;

&lt;h1&gt;
  
  
  Output: ~0.002s (30% faster when key exists)
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  Avoid Exceptions in Hot Paths
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;/p&gt;

&lt;h1&gt;
  
  
  When exceptions are common, they're expensive
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ❌ Bad - exception raised 50% of the time
&lt;/h1&gt;

&lt;p&gt;def process_items_bad(items):&lt;br&gt;
    results = []&lt;br&gt;
    for item in items:&lt;br&gt;
        try:&lt;br&gt;
            results.append(expensive_operation(item))&lt;br&gt;
        except ValueError:  # Raised for 50% of items!&lt;br&gt;
            results.append(None)&lt;br&gt;
    return results&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Good - check first if exceptions are common
&lt;/h1&gt;

&lt;p&gt;def process_items_good(items):&lt;br&gt;
    results = []&lt;br&gt;
    for item in items:&lt;br&gt;
        if is_valid(item):  # Cheap check&lt;br&gt;
            results.append(expensive_operation(item))&lt;br&gt;
        else:&lt;br&gt;
            results.append(None)&lt;br&gt;
    return results&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;




&lt;h2&gt;
  
  
  19. Parallel Processing
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Threading vs Multiprocessing vs AsyncIO
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;br&gt;
import time&lt;br&gt;
import threading&lt;br&gt;
import multiprocessing&lt;br&gt;
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor&lt;/p&gt;

&lt;p&gt;def cpu_bound_task(n):&lt;br&gt;
    """Simulates CPU-intensive work"""&lt;br&gt;
    return sum(i*i for i in range(n))&lt;/p&gt;

&lt;p&gt;def io_bound_task(n):&lt;br&gt;
    """Simulates I/O wait (network, disk)"""&lt;br&gt;
    time.sleep(0.1)  # Simulate I/O wait&lt;br&gt;
    return n * 2&lt;/p&gt;

&lt;h1&gt;
  
  
  ❌ Bad - sequential for I/O-bound tasks
&lt;/h1&gt;

&lt;p&gt;def process_io_sequential(tasks):&lt;br&gt;
    results = []&lt;br&gt;
    for task in tasks:&lt;br&gt;
        results.append(io_bound_task(task))&lt;br&gt;
    return results&lt;/p&gt;

&lt;h1&gt;
  
  
  Time: 10 tasks * 0.1s = 1 second
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ✅ Good - threading for I/O-bound
&lt;/h1&gt;

&lt;p&gt;def process_io_threaded(tasks):&lt;br&gt;
    with ThreadPoolExecutor(max_workers=10) as executor:&lt;br&gt;
        results = list(executor.map(io_bound_task, tasks))&lt;br&gt;
    return results&lt;/p&gt;

&lt;h1&gt;
  
  
  Time: ~0.1 seconds (10x faster!)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ❌ Bad - threading for CPU-bound (GIL limitation)
&lt;/h1&gt;

&lt;p&gt;def process_cpu_threaded(tasks):&lt;br&gt;
    with ThreadPoolExecutor(max_workers=4) as executor:&lt;br&gt;
        results = list(executor.map(cpu_bound_task, tasks))&lt;br&gt;
    return results&lt;/p&gt;

&lt;h1&gt;
  
  
  No speedup due to Global Interpreter Lock (GIL)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ✅ Good - multiprocessing for CPU-bound
&lt;/h1&gt;

&lt;p&gt;def process_cpu_multiprocessing(tasks):&lt;br&gt;
    with ProcessPoolExecutor(max_workers=4) as executor:&lt;br&gt;
        results = list(executor.map(cpu_bound_task, tasks))&lt;br&gt;
    return results&lt;/p&gt;

&lt;h1&gt;
  
  
  Time: ~1/4 on quad-core processor
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Use cases:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Threading: I/O-bound (network requests, file I/O, database queries)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Multiprocessing: CPU-bound (calculations, data processing, image processing)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  AsyncIO: Many concurrent I/O operations (thousands of connections)
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  AsyncIO for High Concurrency
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;br&gt;
import asyncio&lt;br&gt;
import aiohttp  # pip install aiohttp&lt;/p&gt;

&lt;h1&gt;
  
  
  ❌ Bad - sequential HTTP requests
&lt;/h1&gt;

&lt;p&gt;import requests&lt;/p&gt;

&lt;p&gt;def fetch_urls_sequential(urls):&lt;br&gt;
    results = []&lt;br&gt;
    for url in urls:&lt;br&gt;
        response = requests.get(url)&lt;br&gt;
        results.append(response.text)&lt;br&gt;
    return results&lt;/p&gt;

&lt;h1&gt;
  
  
  10 URLs, 0.5s each = 5 seconds
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ✅ Good - async HTTP requests
&lt;/h1&gt;

&lt;p&gt;async def fetch_url(session, url):&lt;br&gt;
    async with session.get(url) as response:&lt;br&gt;
        return await response.text()&lt;/p&gt;

&lt;p&gt;async def fetch_urls_async(urls):&lt;br&gt;
    async with aiohttp.ClientSession() as session:&lt;br&gt;
        tasks = [fetch_url(session, url) for url in urls]&lt;br&gt;
        results = await asyncio.gather(*tasks)&lt;br&gt;
        return results&lt;/p&gt;

&lt;h1&gt;
  
  
  Run async function
&lt;/h1&gt;

&lt;h1&gt;
  
  
  results = asyncio.run(fetch_urls_async(urls))
&lt;/h1&gt;

&lt;h1&gt;
  
  
  10 URLs concurrently = ~0.5 seconds (10x faster!)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  When to use async:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Many concurrent I/O operations
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Web scraping (many URLs)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - API calls to multiple services
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Database queries (with async driver)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - WebSocket connections
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;




&lt;h2&gt;
  
  
  20. Pro Tips and Best Practices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use Virtual Environments
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;bash&lt;/p&gt;

&lt;h1&gt;
  
  
  Always use virtual environments
&lt;/h1&gt;

&lt;p&gt;python -m venv venv&lt;br&gt;
source venv/bin/activate  # Linux/Mac&lt;/p&gt;

&lt;h1&gt;
  
  
  venv\Scripts\activate  # Windows
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Why:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Isolates dependencies
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Prevents version conflicts
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Reproducible environments
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  Utilize Python's Standard Library
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;/p&gt;

&lt;h1&gt;
  
  
  Standard library is optimized and battle-tested
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Don't reinvent the wheel!
&lt;/h1&gt;

&lt;h1&gt;
  
  
  ❌ Bad - manual date parsing
&lt;/h1&gt;

&lt;p&gt;def parse_date_bad(date_string):&lt;br&gt;
    parts = date_string.split('-')&lt;br&gt;
    year = int(parts[0])&lt;br&gt;
    month = int(parts[1])&lt;br&gt;
    day = int(parts[2])&lt;br&gt;
    # ... validation logic ...&lt;br&gt;
    return (year, month, day)&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Good - use datetime
&lt;/h1&gt;

&lt;p&gt;from datetime import datetime&lt;/p&gt;

&lt;p&gt;def parse_date_good(date_string):&lt;br&gt;
    return datetime.strptime(date_string, '%Y-%m-%d')&lt;/p&gt;

&lt;h1&gt;
  
  
  Other powerful standard library modules:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - collections: defaultdict, Counter, deque, namedtuple
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - itertools: chain, groupby, combinations, product
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - functools: lru_cache, partial, reduce
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - operator: itemgetter, attrgetter, methodcaller
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - pathlib: modern path handling
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - dataclasses: reduce boilerplate (Python 3.7+)
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  Type Hints and Static Analysis
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;/p&gt;

&lt;h1&gt;
  
  
  Use type hints for better tooling and catching errors
&lt;/h1&gt;

&lt;p&gt;from typing import List, Dict, Optional, Union&lt;/p&gt;

&lt;p&gt;def process_users(users: List[Dict[str, Union[str, int]]]) -&amp;gt; Optional[Dict[str, int]]:&lt;br&gt;
    """Process users and return statistics.&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Args:&lt;br&gt;
    users: List of user dictionaries

&lt;p&gt;Returns:&lt;br&gt;
    Dictionary of statistics or None if empty&lt;br&gt;
"""&lt;br&gt;
if not users:&lt;br&gt;
    return None&lt;/p&gt;

&lt;p&gt;return {&lt;br&gt;
    'total': len(users),&lt;br&gt;
    'average_age': sum(u['age'] for u in users) // len(users)&lt;br&gt;
}&lt;br&gt;
&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Benefits:&lt;br&gt;
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - IDEs provide better autocomplete
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Catch type errors before runtime
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Self-documenting code
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Use mypy for static type checking: mypy script.py
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  Dataclasses (Python 3.7+)
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;/p&gt;

&lt;h1&gt;
  
  
  ❌ Bad - lots of boilerplate
&lt;/h1&gt;

&lt;p&gt;class PointOld:&lt;br&gt;
    def &lt;strong&gt;init&lt;/strong&gt;(self, x, y):&lt;br&gt;
        self.x = x&lt;br&gt;
        self.y = y&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def &lt;strong&gt;repr&lt;/strong&gt;(self):&lt;br&gt;
    return f"Point(x={self.x}, y={self.y})"

&lt;p&gt;def &lt;strong&gt;eq&lt;/strong&gt;(self, other):&lt;br&gt;
    return self.x == other.x and self.y == other.y&lt;br&gt;
&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  ✅ Good - dataclass handles boilerplate&lt;br&gt;
&lt;/h1&gt;

&lt;p&gt;from dataclasses import dataclass, field&lt;br&gt;
from typing import List&lt;/p&gt;

&lt;p&gt;@dataclass&lt;br&gt;
class Point:&lt;br&gt;
    x: float&lt;br&gt;
    y: float&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def distance(self) -&amp;gt; float:&lt;br&gt;
    return (self.x*&lt;em&gt;2 + self.y&lt;/em&gt;&lt;em&gt;2) *&lt;/em&gt; 0.5&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h1&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Auto-generates: &lt;strong&gt;init&lt;/strong&gt;, &lt;strong&gt;repr&lt;/strong&gt;, &lt;strong&gt;eq&lt;/strong&gt;, and more!&lt;br&gt;
&lt;/h1&gt;

&lt;p&gt;@dataclass&lt;br&gt;
class User:&lt;br&gt;
    name: str&lt;br&gt;
    age: int&lt;br&gt;
    emails: List[str] = field(default_factory=list)  # Mutable default&lt;br&gt;
    active: bool = True  # Simple default&lt;/p&gt;

&lt;h1&gt;
  
  
  Usage
&lt;/h1&gt;

&lt;p&gt;user = User("Alice", 30)&lt;br&gt;
print(user)  # User(name='Alice', age=30, emails=[], active=True)&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Logging, Not Print
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;/p&gt;

&lt;h1&gt;
  
  
  ❌ Bad - debugging with print
&lt;/h1&gt;

&lt;p&gt;def process_data(data):&lt;br&gt;
    print(f"Processing {len(data)} items")  # Can't disable!&lt;br&gt;
    result = expensive_operation(data)&lt;br&gt;
    print(f"Result: {result}")  # Clutters output&lt;br&gt;
    return result&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Good - use logging
&lt;/h1&gt;

&lt;p&gt;import logging&lt;/p&gt;

&lt;p&gt;logging.basicConfig(level=logging.INFO)&lt;br&gt;
logger = logging.getLogger(&lt;strong&gt;name&lt;/strong&gt;)&lt;/p&gt;

&lt;p&gt;def process_data(data):&lt;br&gt;
    logger.debug(f"Processing {len(data)} items")&lt;br&gt;
    result = expensive_operation(data)&lt;br&gt;
    logger.info(f"Processing complete")&lt;br&gt;
    return result&lt;/p&gt;

&lt;h1&gt;
  
  
  Benefits:
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Can adjust verbosity (DEBUG, INFO, WARNING, ERROR)
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Can log to files, not just console
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Can disable in production
&lt;/h1&gt;

&lt;h1&gt;
  
  
  - Includes timestamps and context
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary: The Golden Rules of Python Performance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Measure First, Optimize Later&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;/p&gt;

&lt;h1&gt;
  
  
  Always profile before optimizing
&lt;/h1&gt;

&lt;p&gt;import cProfile&lt;br&gt;
cProfile.run('your_function()')&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Use the Right Data Structure&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;List&lt;/strong&gt;: Ordered, allows duplicates, O(n) membership&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tuple&lt;/strong&gt;: Immutable list, slightly faster, can be dict key&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set&lt;/strong&gt;: Unordered, no duplicates, O(1) membership&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dict&lt;/strong&gt;: Key-value pairs, O(1) lookup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;deque&lt;/strong&gt;: Fast appends/pops from both ends&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;defaultdict&lt;/strong&gt;: Dict with default values&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Counter&lt;/strong&gt;: Count hashable objects&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Leverage Built-ins&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;/p&gt;

&lt;h1&gt;
  
  
  Built-ins are optimized C code
&lt;/h1&gt;

&lt;p&gt;sum(numbers)              # vs manual loop&lt;br&gt;
any(conditions)           # vs manual check&lt;br&gt;
all(conditions)           # vs manual check&lt;br&gt;
max(numbers)              # vs manual comparison&lt;br&gt;
sorted(items)             # vs manual sort&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Avoid Premature Optimization&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;/p&gt;

&lt;h1&gt;
  
  
  ❌ Don't optimize this (runs once)
&lt;/h1&gt;

&lt;p&gt;config = eval(open('config.txt').read())  # Simple is fine&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ Do optimize this (runs millions of times)
&lt;/h1&gt;

&lt;p&gt;def hot_path(data):&lt;br&gt;
    # This needs optimization&lt;br&gt;
    pass&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Write Pythonic Code&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;/p&gt;

&lt;h1&gt;
  
  
  Pythonic code is often faster AND more readable
&lt;/h1&gt;

&lt;h1&gt;
  
  
  Use comprehensions, iterators, context managers, etc.
&lt;/h1&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;h3&gt;
  
  
  6. &lt;strong&gt;When All Else Fails&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;Cython&lt;/strong&gt; to compile Python to C&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;NumPy&lt;/strong&gt; for numerical operations&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;PyPy&lt;/strong&gt; JIT compiler&lt;/li&gt;
&lt;li&gt;Rewrite bottlenecks in C/Rust&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;numba&lt;/strong&gt; JIT compilation for numerical code&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Final Wisdom
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Premature optimization is the root of all evil." - Donald Knuth&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The best code is:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Correct&lt;/strong&gt; first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear&lt;/strong&gt; and maintainable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast enough&lt;/strong&gt; for your needs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Only optimize what profiling shows is actually slow!# Python Performance Optimization: Detailed Guide&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary: The Golden Rules
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Profile First:&lt;/strong&gt; Don't optimize without measuring&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Built-ins:&lt;/strong&gt; They're implemented in C and heavily optimized&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid String Concatenation:&lt;/strong&gt; Use &lt;code&gt;join()&lt;/code&gt; instead&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cache Lookups:&lt;/strong&gt; Store frequently accessed attributes in local variables&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Local Variables:&lt;/strong&gt; Much faster than globals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;List Comprehensions:&lt;/strong&gt; Usually faster and more readable than loops&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EAFP over LYBYL:&lt;/strong&gt; &lt;code&gt;try-except&lt;/code&gt; is often faster than &lt;code&gt;if&lt;/code&gt; checks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Import Wisely:&lt;/strong&gt; Keep imports out of loops&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch Operations:&lt;/strong&gt; Process data in aggregate, not item-by-item&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the Docs:&lt;/strong&gt; Standard library has optimized solutions for common problems&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  When to Optimize
&lt;/h3&gt;

&lt;p&gt;`&lt;code&gt;&lt;/code&gt;python&lt;/p&gt;

&lt;h1&gt;
  
  
  ❌ Don't optimize this (runs once)
&lt;/h1&gt;

&lt;p&gt;def load_config():&lt;br&gt;
    config = {}&lt;br&gt;
    for line in open('config.txt'):&lt;br&gt;
        # Not worth optimizing&lt;br&gt;
        key, value = line.split('=')&lt;br&gt;
        config[key] = value&lt;br&gt;
    return config&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ DO optimize this (runs millions of times)
&lt;/h1&gt;

&lt;p&gt;def process_requests(requests):&lt;br&gt;
    results = []&lt;br&gt;
    append = results.append  # Worth optimizing&lt;br&gt;
    for request in requests:&lt;br&gt;
        append(expensive_operation(request))&lt;br&gt;
    return results&lt;br&gt;
&lt;code&gt;&lt;/code&gt;`&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remember:&lt;/strong&gt; Readable code that runs fast enough is better than optimized code that's hard to maintain!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>productivity</category>
      <category>python</category>
    </item>
    <item>
      <title>Langchain and LangGraph</title>
      <dc:creator>Ashutosh Sarangi</dc:creator>
      <pubDate>Mon, 29 Sep 2025 07:02:50 +0000</pubDate>
      <link>https://forem.com/ashutoshsarangi/langchain-and-langgraph-1678</link>
      <guid>https://forem.com/ashutoshsarangi/langchain-and-langgraph-1678</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6xiawceubgvr23ai29ab.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6xiawceubgvr23ai29ab.png" alt=" " width="581" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  LangChain: The Comprehensive LLM Application Framework
&lt;/h2&gt;

&lt;p&gt;LangChain is a framework that simplifies the creation of applications using LLMs. It provides a modular and composable way to build complex LLM workflows by offering various components that can be chained together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Concepts and Components of LangChain:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Models:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LLMs:&lt;/strong&gt; Integrations with various language models (e.g., OpenAI, Hugging Face, Anthropic). These are the core engines that understand and generate human-like text.&lt;br&gt;
  &lt;strong&gt;Chat Models:&lt;/strong&gt; Optimized for conversational interactions, often working with a list of messages (e.g., system, human, AI messages).&lt;br&gt;
  &lt;strong&gt;Embeddings:&lt;/strong&gt; Converts text into numerical vectors, crucial for tasks like semantic search, retrieval, and similarity comparisons.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Prompts:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt Templates:&lt;/strong&gt; Standardized ways to construct prompts for LLMs. They allow you to dynamically insert variables into a predefined structure.&lt;br&gt;
      Example:&lt;br&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langchain_core.prompts&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PromptTemplate&lt;/span&gt;

&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;PromptTemplate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What is a good name for a company that makes {product}?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input_variables&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;colorful socks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# Output: What is a good name for a company that makes colorful socks?
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  **Output Parsers:** Structure the output from LLMs into a desired format (e.g., JSON, Pydantic objects, lists). This helps make LLM outputs more usable programmatically.

     Example (Pydantic Output Parser):
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="c1"&gt;# W.I.P
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Chains:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  * Chains are sequences of calls to LLMs or other utilities. They allow you to combine multiple components into a single, cohesive workflow.
 **Simple Chains:** A direct call to an LLM with a prompt.

 **Sequential Chains:** Execute a series of chains in order, passing the output of one as the input to the next.
 **Retrieval Chains:** Combine LLMs with retrieval models to fetch relevant documents and use them to inform the LLM's response (e.g., RAG - Retrieval Augmented Generation).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Retrieval:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  * **Document Loaders:** Load data from various sources (PDFs, websites, databases).
  * **Text Splitters:** Break down large documents into smaller, manageable chunks suitable for processing and embedding.
  * **Vector Stores:** Databases designed to store and efficiently query embeddings, enabling semantic search. Examples include FAISS, Chroma, Pinecone.
  * **Retrievers:** Interface to query a vector store and return relevant documents.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Agents:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  * Agents are a core concept in LangChain. They use an LLM as a "reasoning engine" to decide which **tools** to use and in what order, based on the user's input.
  * **Tools:** Functions that an agent can call to interact with the outside world (e.g., search engines, APIs, calculators, databases).
  * **Agent Executors:** The runtime that orchestrates the agent's actions, executing tools and feeding the results back to the LLM for further reasoning.
  * **Tool Calling:** A modern feature where LLMs can directly output structured calls to tools, often leveraging models fine-tuned for this purpose.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h2&gt;
  
  
  LangGraph: Building Statefule, Multi-Actor LLM Applications with Graphs
&lt;/h2&gt;

&lt;p&gt;LangGraph extends LangChain by allowing you to build stateful, multi-actor applications as a directed acyclic graph (DAG) or even cyclic graphs (for agents with memory and self-correction). It's particularly useful for complex agentic workflows where you need to manage state, define execution paths, and enable features like human-in-the-loop or parallel execution.&lt;/p&gt;

&lt;p&gt;Think of it this way: LangChain provides the building blocks; LangGraph provides the blueprint and orchestration engine to connect those blocks in sophisticated ways.&lt;/p&gt;

&lt;p&gt;In LangGraph, an application is represented as a graph where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Nodes:&lt;/strong&gt; Represent a step or a component in your application (e.g., an LLM call, a tool invocation, a custom function).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edges:&lt;/strong&gt; Define the transitions between nodes, determining the flow of execution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State:&lt;/strong&gt; A shared object that is passed between nodes, allowing each node to read and update it. This is crucial for maintaining context and memory across multiple steps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Key Components and Features of LangGraph:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;State and &lt;code&gt;StateSchema&lt;/code&gt;:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  * The **State** is the central concept in LangGraph. It's a mutable object that holds all the relevant information and context for the current execution of the graph. Each node receives the current state, performs its operation, and returns updates to the state.
  * `StateSchema`: This is a Pydantic model (or a dictionary) that defines the structure and types of the variables in your graph's state. It ensures type safety and helps manage complex state objects.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Nodes:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  * **Nodes** are the processing units of your graph. They can be any Python callable (function or method).
  * Each node takes the current graph state as input and returns a dictionary of updates to that state.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Edges:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  * **Edges** define the flow of control between nodes.
  * **Start/End Edges:** Specify where the graph execution begins and ends.
  * **Conditional Edges:** Allow for branching logic. Instead of directly specifying the next node, a conditional edge uses a function (a "router" or "decider") that takes the state and returns the name of the next node to execute. This is fundamental for agentic behavior where the LLM decides the next action.

  **Fixed Edges:** A direct, unconditional transition from one node to another.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;&lt;code&gt;HumanInLoop&lt;/code&gt;:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  * This feature allows for explicit human intervention at specific points in the graph. You can pause the execution, allow a human to review or modify the state, and then resume. This is crucial for validation, error correction, or supervised learning processes.
  * Implemented by designing a node that, when executed, might send a notification to a human and wait for an external signal to update the state or direct the flow. A common pattern is to have a conditional edge check a state variable like `awaiting_human_input`.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;&lt;code&gt;InMemory&lt;/code&gt; (State Persistence):&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  * LangGraph's state is mutable and typically lives for the duration of a single `invoke` call. However, for continuous interactions or long-running agents, you often need to persist the state.
  * `InMemoryCheckpointSaver`: This is a simple way to store the graph's state in memory between executions. Useful for development and single-session interactions. For production, you'd integrate with databases (e.g., Redis, SQLite).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;&lt;code&gt;Streaming&lt;/code&gt;:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  * LangGraph supports streaming output from LLMs, allowing your application to display tokens as they are generated rather than waiting for the entire response. This improves user experience.
  * This is often managed by the underlying LLM integrations (e.g., `model.stream(messages)`) and how nodes are defined to yield intermediate results.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;When invoking the graph, you would iterate over the &lt;code&gt;stream()&lt;/code&gt; method: &lt;code&gt;for s in graph_executor.stream(input): print(s)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;&lt;code&gt;Breakpoint&lt;/code&gt;:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  * Breakpoints allow you to pause the execution of the graph at specific nodes, inspect the current state, and potentially modify it before continuing. This is invaluable for debugging complex graph flows and understanding how the state evolves.
  * Enabled during graph compilation with `interrupt_before` or `interrupt_after` parameters.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;&lt;code&gt;Parallelization&lt;/code&gt;:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  * LangGraph can execute multiple nodes concurrently if they don't have dependencies on each other and operate on different parts of the state or perform independent computations. This can significantly speed up complex workflows.
  * This is achieved by defining parallel paths in your graph and using appropriate merging strategies for the state. You add multiple conditional routes from a node or define multiple `add_edge` or `add_conditional_edges` that might lead to nodes that run in parallel.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjetztfwdirqalsma7acr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjetztfwdirqalsma7acr.png" alt=" " width="573" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;&lt;code&gt;Subgraph&lt;/code&gt;:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  * You can compose graphs within graphs. A subgraph is essentially a self-contained LangGraph instance that can be treated as a single node within a larger graph. This promotes modularity and reusability, allowing you to build complex systems from smaller, manageable components.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;MapReduce&lt;/code&gt;:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  * A common pattern in LLM applications, especially for summarization or data processing.
  * **Map:** A node processes multiple inputs (e.g., summarizes individual document chunks).
  * **Reduce:** Another node combines the outputs from the map phase (e.g., summarizes the individual summaries into a final summary).
  * LangGraph facilitates this by allowing you to define a node that iterates over a list in the state and then another node to aggregate the results.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ReAct&lt;/code&gt; (Reasoning and Acting):&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  * A prominent agentic pattern where an LLM repeatedly performs a cycle of:
      * **Reason:** The LLM generates a thought/plan.
      * **Act:** The LLM decides which tool to use and its arguments, and the tool is invoked.
      * The observation from the tool is then fed back into the LLM for the next reasoning step.
  * LangGraph is an ideal framework for implementing ReAct agents due to its ability to model cycles and manage state across turns. A typical ReAct graph would have nodes for LLM reasoning, tool invocation, and conditional edges to loop back to reasoning until a final answer is determined. LangGraph's prebuilt `AgentExecutor` for `tool_calling` agents often uses a ReAct-like pattern under the hood.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Tool Calling&lt;/code&gt;:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  * Modern LLMs (like OpenAI's Function Calling or Anthropic's Tool Use) can directly output structured calls to tools in a machine-readable format.

&lt;ul&gt;
&lt;li&gt;In LangGraph, a node might receive the LLM's output, parse it to identify tool calls, invoke the specified tools, and then update the state with the tool's results, which can then be fed back to the LLM for further processing. This streamlines agent-tool interactions. LangGraph provides &lt;code&gt;ToolExecutor&lt;/code&gt; and &lt;code&gt;ToolNode&lt;/code&gt; classes to simplify this.
&lt;/li&gt;
&lt;/ul&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;


How LangGraph Connects to LangChain
&lt;/h2&gt;


&lt;p&gt;LangGraph is built &lt;em&gt;on top of&lt;/em&gt; LangChain. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You use LangChain's components (LLMs, chat models, prompt templates, tools, retrievers) &lt;em&gt;within&lt;/em&gt; your LangGraph nodes.&lt;/li&gt;
&lt;li&gt;LangGraph provides the orchestration layer, connecting these LangChain components into a structured, stateful, and often cyclical workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This combination allows developers to leverage the extensive toolkit of LangChain while gaining the fine-grained control and state management capabilities of LangGraph for building complex, robust, and interactive LLM applications.&lt;/p&gt;

</description>
      <category>genai</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>Prompt Engineering, Techniques</title>
      <dc:creator>Ashutosh Sarangi</dc:creator>
      <pubDate>Thu, 25 Sep 2025 06:29:56 +0000</pubDate>
      <link>https://forem.com/ashutoshsarangi/prompt-engineering-techniques-1f73</link>
      <guid>https://forem.com/ashutoshsarangi/prompt-engineering-techniques-1f73</guid>
      <description>&lt;h2&gt;
  
  
  🔧 Prompting Techniques with Templates
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Zero-shot Prompting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use when&lt;/strong&gt;: The task is simple and doesn’t need examples.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧪 Template&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Summarize the following email in one sentence: 
[Insert email text here]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🧠 Tip&lt;/strong&gt;: Works best with clear, unambiguous instructions.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;Few-shot Prompting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use when&lt;/strong&gt;: You want to guide the model with examples.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧪 Template&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Convert the following sentences into passive voice:

Example 1:
Input: The cat chased the mouse.
Output: The mouse was chased by the cat.

Example 2:
Input: She writes a letter.
Output: A letter is written by her.

Now convert:
Input: They built a house.
Output:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🧠 Tip&lt;/strong&gt;: Keep examples close in structure to your actual input.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Chain-of-Thought (CoT) Prompting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use when&lt;/strong&gt;: The task involves reasoning or multiple steps.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧪 Template&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Question: A bookstore sells books for $12 each. If you buy 3 books and pay with a $50 bill, how much change do you get? 
Think step by step.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🧠 Tip&lt;/strong&gt;: Add “Let’s think step by step” to encourage reasoning.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. &lt;strong&gt;ReAct Prompting (Reasoning + Acting)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use when&lt;/strong&gt;: You want the model to reason and then take an action (e.g., search, call a tool).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧪 Template&lt;/strong&gt; (for agent-based systems):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Question: What is the capital of the country where the Eiffel Tower is located?

Thought: The Eiffel Tower is in Paris, which is in France. So the capital of France is Paris.

Action: Return "Paris"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🧠 Tip&lt;/strong&gt;: Combine with LangGraph or LangChain agents for tool use.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. &lt;strong&gt;Role Prompting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use when&lt;/strong&gt;: You want the model to adopt a specific persona or tone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧪 Template&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a senior backend engineer mentoring a junior developer. Explain the concept of RESTful APIs in simple terms with examples.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🧠 Tip&lt;/strong&gt;: Great for tone control, teaching, or simulations.&lt;/p&gt;




&lt;h3&gt;
  
  
  6. &lt;strong&gt;Self-Consistency Prompting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use when&lt;/strong&gt;: You want more reliable answers from multiple generations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧪 Template&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Question: If a car travels 60 km in 1.5 hours, what is its average speed? Think step by step.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🧠 Tip&lt;/strong&gt;: Run multiple generations and pick the most consistent answer.&lt;/p&gt;




&lt;h3&gt;
  
  
  7. &lt;strong&gt;Instruction + Format-Constrained Prompting&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Use when&lt;/strong&gt;: You need structured output (e.g., JSON, YAML, Markdown).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧪 Template&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Extract the following email into structured JSON with keys: sender, subject, summary.

Email:
---
From: John Doe &amp;lt;john@example.com&amp;gt;
Subject: Meeting Reminder
Body: Just a reminder that we have a meeting tomorrow at 10 AM.
---

Output:
{
  "sender": "John Doe",
  "subject": "Meeting Reminder",
  "summary": "Reminder about a meeting scheduled for tomorrow at 10 AM."
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🧠 Tip&lt;/strong&gt;: Use this when integrating with APIs or downstream systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 How to Avoid Hallucinations (with Prompting Tips)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;Prompting Tip&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;✅ Be explicit&lt;/td&gt;
&lt;td&gt;“Only use facts from the following context:”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ Use RAG&lt;/td&gt;
&lt;td&gt;“Based on the retrieved documents, answer the question.”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ Ask for sources&lt;/td&gt;
&lt;td&gt;“Cite your sources for each fact.”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ Add verification&lt;/td&gt;
&lt;td&gt;“Now review the above and point out any factual errors.”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ Lower temperature&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;temperature=0.2&lt;/code&gt; for factual tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ Avoid overloading&lt;/td&gt;
&lt;td&gt;Keep prompts focused and relevant&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




</description>
      <category>genai</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>Gen AI metadata</title>
      <dc:creator>Ashutosh Sarangi</dc:creator>
      <pubDate>Thu, 25 Sep 2025 04:24:33 +0000</pubDate>
      <link>https://forem.com/ashutoshsarangi/gen-ai-metadata-1c8c</link>
      <guid>https://forem.com/ashutoshsarangi/gen-ai-metadata-1c8c</guid>
      <description>&lt;h2&gt;
  
  
  Basic
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Introduction to Gen AI

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ashutoshsarangi/introduction-to-gen-ai-1jdi"&gt;https://dev.to/ashutoshsarangi/introduction-to-gen-ai-1jdi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Gen AI, RAGS, CAG, Fine tuning, VectorDB, LangChain, LangSmith, LangGraph, Lang Flow, MCP, AI Agents, Agentic RAG

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ashutoshsarangi/gen-ai-rags-cag-fine-tuning-vectordb-langchain-langsmith-langgraph-lang-flow-mcp-ai-51g5"&gt;https://dev.to/ashutoshsarangi/gen-ai-rags-cag-fine-tuning-vectordb-langchain-langsmith-langgraph-lang-flow-mcp-ai-51g5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Prompt Engineering, Techniques

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ashutoshsarangi/prompt-engineering-techniques-1f73"&gt;https://dev.to/ashutoshsarangi/prompt-engineering-techniques-1f73&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Intermediate
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Langchain and LangGraph

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ashutoshsarangi/langchain-and-langgraph-1678"&gt;https://dev.to/ashutoshsarangi/langchain-and-langgraph-1678&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Advanced
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;From Localhost to Kubernetes: Containerizing an AI Log Analysis Agent

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ashutoshsarangi/seamless-ai-agent-deployment-a-step-by-step-guide-with-real-world-challenges-516m"&gt;https://dev.to/ashutoshsarangi/seamless-ai-agent-deployment-a-step-by-step-guide-with-real-world-challenges-516m&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>Advanced Python Concepts</title>
      <dc:creator>Ashutosh Sarangi</dc:creator>
      <pubDate>Wed, 24 Sep 2025 05:49:00 +0000</pubDate>
      <link>https://forem.com/ashutoshsarangi/advanced-python-concepts-3ci8</link>
      <guid>https://forem.com/ashutoshsarangi/advanced-python-concepts-3ci8</guid>
      <description>&lt;p&gt;&lt;strong&gt;Multithreading and Multiprocessing in Python&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Python, &lt;strong&gt;multithreading&lt;/strong&gt; and &lt;strong&gt;multiprocessing&lt;/strong&gt; are two ways to achieve concurrency, which is the ability to handle multiple tasks at the same time. While both can run multiple tasks, they do so in fundamentally different ways. The key difference lies in how they handle processes and threads.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multithreading:&lt;/strong&gt; In Python, multithreading involves a single process with multiple threads. Threads within the same process share the same memory space. This makes communication between threads very fast and efficient. However, Python's Global Interpreter Lock (GIL)  restricts the execution of only one thread at a time on a single CPU core. This means multithreading is great for &lt;strong&gt;I/O-bound tasks&lt;/strong&gt; ( network requests or file reads) but not for &lt;strong&gt;CPU-bound tasks&lt;/strong&gt; (tasks that require heavy computation).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multiprocessing:&lt;/strong&gt; Multiprocessing, on the other hand, involves multiple independent processes, each with its own memory space and its own Python interpreter. Because they are separate processes, they can run on different CPU cores simultaneously, bypassing the GIL. This makes multiprocessing ideal for &lt;strong&gt;CPU-bound tasks&lt;/strong&gt; that can be split into independent sub-tasks, as it can leverage multiple CPU cores to speed up execution.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Example: Multithreading vs. Multiprocessing
&lt;/h3&gt;

&lt;p&gt;Let's use a simple example to illustrate the difference.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multithreading Example (I/O-bound):&lt;/strong&gt; A program that downloads multiple files from the internet. While one thread is waiting for a file to download, another can start downloading another file. This doesn't involve heavy computation, so multithreading is a good fit. The program's overall execution time is reduced because it's not waiting for one download to finish before starting the next.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multiprocessing Example (CPU-bound):&lt;/strong&gt; A program that performs complex mathematical calculations on a large dataset. By using multiprocessing, you can split the dataset and have a separate process perform calculations on each part. This allows the program to utilize multiple CPU cores, dramatically speeding up the total calculation time.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Synchronous vs. Asynchronous Programming
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Synchronous programming&lt;/strong&gt; is the default, sequential way of executing code. Each task must wait for the previous one to complete before it can begin. It's like a single-lane road where cars must follow one after another. If a task is slow, the entire program is blocked, and other tasks cannot proceed. This is simple and predictable but can be inefficient for tasks that involve waiting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Asynchronous programming&lt;/strong&gt; is a non-blocking approach that allows a program to initiate a task and then move on to other tasks without waiting for the first one to complete. It's like a chef taking an order, starting the dish, and then starting the next dish while the first one is cooking. When the first dish is ready, the chef can return to it. In Python, this is often implemented using the &lt;code&gt;asyncio&lt;/code&gt; library, which uses an &lt;strong&gt;event loop&lt;/strong&gt; to manage and schedule tasks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example: Sync vs. Async
&lt;/h3&gt;

&lt;p&gt;Let's consider a web scraper that needs to fetch data from multiple websites.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Synchronous Example:&lt;/strong&gt; The program fetches data from website A. It waits for the download to complete. Then it fetches data from website B. It waits for that download to complete, and so on. This process is sequential and can be very slow if one of the websites is slow to respond.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Asynchronous Example:&lt;/strong&gt; The program initiates a request to website A, and while it's waiting for the response, it immediately sends a request to website B. It continues this process for all the websites. When a response from any of the websites arrives, the program can handle it. This approach is much more efficient because it uses the "waiting time" to do other work, allowing the program to fetch data from multiple sources concurrently without blocking.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Event loop in Python
&lt;/h2&gt;

&lt;p&gt;In Python's &lt;code&gt;asyncio&lt;/code&gt;, the event loop manages a single queue of tasks (coroutines) and callbacks.  When a coroutine "awaits" an I/O operation (e.g., a network request), it yields control back to the event loop. The event loop then checks for completed I/O events and moves on to the next available task in its queue. The concept of "microtasks" is implicitly handled. When a task completes and schedules a callback (like the &lt;code&gt;then&lt;/code&gt; part of an &lt;code&gt;await&lt;/code&gt; operation), that callback is added directly to the event loop's queue and will be processed very soon. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There isn't a separate, higher-priority "micro" queue that gets fully drained before the main queue is checked again; instead, the &lt;code&gt;asyncio&lt;/code&gt; loop is designed to be highly responsive to events and resume tasks as soon as they become ready.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Where Python's Event Loop is Located
&lt;/h3&gt;

&lt;p&gt;Unlike JavaScript's event loop, which is an integral part of the browser or Node.js runtime, Python's event loop is part of the &lt;strong&gt;&lt;code&gt;asyncio&lt;/code&gt; library&lt;/strong&gt; itself. It's a key component of the &lt;code&gt;asyncio&lt;/code&gt; module and is run as a single-threaded process within your Python application. When you use &lt;code&gt;asyncio.run()&lt;/code&gt;, a new event loop is created, it runs all the tasks you've scheduled, and then it shuts down when they are complete.&lt;/p&gt;

&lt;p&gt;The event loop is essentially a &lt;code&gt;while True&lt;/code&gt; loop that continuously monitors and dispatches events. It's a central hub that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Checks if any coroutines are ready to resume execution.&lt;/li&gt;
&lt;li&gt; Handles completed I/O operations (e.g., from network sockets).&lt;/li&gt;
&lt;li&gt; Manages scheduled callbacks and timers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By default, there's only one event loop per thread, and it's generally recommended to run all your &lt;code&gt;asyncio&lt;/code&gt; code within that one event loop in the main thread. To handle CPU-bound tasks without blocking the event loop, you would typically offload them to a separate thread or process using methods like &lt;code&gt;loop.run_in_executor()&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  simple code examples to illustrate these concepts.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Multithreading vs. Multiprocessing
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Multithreading&lt;/strong&gt; is best for &lt;strong&gt;I/O-bound tasks&lt;/strong&gt; (like downloading files or network requests) where the program spends most of its time waiting. The Global Interpreter Lock (GIL) limits multithreading to a single CPU core.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;threading&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Thread &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: Starting...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Simulate an I/O-bound task (e.g., waiting for a network response)
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Thread &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: Finishing.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;threads&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;threading&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,))&lt;/span&gt;
    &lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# Wait for all threads to complete
&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;All threads have finished.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, three threads run concurrently. While one thread is sleeping (waiting), another can start, which is faster than running them sequentially.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Multiprocessing&lt;/strong&gt; is ideal for &lt;strong&gt;CPU-bound tasks&lt;/strong&gt; (like heavy mathematical calculations) because it bypasses the GIL by using separate processes, each with its own interpreter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;multiprocessing&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Process &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: Starting...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Simulate a CPU-bound task (e.g., complex calculation)
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Process &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: Finishing.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;processes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;multiprocessing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,))&lt;/span&gt;
        &lt;span class="n"&gt;processes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;processes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;# Wait for all processes to complete
&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;All processes have finished.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, three independent processes are created. They can run on different CPU cores simultaneously, offering a true speed-up for CPU-intensive work.&lt;/p&gt;




&lt;h3&gt;
  
  
  Synchronous vs. Asynchronous Programming
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Synchronous programming&lt;/strong&gt; is sequential and blocking. Each task must wait for the previous one to complete.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Fetching data from &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Simulate a network request
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Finished fetching data from &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Data from &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;

&lt;span class="n"&gt;start_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;data1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;website A&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;data2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;website B&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;data3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fetch_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;website C&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;All data fetched in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start_time&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; seconds.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The total time for this script to run will be approximately 6 seconds (2 seconds for each function call) because each call blocks the program until it finishes.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Asynchronous programming&lt;/strong&gt; is non-blocking and event-driven. It allows the program to switch to other tasks while waiting for a long-running operation to complete. This is typically done with Python's &lt;code&gt;asyncio&lt;/code&gt; library.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Fetching data from &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Simulate a network request
&lt;/span&gt;    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Finished fetching data from &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Data from &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;start_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nf"&gt;fetch_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;website A&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nf"&gt;fetch_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;website B&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nf"&gt;fetch_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;website C&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Run tasks concurrently
&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;All data fetched in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start_time&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; seconds.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this &lt;code&gt;asyncio&lt;/code&gt; example, the &lt;code&gt;await asyncio.sleep(2)&lt;/code&gt; tells the program to pause this specific task but not block the entire program. Instead, the event loop can switch to another task. The total execution time will be around 2 seconds, as all three tasks are initiated and run concurrently. This is highly efficient for I/O-bound operations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The primary benefit of &lt;code&gt;asyncio&lt;/code&gt; is in managing &lt;strong&gt;concurrency&lt;/strong&gt;, specifically for &lt;strong&gt;I/O-bound tasks&lt;/strong&gt;. If you were making a hundred API calls, using &lt;code&gt;asyncio&lt;/code&gt; would allow you to initiate all the requests concurrently, saving a significant amount of time by not waiting for each one to finish before starting the next. For a single call, there's no concurrency to manage, so the overhead of setting up an &lt;code&gt;async&lt;/code&gt; function and an event loop provides no performance benefit.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s a comparison:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Synchronous Approach (Recommended for a Single Call)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This approach is straightforward and easy to read. The code executes one line at a time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_data_sync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_data_sync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.example.com/data/1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Asynchronous Approach (Unnecessary for a Single Call)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;While you &lt;em&gt;can&lt;/em&gt; write a function with &lt;code&gt;async&lt;/code&gt; and &lt;code&gt;await&lt;/code&gt;, it's overkill for a single call. You need to use an &lt;code&gt;async&lt;/code&gt; library like &lt;code&gt;aiohttp&lt;/code&gt; and run the function within an event loop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;aiohttp&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_data_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;aiohttp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ClientSession&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;get_data_async&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.example.com/data/1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don't put &lt;code&gt;async&lt;/code&gt; and &lt;code&gt;await&lt;/code&gt; in the &lt;code&gt;get_data_sync&lt;/code&gt; function because it's a &lt;strong&gt;synchronous function&lt;/strong&gt;, not an asynchronous one. It's using the &lt;code&gt;requests&lt;/code&gt; library, which is a synchronous library.&lt;/p&gt;

&lt;p&gt;Here's why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;requests&lt;/code&gt; library is synchronous&lt;/strong&gt;: The &lt;code&gt;requests.get()&lt;/code&gt; function is designed to be blocking. When you call it, your program stops and waits for the entire HTTP request to complete (sending the request, waiting for the server's response, and receiving the data) before it proceeds to the next line of code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;async&lt;/code&gt; and &lt;code&gt;await&lt;/code&gt; require an &lt;code&gt;asyncio&lt;/code&gt; ecosystem&lt;/strong&gt;: The keywords &lt;code&gt;async&lt;/code&gt; and &lt;code&gt;await&lt;/code&gt; are part of Python's &lt;code&gt;asyncio&lt;/code&gt; framework. They are used to define and manage coroutines, which are functions designed for non-blocking, asynchronous I/O operations. For these keywords to work, the function must be run within an &lt;strong&gt;event loop&lt;/strong&gt; and use an &lt;strong&gt;asynchronous library&lt;/strong&gt; like &lt;code&gt;aiohttp&lt;/code&gt; that is compatible with &lt;code&gt;asyncio&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since your function uses &lt;code&gt;requests&lt;/code&gt;, which is a synchronous library and doesn't communicate with an event loop, adding &lt;code&gt;async&lt;/code&gt; and &lt;code&gt;await&lt;/code&gt; would be incorrect and would lead to syntax errors or unexpected behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Similarity between multithreading and &lt;code&gt;asyncio&lt;/code&gt; in Python
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Shared Goal: Concurrency in I/O-Bound Tasks
&lt;/h3&gt;

&lt;p&gt;Both multithreading and &lt;code&gt;asyncio&lt;/code&gt; are excellent for &lt;strong&gt;I/O-bound tasks&lt;/strong&gt;.  This is any task that spends most of its time waiting for an external operation to complete, like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Making network requests:&lt;/strong&gt; Waiting for a web server to respond.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reading/writing files:&lt;/strong&gt; Waiting for data to be read from or written to a disk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database queries:&lt;/strong&gt; Waiting for a database to execute a query.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In these scenarios, the CPU is largely idle. Both multithreading and &lt;code&gt;asyncio&lt;/code&gt; prevent your program from freezing while it waits, allowing it to work on other tasks in the meantime.&lt;/p&gt;




&lt;h3&gt;
  
  
  The Fundamental Difference: How They Handle Concurrency
&lt;/h3&gt;

&lt;p&gt;The similarity ends at their core mechanism.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multithreading&lt;/strong&gt; uses &lt;strong&gt;preemptive multitasking&lt;/strong&gt;. The operating system (OS) and the Python interpreter decide when to switch between threads. The threads themselves don't give up control voluntarily. This is what makes it "preemptive"—the OS preempts a running thread to give another one a turn. Because of Python's Global Interpreter Lock (GIL), only one thread can execute Python bytecode at a time, so it's not true parallelism but a form of interleaved concurrency.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;asyncio&lt;/code&gt;&lt;/strong&gt; uses &lt;strong&gt;cooperative multitasking&lt;/strong&gt;.  The tasks themselves (coroutines) voluntarily give up control to the event loop when they encounter an &lt;code&gt;await&lt;/code&gt; keyword. The event loop is a single-threaded loop that checks for completed tasks and schedules the next one. This is what makes it "cooperative"—each task must cooperate by yielding control. Because it's single-threaded, it doesn't face the GIL limitations that multithreading does.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Metaprogramming in Python
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;It is the creation of programs that write or manipulate other programs. In essence, it's about making code that can inspect, generate, or modify itself at runtime. It’s a powerful technique often used to reduce code duplication, create flexible APIs, and build frameworks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Concepts
&lt;/h3&gt;

&lt;p&gt;Metaprogramming in Python is primarily achieved through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Decorators:&lt;/strong&gt; Functions that wrap other functions or classes to extend their behavior without permanent modification. They're a form of syntactic sugar for wrapping a callable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Class Decorators:&lt;/strong&gt; Similar to function decorators, but they modify the behavior of a class.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metaclasses:&lt;/strong&gt; The most advanced form of metaprogramming. A metaclass is the "class of a class." When you define a class, its metaclass is responsible for creating it. By creating a custom metaclass, you can control how classes are defined and how they behave.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Decorators in Python
&lt;/h2&gt;

&lt;p&gt;A decorator in Python is a design pattern that allows you to dynamically extend or modify the behavior of a function or class without changing its source code. It's essentially a callable (like a function) that takes another callable as an argument and returns a new callable.&lt;/p&gt;

&lt;p&gt;Decorators use a special syntax with the &lt;code&gt;@&lt;/code&gt; symbol, which is just syntactic sugar for a more verbose function call.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# This:
&lt;/span&gt;&lt;span class="nd"&gt;@my_decorator&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;my_function&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# ...
&lt;/span&gt;
&lt;span class="c1"&gt;# Is equivalent to this:
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;my_function&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# ...
&lt;/span&gt;
&lt;span class="n"&gt;my_function&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;my_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_function&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The core idea is to "wrap" a function or class to add new functionality before or after the original code runs.&lt;/p&gt;




&lt;h3&gt;
  
  
  Function Decorators
&lt;/h3&gt;

&lt;p&gt;A function decorator is a function that takes another function as an argument, adds some new functionality, and returns the modified function. This is most commonly used for tasks like logging, timing, authentication, or validation.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example: A Simple Timer Decorator
&lt;/h4&gt;

&lt;p&gt;This decorator measures how long a function takes to execute.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;timing_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;A decorator that prints the execution time of a function.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;start_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;end_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; ran in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;end_time&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start_time&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; seconds.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;

&lt;span class="nd"&gt;@timing_decorator&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;complex_calculation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Simulates a complex calculation.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;sum_val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;sum_val&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sum_val&lt;/span&gt;

&lt;span class="c1"&gt;# Calling the decorated function
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;complex_calculation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10000000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Calculation result: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, &lt;code&gt;timing_decorator&lt;/code&gt; is the decorator function. It defines a new function &lt;code&gt;wrapper&lt;/code&gt; that encapsulates the original &lt;code&gt;complex_calculation&lt;/code&gt; function. When you call &lt;code&gt;complex_calculation(10000000)&lt;/code&gt;, you are actually calling the &lt;code&gt;wrapper&lt;/code&gt; function. The wrapper executes its own timing logic, calls the original function, and then prints the elapsed time before returning the result.&lt;/p&gt;




&lt;h3&gt;
  
  
  Class Decorators
&lt;/h3&gt;

&lt;p&gt;A class decorator is a callable that takes a class object as an argument and returns a new class object. Class decorators are used to modify or extend the behavior of an entire class. Common use cases include enforcing a class structure, adding attributes to all instances of a class, or automatically registering a class with a registry.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example: A Class Decorator for Enforcing an Interface
&lt;/h4&gt;

&lt;p&gt;This decorator checks if a class implements certain methods and raises an error if it doesn't.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;enforce_interface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;A class decorator to ensure &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;start&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; and &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stop&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; methods exist.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;start&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;callable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;start&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Class &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; must have a &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;start&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; method.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stop&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;callable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;getattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stop&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Class &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; must have a &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stop&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; method.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;cls&lt;/span&gt;

&lt;span class="nd"&gt;@enforce_interface&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Starting the &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Stopping the &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# This class will raise a TypeError when it's defined because it lacks a 'stop' method
&lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nd"&gt;@enforce_interface&lt;/span&gt;
    &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Motorcycle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;

        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Starting the &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;TypeError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Caught an error: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, &lt;code&gt;@enforce_interface&lt;/code&gt; is the class decorator. When the &lt;code&gt;Car&lt;/code&gt; class is defined, the &lt;code&gt;enforce_interface&lt;/code&gt; function is called with &lt;code&gt;Car&lt;/code&gt; as an argument. The decorator checks for the required methods and returns the class. When &lt;code&gt;Motorcycle&lt;/code&gt; is defined, the check fails, and the &lt;code&gt;TypeError&lt;/code&gt; is raised immediately, providing &lt;strong&gt;static analysis at runtime&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Python Internals: A Deeper Look
&lt;/h3&gt;

&lt;p&gt;Python is an interpreted, high-level, and dynamically typed language. Its inner workings, often referred to as "Python Internals," involve several key components that manage how your code is executed, including the CPython interpreter, the compilation process, memory management, and how core data types are handled. Understanding these can help you write more efficient and robust code.&lt;/p&gt;




&lt;h3&gt;
  
  
  The CPython Interpreter
&lt;/h3&gt;

&lt;p&gt;When people talk about Python, they are usually referring to &lt;strong&gt;CPython&lt;/strong&gt;, which is the reference implementation of the language written in C. It's the most widely used interpreter and is what you get when you download Python from python.org. Its main job is to take your Python source code and translate it into a language the computer can understand.&lt;/p&gt;

&lt;p&gt;The execution of a Python script by the CPython interpreter follows these general steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Lexing and Parsing:&lt;/strong&gt; The interpreter's front end reads your &lt;code&gt;.py&lt;/code&gt; file. It first tokenizes the source code into a stream of tokens (&lt;strong&gt;lexing&lt;/strong&gt;), such as keywords, identifiers, and operators. These tokens are then structured into an &lt;strong&gt;Abstract Syntax Tree (AST)&lt;/strong&gt; , which represents the code's grammatical structure.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Compilation to Bytecode:&lt;/strong&gt; The AST is then compiled into Python &lt;strong&gt;bytecode&lt;/strong&gt;. Bytecode is a low-level, platform-independent set of instructions. It's not machine code but is a set of instructions for the Python Virtual Machine (PVM). You can see this bytecode using the &lt;code&gt;dis&lt;/code&gt; module in Python.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Execution by the Python Virtual Machine (PVM):&lt;/strong&gt; The PVM is the runtime engine of the CPython interpreter. It's a loop that reads and executes the bytecode instructions one by one. The PVM is also responsible for managing the call stack, memory, and objects.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  The Global Interpreter Lock (GIL)
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Global Interpreter Lock (GIL)&lt;/strong&gt; is one of the most talked-about aspects of CPython. It's a mutex (a lock) that protects access to Python objects, ensuring that only &lt;strong&gt;one thread&lt;/strong&gt; can execute Python bytecode at a time. This simplifies memory management and prevents race conditions but means that multithreading in CPython cannot achieve true parallelism on multi-core processors for CPU-bound tasks. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Impact on I/O-Bound Tasks:&lt;/strong&gt; The GIL is released during I/O operations (e.g., waiting for network data or disk reads). This allows other threads to run while the first is blocked, making multithreading still very effective for I/O-bound tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Impact on CPU-Bound Tasks:&lt;/strong&gt; For tasks that require heavy computation, the GIL prevents multiple threads from running simultaneously, negating the benefits of multi-core CPUs. In these cases, &lt;strong&gt;multiprocessing&lt;/strong&gt; is the preferred approach, as each process has its own GIL.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Memory Management
&lt;/h3&gt;

&lt;p&gt;Python's memory management is handled automatically. It uses a private heap to store objects and data structures. This heap is managed by the Python memory manager.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reference Counting:&lt;/strong&gt; The primary memory management strategy is &lt;strong&gt;reference counting&lt;/strong&gt;. Each object has a counter that tracks the number of references pointing to it. When the reference count drops to zero, the object is deallocated, and its memory is returned to the heap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Garbage Collection:&lt;/strong&gt; Reference counting alone cannot handle &lt;strong&gt;circular references&lt;/strong&gt;, where objects refer to each other but are no longer accessible from the main program. To solve this, Python's garbage collector periodically scans for these cycles and cleans up the orphaned objects.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Python Objects and Core Data Types
&lt;/h3&gt;

&lt;p&gt;Everything in Python is an object, including integers, strings, functions, and even types themselves. Each object has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;PyObject_HEAD&lt;/code&gt;&lt;/strong&gt;: A header that contains the reference count and a pointer to the object's type.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type Pointer&lt;/strong&gt;: A pointer to the object's type. For example, an integer object's type pointer would point to the &lt;code&gt;PyInt_Type&lt;/code&gt; object.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value&lt;/strong&gt;: The actual data stored in the object.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Due to this object-oriented nature, even simple operations can be more complex than in low-level languages. For example, when you reassign a variable, you aren't changing the value in memory but rather changing the reference to point to a new object. &lt;/p&gt;

&lt;h2&gt;
  
  
  When you run a &lt;code&gt;.py&lt;/code&gt; file
&lt;/h2&gt;

&lt;p&gt;When you run a &lt;code&gt;.py&lt;/code&gt; file, Python doesn't directly compile it into machine code like C or C++. Instead, it follows a multi-step process. Here is a step-by-step breakdown of how a Python program is compiled and how memory is allocated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Lexing and Parsing (The Frontend)
&lt;/h3&gt;

&lt;p&gt;The CPython interpreter first reads your &lt;code&gt;.py&lt;/code&gt; source file.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Lexing:&lt;/strong&gt; The source code is broken down into a series of small, meaningful units called &lt;strong&gt;tokens&lt;/strong&gt;. For example, a line of code like &lt;code&gt;x = 10 + y&lt;/code&gt; would be broken into tokens for &lt;code&gt;x&lt;/code&gt;, &lt;code&gt;=&lt;/code&gt;, &lt;code&gt;10&lt;/code&gt;, &lt;code&gt;+&lt;/code&gt;, and &lt;code&gt;y&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Parsing:&lt;/strong&gt; These tokens are then structured into an &lt;strong&gt;Abstract Syntax Tree (AST)&lt;/strong&gt;. The AST is a hierarchical tree representation of your code that reflects its grammatical structure and is easier for the interpreter to work with. &lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: Compilation to Bytecode
&lt;/h3&gt;

&lt;p&gt;The AST is then passed to the compiler, which translates it into Python &lt;strong&gt;bytecode&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bytecode is a low-level, platform-independent set of instructions. It's not machine code, but rather an instruction set for the &lt;strong&gt;Python Virtual Machine (PVM)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;.py&lt;/code&gt; file is not a binary executable; it's the source code. The compiled bytecode is usually saved in a &lt;code&gt;.pyc&lt;/code&gt; file (Python compiled file) or the &lt;code&gt;__pycache__&lt;/code&gt; directory. This is done to speed up future executions of the same file, as the compilation step can be skipped.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 3: Execution by the Python Virtual Machine (PVM)
&lt;/h3&gt;

&lt;p&gt;The PVM is the runtime engine of the Python interpreter. It is a loop that reads and executes the bytecode instructions one by one.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The PVM manages the program's &lt;strong&gt;call stack&lt;/strong&gt;, which keeps track of active function calls.&lt;/li&gt;
&lt;li&gt;It is also responsible for managing the program's memory.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Step 4: Memory Allocation and Object Creation
&lt;/h3&gt;

&lt;p&gt;Python manages memory automatically using a &lt;strong&gt;private heap&lt;/strong&gt;. All Python objects, including integers, strings, lists, and functions, are stored in this heap. When a variable is assigned to an object, two things happen:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Object Creation:&lt;/strong&gt; An object is created in memory (on the heap) to store the data. The object's memory is allocated by the Python memory manager.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Reference Creation:&lt;/strong&gt; A variable name is created in the current scope. This variable is a &lt;strong&gt;reference&lt;/strong&gt; (a pointer) that points to the object in the heap.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
When you run &lt;code&gt;x = 10&lt;/code&gt;, the following happens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The PVM sees the instruction to create an integer object with the value &lt;code&gt;10&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The memory manager finds a space in the heap and allocates memory for a new integer object.&lt;/li&gt;
&lt;li&gt;A reference named &lt;code&gt;x&lt;/code&gt; is created in the current scope, and it's set to point to the newly created object.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you then run &lt;code&gt;y = x&lt;/code&gt;, a new object is &lt;strong&gt;not&lt;/strong&gt; created. Instead, a new reference &lt;code&gt;y&lt;/code&gt; is created, and it also points to the same integer object &lt;code&gt;10&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Memory Deallocation
&lt;/h3&gt;

&lt;p&gt;Python's memory management also handles deallocation automatically, primarily through &lt;strong&gt;reference counting&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every object has a reference count that tracks how many variables are pointing to it.&lt;/li&gt;
&lt;li&gt;When the reference count of an object drops to zero (e.g., when a variable goes out of scope or is reassigned), the memory manager deallocates the object and returns the memory to the heap.&lt;/li&gt;
&lt;li&gt;Python also has a &lt;strong&gt;garbage collector&lt;/strong&gt; to handle &lt;strong&gt;circular references&lt;/strong&gt; (e.g., two objects that point to each other) that reference counting alone can't detect.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fszljvk3wq4enrtfimxxk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fszljvk3wq4enrtfimxxk.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sure, Ashutosh! Let's dive deep into &lt;strong&gt;context managers&lt;/strong&gt; and &lt;strong&gt;generators&lt;/strong&gt; in Python — two powerful features that help write clean, efficient, and readable code.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 1. Context Managers
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🔍 What is a Context Manager?
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;context manager&lt;/strong&gt; is a Python construct that allows you to allocate and release resources precisely when you want. The most common use case is with file operations, where you want to ensure a file is closed after you're done with it.&lt;/p&gt;
&lt;h3&gt;
  
  
  ✅ Benefits:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Automatic resource management&lt;/li&gt;
&lt;li&gt;Cleaner syntax using &lt;code&gt;with&lt;/code&gt; statement&lt;/li&gt;
&lt;li&gt;Exception-safe&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🔧 Built-in Example:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;example.txt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# File is automatically closed after the block
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  🛠 Custom Context Manager using &lt;code&gt;__enter__&lt;/code&gt; and &lt;code&gt;__exit__&lt;/code&gt;:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyContext&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__enter__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Entering context&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Resource&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__exit__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exc_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exc_value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;traceback&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Exiting context&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Usage
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;MyContext&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Using &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  🧹 Cleaner Custom Context Manager using &lt;code&gt;contextlib&lt;/code&gt;:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;contextlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;contextmanager&lt;/span&gt;

&lt;span class="nd"&gt;@contextmanager&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;managed_resource&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Setup&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Resource&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cleanup&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;managed_resource&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Using &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔁 2. Generators
&lt;/h2&gt;
&lt;h3&gt;
  
  
  🔍 What is a Generator?
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;generator&lt;/strong&gt; is a function that returns an iterator and allows you to iterate over data without storing the entire sequence in memory. It uses the &lt;code&gt;yield&lt;/code&gt; keyword.&lt;/p&gt;
&lt;h3&gt;
  
  
  ✅ Benefits:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Memory-efficient&lt;/li&gt;
&lt;li&gt;Lazy evaluation (generates values on the fly)&lt;/li&gt;
&lt;li&gt;Useful for large datasets or streams&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🔧 Simple Generator Example:
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;count_up_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;
        &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;count_up_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  🧠 Generator Expression (like list comprehension):
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;squares&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;squares&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔗 Combining Context Managers and Generators
&lt;/h2&gt;

&lt;p&gt;You can use generators inside context managers or vice versa. For example, reading large files line-by-line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;read_large_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;read_large_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;bigfile.txt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;with&lt;/code&gt; keyword in Python is &lt;strong&gt;specifically tied to context management&lt;/strong&gt;. It is &lt;strong&gt;not a general-purpose OOP feature&lt;/strong&gt; like &lt;code&gt;class&lt;/code&gt;, &lt;code&gt;def&lt;/code&gt;, or &lt;code&gt;self&lt;/code&gt;. You can only use &lt;code&gt;with&lt;/code&gt; on objects that implement the &lt;strong&gt;context management protocol&lt;/strong&gt;, i.e., they define:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;__enter__(self)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;__exit__(self, exc_type, exc_value, traceback)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔍 What Does &lt;code&gt;with&lt;/code&gt; Actually Do?
&lt;/h2&gt;

&lt;p&gt;When you write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;managed_resource&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# do something with res
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Python does the following under the hood:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Calls &lt;code&gt;managed_resource().__enter__()&lt;/code&gt; and assigns its return value to &lt;code&gt;res&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Executes the block under the &lt;code&gt;with&lt;/code&gt; statement.&lt;/li&gt;
&lt;li&gt;When the block finishes (even if an exception occurs), it calls &lt;code&gt;__exit__()&lt;/code&gt; to clean up.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🧪 Can You Use &lt;code&gt;with&lt;/code&gt; on Any Class?
&lt;/h2&gt;

&lt;p&gt;Not directly. You &lt;strong&gt;must implement&lt;/strong&gt; the context manager protocol in your class. Here's an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__enter__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Entering context&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__exit__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exc_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;exc_value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;traceback&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Exiting context&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;do_something&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Doing something&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Now you can use it with `with`
&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;do_something&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your class &lt;strong&gt;doesn't&lt;/strong&gt; implement &lt;code&gt;__enter__&lt;/code&gt; and &lt;code&gt;__exit__&lt;/code&gt;, using &lt;code&gt;with&lt;/code&gt; will raise a &lt;code&gt;TypeError&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧹 Shortcut: &lt;code&gt;contextlib.contextmanager&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;If you don’t want to write a full class, you can use the &lt;code&gt;@contextmanager&lt;/code&gt; decorator from &lt;code&gt;contextlib&lt;/code&gt; to turn a generator function into a context manager:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;contextlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;contextmanager&lt;/span&gt;

&lt;span class="nd"&gt;@contextmanager&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;simple_context&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Setup&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Resource&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cleanup&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;simple_context&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Using &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






</description>
      <category>programming</category>
      <category>python</category>
      <category>advance</category>
    </item>
    <item>
      <title>Writing Unit Tests for Python Code (unittest &amp; doctest)</title>
      <dc:creator>Ashutosh Sarangi</dc:creator>
      <pubDate>Tue, 23 Sep 2025 04:48:11 +0000</pubDate>
      <link>https://forem.com/ashutoshsarangi/writing-unit-tests-for-python-code-unittest-doctest-iob</link>
      <guid>https://forem.com/ashutoshsarangi/writing-unit-tests-for-python-code-unittest-doctest-iob</guid>
      <description>&lt;p&gt;In Python, there are several tools to help you write, organize, run, and automate your unit tests. In the Python standard library, you’ll find two of these tools:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;doctest&lt;/li&gt;
&lt;li&gt;unittest (inspired by Junit)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Python’s doctest module is a lightweight testing framework that provides quick and straightforward test automation. It can read the test cases from your project’s documentation and your code’s docstrings. &lt;/p&gt;

&lt;p&gt;The unittest package is also a testing framework. However, it provides a more complete solution than doctest.&lt;/p&gt;

&lt;h1&gt;
  
  
  unittest
&lt;/h1&gt;

&lt;p&gt;Test case: An individual unit of testing. It examines the output for a given input set.&lt;br&gt;
Test suite: A collection of test cases, test suites, or both. They’re grouped and executed as a whole.&lt;br&gt;
Test fixture: A group of actions required to set up an environment for testing. It also includes the teardown processes after the tests run.&lt;br&gt;
Test runner: A component that handles the execution of tests and communicates the results to the user.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# age.py
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;categorize_by_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Child&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Adolescent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Adult&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="mi"&gt;65&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Golden age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid age: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# test_age.py
&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;unittest&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;categorize_by_age&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestCategorizeByAge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_child&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;categorize_by_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Child&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_adolescent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;categorize_by_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Adolescent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_adult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;categorize_by_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Adult&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_golden_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;categorize_by_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Golden age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_negative_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;categorize_by_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid age: -1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_too_old&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;categorize_by_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;151&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid age: 151&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Running unittest Tests
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Make the test module executable&lt;/li&gt;
&lt;li&gt;Use the command-line interface of unittest&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. Make the test module executable
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# test_age.py
&lt;/span&gt;
&lt;span class="c1"&gt;#...
&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="c1"&gt;# now you can directly run this file
# python test_age.py
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Among other arguments, the main() function takes the verbosity one. With this argument, you can tweak the output’s verbosity, which has three possible values:&lt;/p&gt;

&lt;p&gt;0 for quiet&lt;br&gt;
1 for normal&lt;br&gt;
2 for detailed&lt;br&gt;
Go ahead and update the call to main() as in the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ...
&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;verbosity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# output
&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;test_age&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="nf"&gt;test_adolescent &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCategorizeByAge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test_adolescent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;
&lt;span class="nf"&gt;test_adult &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCategorizeByAge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test_adult&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want to make the detailed output more descriptive, then you can add docstrings to your tests like in the following code snippet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="c1"&gt;# ...
&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestCategorizeByAge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_child&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Test for &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Child&lt;/span&gt;&lt;span class="sh"&gt;'"""&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;categorize_by_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Child&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_adolescent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Test for &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Adolescent&lt;/span&gt;&lt;span class="sh"&gt;'"""&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;categorize_by_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Adolescent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_adult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Test for &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Adult&lt;/span&gt;&lt;span class="sh"&gt;'"""&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;categorize_by_age&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Adult&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# ...
&lt;/span&gt;
&lt;span class="c1"&gt;# output
&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;test_age&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="nf"&gt;test_adolescent &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCategorizeByAge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test_adolescent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Test&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Adolescent&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;
&lt;span class="nf"&gt;test_adult &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCategorizeByAge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test_adult&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Test&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Adult&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;
&lt;span class="nf"&gt;test_boundary_adolescent_adult &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCategorizeByAge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test_boundary_adolescent_adult&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Test&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;boundary&lt;/span&gt; &lt;span class="n"&gt;between&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Adolescent&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Adult&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Skipping Tests
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;unittest&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SkipTestExample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nd"&gt;@unittest.skip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unconditionally skipped test&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_unimportant&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The test should be skipped&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nd"&gt;@unittest.skipIf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_info&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Requires Python &amp;gt;= 3.12&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_using_calendar_constants&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;

        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Month&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OCTOBER&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nd"&gt;@unittest.skipUnless&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;win&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Requires Windows&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_windows_support&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;ctypes&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;WinDLL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;windll&lt;/span&gt;

        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertIsInstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;windll&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kernel32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WinDLL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;verbosity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why do we need Sub tests?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestIsEven&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_even_number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;is_even&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will work fine, and the test will fail if any of the assertions fail. However, using &lt;code&gt;subTest&lt;/code&gt; provides &lt;strong&gt;better granularity and diagnostics&lt;/strong&gt; when running tests. Here's why it's useful:&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Benefits of &lt;code&gt;subTest&lt;/code&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Isolated Failures&lt;/strong&gt;: Each iteration is treated as a separate subtest. If one number fails, the others still run, and you get a report for each.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clearer Output&lt;/strong&gt;: The test runner shows which specific input caused the failure, making debugging easier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved Test Reporting&lt;/strong&gt;: Especially useful when testing multiple inputs or edge cases.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Without &lt;code&gt;subTest&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;If one assertion fails, the loop stops, and you don’t get feedback on the remaining values.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example Output Comparison
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;With &lt;code&gt;subTest&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FAIL: test_even_number (number=-10)
FAIL: test_even_number (number=-12)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Without &lt;code&gt;subTest&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FAIL: test_even_number
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Available Assert Methods
&lt;/h2&gt;

&lt;p&gt;Comparing Values&lt;br&gt;
Comparing the result of a code unit with the expected value is a common way to check whether the unit works okay. The TestCase class defines a rich set of methods that allows you to do this type of check:&lt;/p&gt;

&lt;p&gt;Method  Comparison&lt;br&gt;
.assertEqual(a, b)  a == b&lt;br&gt;
.assertNotEqual(a, b)   a != b&lt;br&gt;
.assertTrue(x)  bool(x) is True&lt;br&gt;
.assertFalse(x) bool(x) is False&lt;/p&gt;

&lt;p&gt;Comparing Objects by Their Identity&lt;br&gt;
TestCase also implements methods that are related to the identity of objects. In Python’s CPython implementation, an object’s identity is the memory address where the object lives. This identity is a unique identifier that distinguishes one object from another.&lt;/p&gt;

&lt;p&gt;An object’s identity is a read-only property, which means that you can’t change an object’s identity once you’ve created the object. To check an object’s identity, you’ll use the is and is not operators.&lt;/p&gt;

&lt;p&gt;Here are a few assert methods that help you check for an object’s identity:&lt;/p&gt;

&lt;p&gt;Method  Comparison&lt;br&gt;
.assertIs(a, b) a is b&lt;br&gt;
.assertIsNot(a, b)  a is not b&lt;br&gt;
.assertIsNone(x)    x is None&lt;br&gt;
.assertIsNotNone(x) x is not None&lt;/p&gt;

&lt;p&gt;Comparing Collections&lt;br&gt;
Another common need when writing tests is to compare collections, such as lists, tuples, strings, dictionaries, and sets. The TestCase class also has shortcut methods for these types of comparisons. Here’s a summary of those methods:&lt;/p&gt;

&lt;p&gt;Method  Comparison&lt;br&gt;
.assertSequenceEqual(a, b)  Equality of two sequences&lt;br&gt;
.assertMultiLineEqual(a, b) Equality of two strings&lt;br&gt;
.assertListEqual(a, b)  Equality of two lists&lt;br&gt;
.assertTupleEqual(a, b) Equality of two tuples&lt;br&gt;
.assertDictEqual(a, b)  Equality of two dictionaries&lt;br&gt;
.assertSetEqual(a, b)   Equality of two sets&lt;/p&gt;
&lt;h2&gt;
  
  
  Using unittest From the Command Line
&lt;/h2&gt;

&lt;p&gt;unittest test_age.py&lt;/p&gt;

&lt;p&gt;you can also add modules to test&lt;/p&gt;
&lt;h2&gt;
  
  
  Grouping Your Tests With the TestSuite Class
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;unittest&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;calculations&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;median&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;subtract&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestArithmeticOperations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_subtract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;subtract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;subtract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertRaises&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ZeroDivisionError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestStatisticalOperations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_mean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="mf"&gt;3.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_median_odd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;median&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_median_even&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;median&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="mf"&gt;4.5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_median_unsorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;median&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_mode_single&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_mode_multiple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])),&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;These tests work as expected. Suppose you need a way to run the arithmetic and statistical tests separately. In this case, you can create test suites. In the following sections, you’ll learn how to do that.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# ...
&lt;/span&gt;
&lt;span class="c1"&gt;# in the same way, we can make a suite for statistical
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;make_suite&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;arithmetic_tests&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nc"&gt;TestArithmeticOperations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;test_add&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nc"&gt;TestArithmeticOperations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;test_subtract&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nc"&gt;TestArithmeticOperations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;test_multiply&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nc"&gt;TestArithmeticOperations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;test_divide&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TestSuite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;arithmetic_tests&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;suite&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;make_suite&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;runner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;TextTestRunner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;verbosity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;runner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;suite&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# output
&lt;/span&gt;
&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;test_calculations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="nf"&gt;test_add &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestArithmeticOperations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test_add&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;
&lt;span class="nf"&gt;test_subtract &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestArithmeticOperations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test_subtract&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;
&lt;span class="nf"&gt;test_multiply &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestArithmeticOperations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test_multiply&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Creating Test Fixtures
&lt;/h2&gt;

&lt;p&gt;Great question! Let's break this down into two parts:&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 &lt;code&gt;setUp()&lt;/code&gt;, &lt;code&gt;tearDown()&lt;/code&gt;, &lt;code&gt;setUpClass()&lt;/code&gt;, &lt;code&gt;tearDownClass()&lt;/code&gt; in &lt;code&gt;unittest&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;These are &lt;strong&gt;test fixture methods&lt;/strong&gt; used to prepare and clean up the environment for your tests.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;code&gt;setUp()&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Runs &lt;strong&gt;before each test method&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Used to set up objects or state needed for the test.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;code&gt;tearDown()&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Runs &lt;strong&gt;after each test method&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Used to clean up resources (e.g., closing files, stopping mocks).&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;code&gt;setUpClass()&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Runs &lt;strong&gt;once before all tests&lt;/strong&gt; in the class.&lt;/li&gt;
&lt;li&gt;Must be decorated with &lt;code&gt;@classmethod&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;code&gt;tearDownClass()&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Runs &lt;strong&gt;once after all tests&lt;/strong&gt; in the class.&lt;/li&gt;
&lt;li&gt;Also decorated with &lt;code&gt;@classmethod&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;unittest&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyTestCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="nd"&gt;@classmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setUpClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🔧 setUpClass: Run once before all tests&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nd"&gt;@classmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tearDownClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🧹 tearDownClass: Run once after all tests&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setUp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🔧 setUp: Run before each test&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tearDown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🧹 tearDown: Run after each test&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_one&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅ Running test_one&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_two&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅ Running test_two&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🔧 setUpClass: Run once before all tests
🔧 setUp: Run before each test
✅ Running test_one
🧹 tearDown: Run after each test
🔧 setUp: Run before each test
✅ Running test_two
🧹 tearDown: Run after each test
🧹 tearDownClass: Run once after all tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 What is &lt;code&gt;MagicMock&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;MagicMock&lt;/code&gt; is a subclass of &lt;code&gt;Mock&lt;/code&gt; from &lt;code&gt;unittest.mock&lt;/code&gt;. It behaves like a mock object but also includes &lt;strong&gt;default implementations for magic methods&lt;/strong&gt; (like &lt;code&gt;__len__&lt;/code&gt;, &lt;code&gt;__getitem__&lt;/code&gt;, &lt;code&gt;__iter__&lt;/code&gt;, etc.).&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Use Case:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;unittest.mock&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;MagicMock&lt;/span&gt;

&lt;span class="n"&gt;mock_obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MagicMock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;mock_obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__len__&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;return_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mock_obj&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Output: 5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔸 Why Use &lt;code&gt;MagicMock&lt;/code&gt;?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;When you're mocking objects that use &lt;strong&gt;magic methods&lt;/strong&gt; (dunder methods).&lt;/li&gt;
&lt;li&gt;It saves you from manually defining those methods.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;In Python unit testing, &lt;strong&gt;test fixtures&lt;/strong&gt; are used to set up the environment before each test and clean it up afterward. When it comes to &lt;strong&gt;mocking instance methods and class methods&lt;/strong&gt;, the &lt;code&gt;unittest.mock&lt;/code&gt; module provides powerful tools to do this.&lt;/p&gt;

&lt;p&gt;Here’s how you can mock both:&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 Mocking an &lt;strong&gt;Instance Method&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Suppose you have a class like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can mock the &lt;code&gt;greet&lt;/code&gt; method like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;unittest&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TestCase&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;unittest.mock&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;patch&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestMyClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nd"&gt;@patch.object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;greet&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;return_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Mocked Hello&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mock_greet&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Mocked Hello&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;mock_greet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assert_called_once&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 Mocking a &lt;strong&gt;Class Method&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nd"&gt;@classmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Original Name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can mock it similarly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;unittest&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TestCase&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;unittest.mock&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;patch&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestMyClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nd"&gt;@patch.object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;get_name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;return_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Mocked Name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_get_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mock_get_name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_name&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Mocked Name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;mock_get_name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assert_called_once&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔸 Key Points
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;@patch.object(ClassName, 'method_name')&lt;/code&gt; to mock methods.&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;instance methods&lt;/strong&gt;, you usually call them on an object.&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;class methods&lt;/strong&gt;, you call them on the class itself.&lt;/li&gt;
&lt;li&gt;You can also use &lt;code&gt;patch()&lt;/code&gt; as a context manager if you prefer not to use decorators.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ Bonus: Mocking with Fixtures
&lt;/h2&gt;

&lt;p&gt;If you want to reuse mocks across multiple tests, you can use &lt;code&gt;setUp()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestMyClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setUp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;patcher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;patch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;greet&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;return_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Hello from setup&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mock_greet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;patcher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addCleanup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;patcher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Hello from setup&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Scenario Based Question
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_weekday&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;today&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;today&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;weekday&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;weekday&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestWeekday&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nd"&gt;@patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weekday.datetime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_is_weekday&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mock_datetime&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;mock_datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;return_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertTrue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;weekday&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_weekday&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="nd"&gt;@patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weekday.datetime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_is_weekend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mock_datetime&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;mock_datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;return_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertFalse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;weekday&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_weekday&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Great questions! Let's break down both parts clearly:&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ 1. &lt;strong&gt;Why are we mocking &lt;code&gt;datetime&lt;/code&gt;?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;You're mocking &lt;code&gt;datetime.date.today()&lt;/code&gt; because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The function &lt;code&gt;is_weekday()&lt;/code&gt; depends on the &lt;strong&gt;current date&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;In unit testing, you want &lt;strong&gt;predictable, repeatable results&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If you don’t mock it, the test result will change depending on the actual day it's run.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔍 Without mocking:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_is_weekday&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;is_weekday&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Might pass or fail depending on today's date
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ With mocking:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weekday.datetime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_is_weekday&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mock_datetime&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;mock_datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;return_value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Thursday
&lt;/span&gt;    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertTrue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;weekday&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_weekday&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures the test always runs with a known date (April 4, 2024), which is a Thursday (weekday).&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ 2. &lt;strong&gt;Who attaches the second parameter &lt;code&gt;mock_datetime&lt;/code&gt; to the test method?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;That’s done by the &lt;strong&gt;&lt;code&gt;@patch&lt;/code&gt; decorator&lt;/strong&gt; from &lt;code&gt;unittest.mock&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  How it works:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@patch("weekday.datetime")&lt;/code&gt; replaces &lt;code&gt;datetime&lt;/code&gt; in the &lt;code&gt;weekday&lt;/code&gt; module with a mock object.&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;automatically injects&lt;/strong&gt; that mock object as the &lt;strong&gt;first argument&lt;/strong&gt; to your test method.&lt;/li&gt;
&lt;li&gt;So &lt;code&gt;mock_datetime&lt;/code&gt; is the mock version of &lt;code&gt;datetime&lt;/code&gt; inside the &lt;code&gt;weekday&lt;/code&gt; module.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Behind the scenes:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weekday.datetime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_is_weekday&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mock_datetime&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;  &lt;span class="c1"&gt;# mock_datetime is injected here
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can name it anything (&lt;code&gt;mock_dt&lt;/code&gt;, &lt;code&gt;mocked_datetime&lt;/code&gt;, etc.) — it’s just a parameter that receives the mock.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Why &lt;code&gt;@patch("weekday.datetime")&lt;/code&gt; instead of &lt;code&gt;@patch("datetime.datetime")&lt;/code&gt;?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 The key idea: &lt;strong&gt;Patch where it's used, not where it's defined.&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When you write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weekday.datetime&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're patching the &lt;code&gt;datetime&lt;/code&gt; &lt;strong&gt;as imported and used inside the &lt;code&gt;weekday&lt;/code&gt; module&lt;/strong&gt; — not the global &lt;code&gt;datetime&lt;/code&gt; module.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 Why this matters:
&lt;/h3&gt;

&lt;p&gt;If you patch &lt;code&gt;datetime.datetime&lt;/code&gt; globally, it affects &lt;strong&gt;all uses of &lt;code&gt;datetime&lt;/code&gt;&lt;/strong&gt;, which can lead to unintended side effects across your tests or even other modules.&lt;/p&gt;

&lt;p&gt;But by patching &lt;code&gt;weekday.datetime&lt;/code&gt;, you're only mocking the &lt;code&gt;datetime&lt;/code&gt; object &lt;strong&gt;as seen by the &lt;code&gt;weekday&lt;/code&gt; module&lt;/strong&gt; — keeping the scope clean and safe.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Alternative: Mock the whole function
&lt;/h2&gt;

&lt;p&gt;You're absolutely right — another clean and often better approach is to &lt;strong&gt;mock the function directly&lt;/strong&gt;, especially if it's small and self-contained.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;

&lt;p&gt;Instead of mocking &lt;code&gt;datetime&lt;/code&gt;, you could do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weekday.is_weekday&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;return_value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_is_weekday&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mock_is_weekday&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertTrue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;weekday&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_weekday&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This avoids mocking internals and focuses on behavior — which is often more robust and readable.&lt;/p&gt;




&lt;h1&gt;
  
  
  doctest: Document and Test Your Code at Once
&lt;/h1&gt;




&lt;h2&gt;
  
  
  🔹 What is &lt;code&gt;doctest&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;doctest&lt;/code&gt; lets you write tests &lt;strong&gt;inside your docstrings&lt;/strong&gt;. It parses the docstring, runs the code snippets, and checks if the output matches.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Adds two numbers.
&lt;/span&gt;&lt;span class="gp"&gt;
    &amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="mi"&gt;5&lt;/span&gt;
    &lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; doctest your_file.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 What is &lt;code&gt;unittest&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;unittest&lt;/code&gt; is Python’s built-in testing framework, inspired by Java’s JUnit. It supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test fixtures (&lt;code&gt;setUp&lt;/code&gt;, &lt;code&gt;tearDown&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Assertions&lt;/li&gt;
&lt;li&gt;Test discovery&lt;/li&gt;
&lt;li&gt;Mocking&lt;/li&gt;
&lt;li&gt;Parameterized tests&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;unittest&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestAdd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_add_positive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_add_negative&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔸 Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;&lt;code&gt;doctest&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;unittest&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ease of use&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Very simple&lt;/td&gt;
&lt;td&gt;❌ More boilerplate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Location of tests&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Inside docstrings&lt;/td&gt;
&lt;td&gt;Separate test classes/files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Readability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Looks like examples&lt;/td&gt;
&lt;td&gt;❌ More verbose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Flexibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Limited&lt;/td&gt;
&lt;td&gt;✅ Very flexible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mocking support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Not supported&lt;/td&gt;
&lt;td&gt;✅ Full support via &lt;code&gt;unittest.mock&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fixtures&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Not supported&lt;/td&gt;
&lt;td&gt;✅ &lt;code&gt;setUp&lt;/code&gt;, &lt;code&gt;tearDown&lt;/code&gt;, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simple functions, documentation&lt;/td&gt;
&lt;td&gt;Complex logic, full test suites&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Debugging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Harder to debug failures&lt;/td&gt;
&lt;td&gt;✅ Detailed error messages&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ✅ When to Use Each
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use &lt;code&gt;doctest&lt;/code&gt; when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You want to &lt;strong&gt;document and test simple functions&lt;/strong&gt; at once.&lt;/li&gt;
&lt;li&gt;You're writing &lt;strong&gt;educational or example-driven code&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You want &lt;strong&gt;lightweight testing&lt;/strong&gt; with minimal setup.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use &lt;code&gt;unittest&lt;/code&gt; when:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need &lt;strong&gt;fixtures&lt;/strong&gt;, &lt;strong&gt;mocking&lt;/strong&gt;, or &lt;strong&gt;parameterized tests&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You're testing &lt;strong&gt;complex logic&lt;/strong&gt;, &lt;strong&gt;classes&lt;/strong&gt;, or &lt;strong&gt;external dependencies&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You want &lt;strong&gt;structured, maintainable test suites&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔸 Your Insight: Mocking and Fixtures in unittest
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@patch&lt;/code&gt; and &lt;code&gt;MagicMock&lt;/code&gt; for mocking dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;setUp&lt;/code&gt;, &lt;code&gt;tearDown&lt;/code&gt;, &lt;code&gt;setUpClass&lt;/code&gt; for reusable test setup.&lt;/li&gt;
&lt;li&gt;Integration with tools like &lt;code&gt;pytest&lt;/code&gt;, &lt;code&gt;coverage&lt;/code&gt;, and CI pipelines.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Reference:-&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://realpython.com/python-unittest/" rel="noopener noreferrer"&gt;https://realpython.com/python-unittest/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://realpython.com/python-doctest/" rel="noopener noreferrer"&gt;https://realpython.com/python-doctest/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>unittest</category>
    </item>
    <item>
      <title>Behavioral interview Preparation</title>
      <dc:creator>Ashutosh Sarangi</dc:creator>
      <pubDate>Fri, 19 Sep 2025 18:40:15 +0000</pubDate>
      <link>https://forem.com/ashutoshsarangi/behavioral-interview-preparation-93e</link>
      <guid>https://forem.com/ashutoshsarangi/behavioral-interview-preparation-93e</guid>
      <description>&lt;h3&gt;
  
  
  1. Challenges I faced
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario 1: Handling massive datasets without impacting browser performance&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Challenge:&lt;/strong&gt; On a Catalogone project, we encountered a significant performance issue. We were building a feature that required loading a very long list of items, and while it worked fine with a small amount of data, the browser would slow down and eventually freeze when we had to display over a million elements. The core problem was trying to render all the elements in the DOM simultaneously.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What I Did:&lt;/strong&gt; I took the initiative to solve this performance bottleneck by creating a custom npm package. The solution leveraged the &lt;code&gt;IntersectionObserver&lt;/code&gt; API to monitor the visibility of a top and bottom element in the list. This allowed me to implement a virtualized list strategy: when a user scrolled down, the observer would trigger a function to add new elements to the bottom and remove older ones from the top. The inverse would happen when a user scrolled up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Outcome:&lt;/strong&gt; My package ensured that at any given time, there were no more than 50 elements in the DOM, regardless of the total data size. This eliminated browser freezing and provided a smooth, seamless scrolling experience. The solution not only solved the immediate problem but also created a reusable, scalable package that could be used on other projects with large datasets, preventing similar issues in the future.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Scenario 2: Handling a tight deadline on a complex project&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Challenge:&lt;/strong&gt; During the development of the "Phoenix" B2B product at Amdocs, we faced a tight deadline to launch a new module that needed to generate complex JSON objects for other applications. We discovered a critical bug in the conflict resolution feature that was causing data corruption just days before the scheduled release.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;What I Did:&lt;/strong&gt; I immediately initiated a rapid troubleshooting session with the team. Instead of panicking, I broke down the problem into smaller, manageable parts. I assigned specific tasks to team members based on their expertise, and I personally focused on debugging the core logic of the conflict resolution algorithm. I also communicated transparently with the project manager about the issue and our revised timeline for a fix, managing stakeholder expectations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Outcome:&lt;/strong&gt; Through a focused and collaborative effort, we identified the root cause of the bug within a day. We implemented a fix, thoroughly tested it, and deployed the module with only a minimal delay. This experience highlighted the importance of clear communication and a calm, methodical approach under pressure.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. Mistakes I made in the past
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario 1: Communication breakdown with a large team&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Mistake:&lt;/strong&gt; As a Team Lead at Neosoft, I was responsible for a large-scale project involving a team of over 50 members. We were working on a complex feature that required tight coordination between different sub-teams (e.g., frontend, backend, mobile). My mistake was not establishing a formal communication channel for the team. I relied too much on informal communication channels, assuming everyone was on the same page. This led to a significant miscommunication where one sub-team built a feature based on an outdated set of API specs(Different JSON schema for response), causing a major integration roadblock and delaying the project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What I Learned:&lt;/strong&gt; This experience taught me a crucial lesson about the scalability of communication. With a small team, informal communication can work, but with a large team, a lack of formal processes can lead to chaos. I realized that clear, documented communication is a leader's most powerful tool for ensuring alignment and efficiency.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How I Rectified It:&lt;/strong&gt; I immediately called a meeting with all the sub-team leads to address the issue. We collectively implemented a new communication protocol. We also introduced a brief daily sync-up meeting for team leads to flag any dependencies or potential roadblocks proactively. This new process streamlined our workflow and prevented similar issues on future projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Scenario 2: Underestimating the complexity of a new feature&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Mistake:&lt;/strong&gt; While working on the "Catalog One" project, I was tasked with estimating the timeline for developing the "ABAC-Enable for Product Offering" (Attribute-Based Access Control) module. The task was to create a feature that could restrict/hide elements based on the rule and role. Based on my initial assessment, I provided an aggressive timeline to the epic. However, I underestimated the complexity of implementing the ABAC foundation, which caused us to fall behind schedule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What I Learned:&lt;/strong&gt; I learned to be more conservative with my timelines and to break down complex tasks into smaller, more detailed sub-tasks before providing an estimate. I also realized the importance of anticipating potential technical roadblocks and communicating them proactively.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How I Rectified It:&lt;/strong&gt; I owned my mistake and immediately informed the product owners of the revised timeline, providing a detailed breakdown of the remaining work and the technical challenges we encountered. This transparency helped manage their expectations and allowed us to deliver a high-quality product, even if it was a bit later than originally planned.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. I enjoyed in a project
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario 1: Building a multi-agent system&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What I Enjoyed:&lt;/strong&gt; I absolutely loved working on the "Multi-Agent-Toolcalling" project. The concept of designing a system where multiple LLMs (Large Language Models) could autonomously determine and coordinate tool calls was incredibly exciting. The project was at the cutting edge of AI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why It was Enjoyable:&lt;/strong&gt; It was a unique blend of front-end development (designing the UI for displaying the agents' responses) and back-end logic (developing the system that orchestrates the tool calls). The problem-solving aspect was particularly rewarding, as it felt like I was building a truly intelligent system that could reason and make decisions. I also enjoyed seeing the results of our work in real-time, as the agents responded and performed tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Scenario 2: The challenge of a real-time system&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What I Enjoyed:&lt;/strong&gt; I really enjoyed the "Human-in-Loop GenAI Integration" project. The real-time aspect of it (Socket.IO), was a thrilling challenge. It required a deep understanding of asynchronous communication and state management to ensure seamless interaction between the human user and the AI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why It was Enjoyable:&lt;/strong&gt; The project was not just about coding; it was about designing a system that felt responsive and intuitive. It was a perfect blend of my front-end expertise with GenAI. Building the containerized environment with Docker and Kubernetes also gave me hands-on experience with scalable, modern infrastructure, which was a new and exciting area for me. The process of seeing the system come to life and observing the seamless interaction was incredibly satisfying.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. Leadership role in projects
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario 1: Mentoring and building a large team&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;My Role:&lt;/strong&gt; As a Team Lead at Neosoft, one of my most significant achievements was mentoring and developing a team of more than 50 members. My leadership wasn't just about managing tasks; it was about fostering growth and creating a strong, cohesive unit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What I Did:&lt;/strong&gt; I implemented a mentorship program where senior developers were paired with junior members. I also introduced weekly knowledge-sharing sessions where team members could present on a new technology or a challenging problem they solved. I focused on empowering my team by delegating responsibilities and trusting their abilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Outcome:&lt;/strong&gt; This approach not only improved the team's overall skill level and productivity but also boosted morale and reduced turnover. I'm proud that many of the developers I mentored went on to take on leadership roles themselves.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Scenario 2: Leading pre-sales and client interactions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;My Role:&lt;/strong&gt; As a Team Lead, I was responsible for leading many projects from the pre-sales stage all the way to completion. This included direct interaction with clients for requirement gathering and solution architecting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What I Did:&lt;/strong&gt; During pre-sales activities, I would meet with potential clients to understand their needs and propose a technical solution. For a project involving a web and mobile application, I listened to the client's business goals and then architected a full-stack solution using React for the front-end and Node.js for the back-end and we will wrap the application in Electron for mobile application. I created a detailed technical proposal and a proof of concept (POC) to demonstrate the feasibility of our solution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Outcome:&lt;/strong&gt; My ability to translate business requirements into a clear technical roadmap and my hands-on experience with the technologies gave the client confidence in our team. We won the project and successfully delivered a solution that not only met their initial needs but also exceeded their expectations in terms of performance and scalability.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. Conflicts in projects with colleagues
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario 1: Disagreement on a technical approach&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Conflict:&lt;/strong&gt; On the "KnowledgeOne" project, a colleague and I had a disagreement about the best way to integrate Confluence with the LLM. I proposed using a RAG (Retrieval-Augmented Generation) system with Pinecone as the vector database, as I believed it was the most efficient and scalable solution for our embedded data storage. My colleague, however, preferred a different approach using a simpler, more traditional database, arguing it would be faster to implement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How I Handled It:&lt;/strong&gt; I listened carefully to my colleague's reasoning and acknowledged their point about the faster implementation time. However, instead of simply dismissing their idea, I presented a more detailed analysis of the long-term benefits of the RAG system, highlighting its scalability and the improved accuracy it would provide by retrieving information from our large Confluence knowledge base. I also offered to build a small prototype of my proposed solution to demonstrate its effectiveness.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Outcome:&lt;/strong&gt; My colleague appreciated the data-driven approach and the effort to build the prototype. After seeing the clear benefits of the RAG system, they agreed it was the better long-term solution. We moved forward with my proposed architecture, and the project was a success.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Scenario 2: The classic "backend vs. frontend" conflict&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Conflict:&lt;/strong&gt; During the development of the "Phoenix" B2B product, there was a miscommunication between the frontend and backend teams regarding the format of a JSON object. The backend team had changed the structure of the JSON object without informing us on the frontend team, which caused our module to fail. My front-end colleagues were frustrated, and we were behind schedule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How I Handled It:&lt;/strong&gt; As a senior developer, I took the initiative to bridge the communication gap. I scheduled a quick meeting with the Lead and the relevant developers. I calmly explained the issue and suggested that we create a Confluence page where all changes to the API and JSON structures would be logged and communicated in real-time. This would prevent similar issues in the future.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Outcome:&lt;/strong&gt; The backend team was receptive to the idea. We implemented a new process of using a collaborative tool to document all API changes, which significantly improved our team's communication and efficiency. This experience reinforced the importance of proactive communication and process improvement in a collaborative environment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is a different scenario for the same question, this time drawing from your experience as a Team Lead at Neosoft.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Scenario 3: Team Member with a highly creative problem-solver who preferred to "just get it done," often bypassing our standard documentation and code review processes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The challenge&lt;/strong&gt; undocumented code caused integration issues for other developers on the project. My task was to address this without impacting their creative energy, which was a huge asset to the team.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I handled this by first scheduling a one-on-one meeting to understand their perspective. &lt;/li&gt;
&lt;li&gt;I acknowledged their incredible speed and skill, recognizing that my personality might be too focused on process for their liking. Then, I explained the &lt;strong&gt;"why"&lt;/strong&gt; behind our team standards: with a team of our size, clean code and clear documentation were not just a preference but a necessity for long-term project health and maintainability.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  6. What I did differently apart from my org roles
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario 1: Self-learning and skill expansion&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Action:&lt;/strong&gt; I have a strong passion for continuous learning that goes beyond my daily responsibilities. While working as a front-end developer, I made the conscious decision to expand my expertise into Generative AI and machine learning. This wasn't a requirement of my job at the time; it was a personal goal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How it was Different:&lt;/strong&gt; I dedicated my personal time to studying neural networks, lang graph, lang chain. I enrolled in online courses, read research papers, and worked on personal projects to get hands-on experience. This self-driven learning allowed me to become proficient in a new domain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Outcome:&lt;/strong&gt; This independent learning proved to be a major advantage. It directly led to me being able to contribute to innovative projects like the "Human-in-Loop GenAI Integration" and the "Multi-Agent-Toolcalling" system at Amdocs, which were outside the scope of a typical front-end developer's role.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Scenario 2: Developing side projects to explore new technologies&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Action:&lt;/strong&gt; I've always been a strong believer in building personal projects to apply what I learn. While working on enterprise applications, I decided to build an npm package that will handle a true infinite loader, without freezing the browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How it was Different:&lt;/strong&gt; I faced lot of challenges to work on the details of the npm package, I read many articles, and I went very deep into how browser trace interaction works, which has more priority than all. But eventually, I did the npm package.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Outcome:&lt;/strong&gt; I have the npm package published, and I used in one of our internal projects. It worked very well.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Q. What keyword did your senior and junior colleges use for you?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Key Takeaway for Your Answer
&lt;/h3&gt;

&lt;h3&gt;
  
  
  What Juniors Would Say 🧑‍💻
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keywords:&lt;/strong&gt; &lt;strong&gt;Helpful, Patient, Mentor, Go-to Person, Knowledgeable&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Example Answer:&lt;/strong&gt; "I believe my junior colleagues would describe me as the &lt;strong&gt;'go-to person'&lt;/strong&gt; on the team. They would say I'm &lt;strong&gt;patient&lt;/strong&gt; and always willing to help. For example, a few months ago, a new developer on my team was struggling with a complex scenario with a thunk action in Redux. Instead of just giving them the solution, I sat with them, explained the underlying principles of the thunk action, and walked them through the debugging process. The goal wasn't just to fix the bug, but to help them understand the 'why' behind the code. I believe they would describe me as a &lt;strong&gt;mentor&lt;/strong&gt; who invests in their growth."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  What Senior People Would Say 👩‍💼
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keywords:&lt;/strong&gt; &lt;strong&gt;Reliable, Strategic, Problem-Solver, Proactive, Owner&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Example Answer:&lt;/strong&gt; "My senior colleagues and managers would likely describe me as &lt;strong&gt;'strategic'&lt;/strong&gt; and a &lt;strong&gt;'problem-solver'&lt;/strong&gt;. They would say that I am someone who doesn't just write code, but also thinks about the long-term impact on the product and the business. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For instance, on our last project, I noticed a recurring performance issue caused by inefficient data fetching on the front-end. It wasn't my assigned task, but I proactively investigated it. In the UI component, it was being re-rendered multiple times. I added React.Memo and useCallbacks for optimising the re-renders. This improved our page load times by over 30%. They would describe me as an &lt;strong&gt;'owner'&lt;/strong&gt; who takes responsibility for the success of the entire feature."&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introduce Yourself
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I'm a passionate and results-driven Front-End Developer with 10 years of experience building high-performance, scalable applications. My core expertise lies in modern technologies like &lt;strong&gt;React, Redux Toolkit, and TypeScript&lt;/strong&gt;, which I've used to deliver complex projects throughout my career.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In my current role at Amdocs, I am an Advanced Software Developer working on an enterprise catalog project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A key challenge I successfully solved was optimizing a massive data list, where I developed a custom npm package that prevented browser freezing by dynamically rendering only a handful of elements at any given time, ensuring a smooth user experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Before that, as a Team Lead at Neosoft, I not only worked hands-on with a wide range of technologies like &lt;strong&gt;React, React-Native, and Node.js, Ionic, Angular&lt;/strong&gt;, but I also mentored and grew a team of over 50 members. I was directly involved in pre-sales activities and client interactions, where I'd architect and lead end-to-end project solutions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I'm now expanding my skills into &lt;strong&gt;Generative AI and machine learning&lt;/strong&gt;. My recent projects, like the &lt;strong&gt;Multi-Agent-Toolcalling&lt;/strong&gt; and &lt;strong&gt;KnowledgeOne&lt;/strong&gt; systems, allowed me to apply this knowledge by leveraging multiple LLMs and RAG systems.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am now seeking a fast-paced and innovative environment where I can leverage my deep front-end expertise and growing knowledge in AI to build the next generation of applications, like yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rebecca Okamoto Version of Introduce yourself
&lt;/h2&gt;

&lt;p&gt;I'm a front-end expert with a decade of experience in building high-performance, scalable applications using React, Redux Toolkit, and TypeScript. My passion is tackling complex challenges and creating robust solutions that directly impact the user experience and business efficiency.&lt;/p&gt;

&lt;p&gt;During my time as a Team Lead at Neosoft, I managed and mentored a team of over 50 members. I'm skilled at architecting end-to-end solutions, and I've successfully managed stakeholder expectations and pre-sales activities to ensure project success.&lt;/p&gt;

&lt;p&gt;Finally, I'm at the forefront of innovation, expanding my expertise into Generative AI and machine learning. I have hands-on experience with transformer techniques and RAG systems, as demonstrated by my work on the Multi-Agent-Toolcalling and KnowledgeOne projects. I'm looking to bring this unique blend of front-end mastery and cutting-edge AI knowledge to a company like yours, where I can help build the next generation of applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Weakness:-
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Weakness: A Tendency to Over-Mentor and Provide Answers Too Quickly
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. The Weakness&lt;/strong&gt;&lt;br&gt;
"An earlier I've had to manage is my tendency to jump in and provide solutions for my team members too quickly. As a Team Lead at Neosoft, I was so focused on mentorship and ensuring project velocity that I would often solve a junior developer's problem for them, rather than guiding them to the answer themselves."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The Example&lt;/strong&gt;&lt;br&gt;
"I came to realize that while this helped in the short term, it wasn't scalable, especially with a team of over 50 members. More importantly, it was hindering my team's growth and critical thinking skills. They were becoming dependent on me as a single point of failure instead of learning to troubleshoot independently."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The Action &amp;amp; Growth&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"To address this, I've made a conscious effort to change my approach. Now, when a team member comes to me with a problem, I shift from giving them the answer to asking them a series of probing questions. I'll guide them through the debugging process and encourage them to look at the documentation or code themselves. &lt;/li&gt;
&lt;li&gt;I also implemented a knowledge-sharing system so the team could document their solutions for future reference. &lt;/li&gt;
&lt;li&gt;This shift has not only empowered my colleagues to become more confident and independent problem-solvers but has also freed me up to focus on higher-level architectural challenges and strategic planning."&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>interview</category>
      <category>performance</category>
      <category>javascript</category>
      <category>career</category>
    </item>
    <item>
      <title>Python Basic __init__ , __pycache__ &amp; PIP</title>
      <dc:creator>Ashutosh Sarangi</dc:creator>
      <pubDate>Fri, 19 Sep 2025 09:04:48 +0000</pubDate>
      <link>https://forem.com/ashutoshsarangi/python-basic-init-pycache-pip-3dkl</link>
      <guid>https://forem.com/ashutoshsarangi/python-basic-init-pycache-pip-3dkl</guid>
      <description>&lt;h2&gt;
  
  
  Basic Python
&lt;/h2&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;1. Python Type Checking (Guide)&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Python is dynamically typed, but you can use &lt;strong&gt;type hints&lt;/strong&gt; for better readability, tooling, and static analysis.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Type Hinting Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, you are &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; years old.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ✅ Type Hinting for Complex Structures
&lt;/h2&gt;

&lt;p&gt;Python uses the &lt;code&gt;typing&lt;/code&gt; module to define complex types.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 Imports you'll need:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Tuple&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔸 Example 1: Function that returns a &lt;strong&gt;list of dictionaries&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;transform_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Converts a dict of {key: int} to a list of dicts with stringified values.

    Example:
    {&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: 1, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: 2} → [{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;}, {&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;}]
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Type Breakdown
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Dict[str, int]&lt;/code&gt;: Input is a dictionary with string keys and integer values.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;List[Dict[str, str]]&lt;/code&gt;: Output is a list of dictionaries with string keys and string values.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔸 Example 2: Function that returns a &lt;strong&gt;list of tuples&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Tuple&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;dict_to_tuples&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Tuple&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Converts a dict to a list of key-value tuples.

    Example:
    {&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: 1, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;: 2} → [(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, 1), (&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;, 2)]
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Type Breakdown
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;List[Tuple[str, int]]&lt;/code&gt;: Output is a list of tuples, each containing a string and an integer.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔸 Example 3: Mixed or Unknown Types
&lt;/h2&gt;

&lt;p&gt;If your dictionary or list contains mixed types, use &lt;code&gt;Any&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]]:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 Bonus: Using &lt;code&gt;TypedDict&lt;/code&gt; for Structured Dicts
&lt;/h2&gt;

&lt;p&gt;If your dicts have a fixed structure, you can define a &lt;code&gt;TypedDict&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_users&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ashutosh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Assaf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using &lt;code&gt;TypedDict&lt;/code&gt; in Python provides several &lt;strong&gt;advantages&lt;/strong&gt;, especially when you're working with dictionaries that have a &lt;strong&gt;fixed structure&lt;/strong&gt; — like JSON-like data or configuration objects. Let's explore this in detail.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ What is &lt;code&gt;TypedDict&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;TypedDict&lt;/code&gt; is a feature from the &lt;code&gt;typing&lt;/code&gt; module that lets you define the &lt;strong&gt;expected structure of a dictionary&lt;/strong&gt; — including the types of its keys and values.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TypedDict&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;is_active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_user&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ashutosh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;is_active&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ Advantages of Using &lt;code&gt;TypedDict&lt;/code&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Type Safety&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;You get &lt;strong&gt;static type checking&lt;/strong&gt; with tools like &lt;code&gt;mypy&lt;/code&gt;, &lt;code&gt;pyright&lt;/code&gt;, or IDEs (VS Code, PyCharm).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ashutosh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;thirty&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;is_active&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;# ❌ Type error
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;Better IDE Support&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Autocompletion for keys&lt;/li&gt;
&lt;li&gt;Inline type hints&lt;/li&gt;
&lt;li&gt;Error highlighting&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Self-Documenting Code&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;It’s clear what structure the dictionary should have — no need to guess or read through comments.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. &lt;strong&gt;Improved Refactoring&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;If you change the structure of &lt;code&gt;User&lt;/code&gt;, type checkers will help you find all affected code.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Cleaner JSON Handling&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When working with APIs, you often parse JSON into dictionaries. &lt;code&gt;TypedDict&lt;/code&gt; helps define the expected shape.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;parse_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json_str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json_str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔸 Optional and Required Keys
&lt;/h2&gt;

&lt;p&gt;You can define optional keys using &lt;code&gt;total=False&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PartialUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔸 Comparison: &lt;code&gt;TypedDict&lt;/code&gt; vs Raw &lt;code&gt;Dict[str, Any]&lt;/code&gt;
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;&lt;code&gt;Dict[str, Any]&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;TypedDict&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Type safety&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IDE support&lt;/td&gt;
&lt;td&gt;❌ Limited&lt;/td&gt;
&lt;td&gt;✅ Autocompletion, hints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Documentation&lt;/td&gt;
&lt;td&gt;❌ Implicit&lt;/td&gt;
&lt;td&gt;✅ Explicit structure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Error detection&lt;/td&gt;
&lt;td&gt;❌ Runtime only&lt;/td&gt;
&lt;td&gt;✅ Static analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ✅ When Should You Use &lt;code&gt;TypedDict&lt;/code&gt;?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;When working with &lt;strong&gt;structured data&lt;/strong&gt; (e.g., JSON from APIs)&lt;/li&gt;
&lt;li&gt;When you want &lt;strong&gt;type-safe dictionaries&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;When building &lt;strong&gt;data models&lt;/strong&gt; without needing full classes&lt;/li&gt;
&lt;li&gt;When you want to &lt;strong&gt;avoid overengineering&lt;/strong&gt; with &lt;code&gt;dataclasses&lt;/code&gt; or &lt;code&gt;pydantic&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Absolutely! Let's dive into how to use &lt;code&gt;TypedDict&lt;/code&gt; with &lt;strong&gt;required and optional keys&lt;/strong&gt; in Python, with clear examples and explanations.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ What is &lt;code&gt;TypedDict&lt;/code&gt;?
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;TypedDict&lt;/code&gt; allows you to define the &lt;strong&gt;structure of a dictionary&lt;/strong&gt; with specific key names and value types. It’s part of the &lt;code&gt;typing&lt;/code&gt; module and is especially useful when working with structured data like JSON.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 Required vs Optional Keys
&lt;/h2&gt;

&lt;p&gt;By default, all keys in a &lt;code&gt;TypedDict&lt;/code&gt; are &lt;strong&gt;required&lt;/strong&gt;. You can make keys &lt;strong&gt;optional&lt;/strong&gt; by using &lt;code&gt;total=False&lt;/code&gt; or by using &lt;code&gt;NotRequired&lt;/code&gt; (Python 3.11+).&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Example 1: Required Keys Only
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TypedDict&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_user&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ashutosh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;# ✅ All keys are required
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you omit a key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ashutosh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;# ❌ mypy will complain: 'age' is missing
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ Example 2: Optional Keys with &lt;code&gt;total=False&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TypedDict&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PartialUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_partial_user&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;PartialUser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ashutosh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;# ✅ Only 'name' is provided
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, all keys are optional — you can include any, all, or none.&lt;/p&gt;




&lt;h3&gt;
  
  
  ✅ Example 3: Mixed Required and Optional (Python 3.11+)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NotRequired&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;NotRequired&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;NotRequired&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_profile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;username&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ashu_dev&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ashu@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;# ✅ 'phone' is optional
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the most flexible and readable way to define mixed key requirements.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔸 Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Python Version&lt;/th&gt;
&lt;th&gt;Behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TypedDict&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3.8+&lt;/td&gt;
&lt;td&gt;All keys required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TypedDict, total=False&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3.8+&lt;/td&gt;
&lt;td&gt;All keys optional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;NotRequired&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3.11+&lt;/td&gt;
&lt;td&gt;Selectively optional keys&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧩 1. &lt;code&gt;BaseModel&lt;/code&gt; (from &lt;code&gt;pydantic&lt;/code&gt;)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Features&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Runtime &lt;strong&gt;data validation&lt;/strong&gt; and &lt;strong&gt;type enforcement&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Automatic &lt;strong&gt;serialization/deserialization&lt;/strong&gt; (e.g., &lt;code&gt;.json()&lt;/code&gt;, &lt;code&gt;.dict()&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Useful for APIs, config files, and anywhere you need &lt;strong&gt;robust data models&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Supports &lt;strong&gt;default values&lt;/strong&gt;, &lt;strong&gt;validators&lt;/strong&gt;, and &lt;strong&gt;nested models&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧪 Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Field&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(...,&lt;/span&gt; &lt;span class="n"&gt;ge&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# age must be &amp;gt;= 0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔍 Behavior:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;If you pass invalid data, it raises a &lt;code&gt;ValidationError&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# ❌ Raises error due to age &amp;lt; 0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧩 2. &lt;code&gt;TypedDict&lt;/code&gt; (from &lt;code&gt;typing&lt;/code&gt; or &lt;code&gt;typing_extensions&lt;/code&gt;)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ &lt;strong&gt;Features&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Static type checking only&lt;/strong&gt; (via tools like MyPy, Pyright)&lt;/li&gt;
&lt;li&gt;No runtime validation&lt;/li&gt;
&lt;li&gt;Lightweight and faster&lt;/li&gt;
&lt;li&gt;Good for defining &lt;strong&gt;dict-like structures&lt;/strong&gt; with known keys&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧪 Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TypedDict&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserDict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔍 Behavior:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No runtime checks — it's just a hint for linters and IDEs.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;UserDict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;# ✅ No error at runtime
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🆚 Summary Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;BaseModel&lt;/code&gt; (Pydantic)&lt;/th&gt;
&lt;th&gt;
&lt;code&gt;TypedDict&lt;/code&gt; (typing)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Runtime validation&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Type hints&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serialization&lt;/td&gt;
&lt;td&gt;✅ &lt;code&gt;.dict()&lt;/code&gt;, &lt;code&gt;.json()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;❌ Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;❌ Slower&lt;/td&gt;
&lt;td&gt;✅ Faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use case&lt;/td&gt;
&lt;td&gt;APIs, configs, data models&lt;/td&gt;
&lt;td&gt;Lightweight dicts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nested models&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;td&gt;❌ Manual nesting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🧠 When to Use What?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Use &lt;strong&gt;&lt;code&gt;BaseModel&lt;/code&gt;&lt;/strong&gt; when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need &lt;strong&gt;data validation&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You're building APIs (e.g., FastAPI)&lt;/li&gt;
&lt;li&gt;You want structured, reliable data&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Use &lt;strong&gt;&lt;code&gt;TypedDict&lt;/code&gt;&lt;/strong&gt; when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want &lt;strong&gt;lightweight type hints&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You don’t need runtime validation&lt;/li&gt;
&lt;li&gt;You're working with plain dicts and want IDE/type checker support&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;2. Duck Typing in Python&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Duck Typing&lt;/strong&gt; is a concept where the type of an object is determined by its behavior (methods/attributes), not its actual class.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If it walks like a duck and quacks like a duck, it’s a duck.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  ✅ Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Duck&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;quack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Quack!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;quack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;m pretending to be a duck!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;make_it_quack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;thing&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;thing&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;make_it_quack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Duck&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;    &lt;span class="c1"&gt;# Quack!
&lt;/span&gt;&lt;span class="nf"&gt;make_it_quack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;  &lt;span class="c1"&gt;# I'm pretending to be a duck!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔸 Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Flexibility&lt;/li&gt;
&lt;li&gt;Decoupled code&lt;/li&gt;
&lt;li&gt;Easier testing and mocking&lt;/li&gt;
&lt;/ul&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Jane&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Python Dev&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;letters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;abc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ordinals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;one&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;first&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;two&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;second&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;three&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;third&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;even_digits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;letters&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ordinals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;even_digits&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;         &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="bp"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;
&lt;span class="n"&gt;Jane&lt;/span&gt;
&lt;span class="mi"&gt;25&lt;/span&gt;
&lt;span class="n"&gt;Python&lt;/span&gt; &lt;span class="n"&gt;Dev&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt;
&lt;span class="n"&gt;one&lt;/span&gt;
&lt;span class="n"&gt;two&lt;/span&gt;
&lt;span class="n"&gt;three&lt;/span&gt;
&lt;span class="mi"&gt;8&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="mi"&gt;6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ General Operations on Built-in Collections
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Lists&lt;/th&gt;
&lt;th&gt;Tuples&lt;/th&gt;
&lt;th&gt;Strings&lt;/th&gt;
&lt;th&gt;Ranges&lt;/th&gt;
&lt;th&gt;Dictionaries&lt;/th&gt;
&lt;th&gt;Sets&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Iteration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Indexing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Slicing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Concatenating&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Finding length&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reversing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sorting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅*&lt;/td&gt;
&lt;td&gt;✅*&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;* Sorting tuples and strings returns a &lt;strong&gt;new sorted list&lt;/strong&gt;, not a sorted tuple/string.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🔹 Detailed Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Iteration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;abc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ Indexing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;       &lt;span class="c1"&gt;# 1
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;       &lt;span class="c1"&gt;# 2
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;         &lt;span class="c1"&gt;# 'l'
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;        &lt;span class="c1"&gt;# 3
# Dictionaries and sets do not support indexing
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ Slicing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;      &lt;span class="c1"&gt;# [2, 3]
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:])&lt;/span&gt;      &lt;span class="c1"&gt;# (2, 3)
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;       &lt;span class="c1"&gt;# 'ell'
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;     &lt;span class="c1"&gt;# range(2, 5)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ Concatenating
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;    &lt;span class="c1"&gt;# [1, 2, 3, 4]
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;    &lt;span class="c1"&gt;# (1, 2, 3, 4)
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ab&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;# 'abcd'
# Sets use union, not +
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ Finding Length
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hello&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;}))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ Reversing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;abc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;
&lt;span class="c1"&gt;# dict and set are unordered → not reversible directly
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  ✅ Sorting
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;          &lt;span class="c1"&gt;# [1, 2, 3]
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;          &lt;span class="c1"&gt;# [1, 2, 3]
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cba&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;             &lt;span class="c1"&gt;# ['a', 'b', 'c']
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;}))&lt;/span&gt;          &lt;span class="c1"&gt;# [1, 2, 3]
# dicts can be sorted by keys or values manually
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔸 Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dictionaries&lt;/strong&gt; are unordered mappings — you can iterate over keys, values, or items, but not index or slice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sets&lt;/strong&gt; are unordered collections — no indexing or slicing, but support union, intersection, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tuples and strings&lt;/strong&gt; are immutable — operations like sorting or reversing return new objects.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;3. Sets in Python&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Sets are unordered collections of &lt;strong&gt;unique&lt;/strong&gt; elements.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Basic Usage
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Union
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# {1, 2, 3, 4, 5}
&lt;/span&gt;
&lt;span class="c1"&gt;# Intersection
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# {3}
&lt;/span&gt;
&lt;span class="c1"&gt;# Difference
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# {1, 2}
&lt;/span&gt;
&lt;span class="c1"&gt;# Symmetric Difference
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# {1, 2, 4, 5}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔸 Set Comparison
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;       &lt;span class="c1"&gt;# Checks if sets are equal
&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;issubset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;issuperset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;4. Other Data Types&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ List
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;fruits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apple&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;banana&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cherry&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;fruits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;orange&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Dictionary
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ashutosh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ Tuple
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;point&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ String
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, World!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;5. Why Use Dictionary When We Have JSON?&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 JSON is a &lt;strong&gt;data format&lt;/strong&gt; (text-based).
&lt;/h3&gt;

&lt;h3&gt;
  
  
  🔹 Dictionary is a &lt;strong&gt;Python data structure&lt;/strong&gt;.
&lt;/h3&gt;

&lt;p&gt;You use dictionaries to &lt;strong&gt;work with data in Python&lt;/strong&gt;, and convert them to/from JSON when &lt;strong&gt;communicating externally&lt;/strong&gt; (e.g., APIs, files).&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Ashutosh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;age&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;json_str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Convert dict to JSON string
&lt;/span&gt;&lt;span class="n"&gt;parsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json_str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Convert JSON string back to dict
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  &lt;strong&gt;6. &lt;code&gt;sorted()&lt;/code&gt; vs &lt;code&gt;.sort()&lt;/code&gt;&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ &lt;code&gt;sorted()&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Returns a &lt;strong&gt;new sorted list&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Works on any iterable&lt;/li&gt;
&lt;li&gt;Doesn’t modify the original
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;nums&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;new_nums&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ✅ &lt;code&gt;.sort()&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sorts the list &lt;strong&gt;in-place&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Only works on lists&lt;/li&gt;
&lt;li&gt;Returns &lt;code&gt;None&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;nums&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔸 Why Both?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sorted()&lt;/code&gt; is functional and flexible.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.sort()&lt;/code&gt; is efficient for large lists when mutation is acceptable.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ✅ Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Key Takeaway&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Type Checking&lt;/td&gt;
&lt;td&gt;Improves safety and tooling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duck Typing&lt;/td&gt;
&lt;td&gt;Behavior &amp;gt; Type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sets&lt;/td&gt;
&lt;td&gt;Unique, unordered, fast ops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lists, Dicts, Tuples&lt;/td&gt;
&lt;td&gt;Core data structures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dict vs JSON&lt;/td&gt;
&lt;td&gt;Dict = Python, JSON = format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;sorted()&lt;/code&gt; vs &lt;code&gt;.sort()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;New list vs in-place sort&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Why we need &lt;strong&gt;init&lt;/strong&gt;?
&lt;/h2&gt;

&lt;h4&gt;
  
  
  1. Purpose of &lt;strong&gt;init&lt;/strong&gt;.py
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;init&lt;/strong&gt;.py file in a directory tells Python that the directory should be treated as a package.&lt;/li&gt;
&lt;li&gt;This allows you to import modules from that directory using package syntax, e.g.:&lt;/li&gt;
&lt;li&gt;Without &lt;strong&gt;init&lt;/strong&gt;.py, Python (pre-3.3) would not recognize the folder as a package, and imports might fail.&lt;/li&gt;
&lt;li&gt;The file can be empty, or it can contain initialization code for the package.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Starting with Python 3.3 and above (including Python 3.11), you can technically remove the &lt;strong&gt;init&lt;/strong&gt;.py file from a package directory, and Python will still recognize it as a package due to "implicit namespace packages."&lt;/p&gt;

&lt;h4&gt;
  
  
  However, you should keep &lt;strong&gt;init&lt;/strong&gt;.py:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;When you add an &lt;strong&gt;init&lt;/strong&gt;.py file to a package directory, it does not create a global namespace. Instead, it defines a package namespace.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;All modules and submodules inside that package share the package’s namespace (e.g., tools_package.audio.utils).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This keeps your package’s contents organized and separate from the global namespace, preventing naming conflicts.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Module vs Package
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Module: A single Python file (e.g., utils.py). You import it like import utils or from utils import foo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Package: A directory containing an &lt;strong&gt;init&lt;/strong&gt;.py file and (usually) multiple modules (e.g., audio/ with &lt;strong&gt;init&lt;/strong&gt;.py and utils.py).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. What is &lt;strong&gt;pycache&lt;/strong&gt;?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;When you run or import Python code, Python compiles .py files to bytecode for faster execution.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The compiled bytecode files are stored in the &lt;strong&gt;pycache&lt;/strong&gt; directory, with names like utils.cpython-311.pyc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;cpython-311&lt;/strong&gt; means the file was compiled by CPython version 3.11.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;These .pyc files are used by Python to speed up future imports of the module.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. PIP (pip installs packages) (package Manager for Python):-
&lt;/h2&gt;

&lt;h4&gt;
  
  
  Using pip in a Python Virtual Environment
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;pip3&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;
&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="mf"&gt;24.2&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nf"&gt;pip &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="mf"&gt;3.12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;venv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;
&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="mf"&gt;24.2&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nf"&gt;pip &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="mf"&gt;3.12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Here you initialize a virtual environment named venv by using Python’s built-in venv module. &lt;/li&gt;
&lt;li&gt;After running the command above, Python creates a directory named venv/ in your current working directory. &lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then, you activate the virtual environment with the source command. - The parentheses (()) surrounding your venv name indicate that you successfully activated the virtual environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Finally, you check the version of the pip3 and pip executables inside your activated virtual environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Both point to the same pip module, so once your virtual environment is activated, you can use either pip or pip3.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Installing Packages With pip
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;
       &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;package_name&lt;/span&gt;
 &lt;span class="n"&gt;uninstall&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;
       &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;uninstall&lt;/span&gt; &lt;span class="n"&gt;package_name&lt;/span&gt;
 &lt;span class="nb"&gt;list&lt;/span&gt; &lt;span class="n"&gt;installed&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt;
       &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;
 &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;specific&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;
       &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;package_name&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="n"&gt;version_number&lt;/span&gt;
 &lt;span class="n"&gt;upgrade&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;
       &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;upgrade&lt;/span&gt; &lt;span class="n"&gt;package_name&lt;/span&gt;
 &lt;span class="n"&gt;show&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;information&lt;/span&gt;
       &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt; &lt;span class="n"&gt;package_name&lt;/span&gt;
 &lt;span class="n"&gt;search&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt;
       &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;search&lt;/span&gt; &lt;span class="n"&gt;package_name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using Requirements Files
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="n"&gt;requirement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;
       &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
 &lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;packages&lt;/span&gt; &lt;span class="n"&gt;installed&lt;/span&gt;
       &lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;freeze&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;certifi==x.y.z&lt;br&gt;
charset-normalizer==x.y.z&lt;br&gt;
idna==x.y.z&lt;br&gt;
&lt;strong&gt;requests&amp;gt;=x.y.z, &amp;lt;3.0&lt;/strong&gt;&lt;br&gt;
urllib3==x.y.z&lt;/p&gt;

&lt;p&gt;Changing the version specifier for the requests package ensures that any version greater than or equal to 3.0 doesn’t get installed.&lt;/p&gt;

&lt;h4&gt;
  
  
  very important
&lt;/h4&gt;

&lt;p&gt;We can create 3 files&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;requirements_dev.txt (For Development)&lt;/li&gt;
&lt;li&gt;requirements_prod.txt (For Production)&lt;/li&gt;
&lt;li&gt;requirements_lock.txt (After Development complete --&amp;gt; We will freeze it)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Uninstalling Packages With pip
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;show&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Name: requests&lt;br&gt;
Version: 2.32.3&lt;br&gt;
Summary: Python HTTP for Humans.&lt;br&gt;
Location: .../python3.12/site-packages&lt;br&gt;
&lt;strong&gt;Requires: certifi, idna, charset-normalizer, urllib3&lt;br&gt;
Required-by:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Notice the last two fields, Requires and Required-by. The show command tells you that requests requires certifi, idna, charset-normalizer, and urllib3. You probably want to uninstall those too. Notice that requests isn’t required by any other package.&lt;/li&gt;
&lt;li&gt;So it’s safe to uninstall it.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;uninstall&lt;/span&gt; &lt;span class="n"&gt;certifi&lt;/span&gt; &lt;span class="n"&gt;urllib3&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here you uninstall urllib3. Using the -y switch, you suppress the confirmation dialog asking you if you want to uninstall this package.&lt;/p&gt;

&lt;p&gt;In a single call, you can specify all the packages that you want to uninstall&lt;/p&gt;

&lt;p&gt;To create a &lt;strong&gt;virtual environment&lt;/strong&gt; in Python, you can use the built-in &lt;code&gt;venv&lt;/code&gt; module. A virtual environment is a self-contained directory that contains a Python installation for a particular version of Python, plus a number of additional packages.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Steps to Create and Use a Virtual Environment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔧 1. &lt;strong&gt;Create the Virtual Environment&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; venv myenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;python&lt;/code&gt;: Use &lt;code&gt;python3&lt;/code&gt; if you're on macOS/Linux and &lt;code&gt;python&lt;/code&gt; points to Python 2.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;myenv&lt;/code&gt;: This is the name of the virtual environment folder. You can name it anything.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  📂 2. &lt;strong&gt;Activate the Virtual Environment&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Windows:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;myenv&lt;span class="se"&gt;\S&lt;/span&gt;cripts&lt;span class="se"&gt;\a&lt;/span&gt;ctivate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;macOS/Linux:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source &lt;/span&gt;myenv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once activated, your terminal prompt will change to show the environment name, e.g., &lt;code&gt;(myenv)&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  📦 3. &lt;strong&gt;Install Packages Inside the Virtual Environment&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;requests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This installs &lt;code&gt;requests&lt;/code&gt; only inside &lt;code&gt;myenv&lt;/code&gt;, not globally.&lt;/p&gt;

&lt;h3&gt;
  
  
  ❌ 4. &lt;strong&gt;Deactivate the Virtual Environment&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;deactivate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This returns you to the global Python environment.&lt;/p&gt;




</description>
      <category>python</category>
      <category>programming</category>
    </item>
    <item>
      <title>Functional Programming In Python</title>
      <dc:creator>Ashutosh Sarangi</dc:creator>
      <pubDate>Fri, 19 Sep 2025 05:15:54 +0000</pubDate>
      <link>https://forem.com/ashutoshsarangi/functional-programming-in-python-cka</link>
      <guid>https://forem.com/ashutoshsarangi/functional-programming-in-python-cka</guid>
      <description>&lt;h2&gt;
  
  
  What Is Functional Programming?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A pure function is a function whose output value follows solely from its input values without any observable side effects.&lt;/li&gt;
&lt;li&gt;In functional programming, a program consists primarily of the evaluation of pure functions. &lt;/li&gt;
&lt;li&gt;Computation proceeds by nested or composed function calls without changes to state or mutable data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Python, functions are &lt;strong&gt;first-class citizens&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This means that functions have the same characteristics as values like strings and numbers. &lt;/li&gt;
&lt;li&gt;Anything you would expect to be able to do with a string or number, you can also do with a function.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;     &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I am function func()!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="bp"&gt;...&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;am&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;another_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;another_name&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;am&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;

&lt;span class="o"&gt;**&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;     &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I am function func()!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="bp"&gt;...&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="n"&gt;func&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0x7f81b4d29bf8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  function composition / Higher order functions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;When you pass a function to another function, the passed-in function is sometimes referred to as a &lt;strong&gt;callback&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;function can also specify another function as its return value
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;outer&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;         &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I am function inner()!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;     &lt;span class="c1"&gt;# Function outer() returns function inner()
&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;inner&lt;/span&gt;
&lt;span class="bp"&gt;...&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;outer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="n"&gt;outer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;locals&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inner&lt;/span&gt; &lt;span class="n"&gt;at&lt;/span&gt; &lt;span class="mh"&gt;0x7f18bc85faf0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;am&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;outer&lt;/span&gt;&lt;span class="p"&gt;()()&lt;/span&gt;
&lt;span class="n"&gt;I&lt;/span&gt; &lt;span class="n"&gt;am&lt;/span&gt; &lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Closure and bag Pack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python also supports closure and its bag pack concept (Lexical Persistent Reference value) L.P.R.V
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;outer&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;23&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; Inner&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;span class="n"&gt;inner_fun&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;outer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="nf"&gt;inner_fun&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Defining an Anonymous Function With lambda
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Functional programming is all about calling functions and passing them around, so it naturally involves defining a lot of functions. &lt;/li&gt;
&lt;li&gt;Sometimes, it’s convenient to be able to define an anonymous function on the fly without having to give it a name. In Python, you can do this with a &lt;strong&gt;lambda expression&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;parameter_list&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;expression&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# Self-invoking fun
&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;even&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;odd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[::&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I am a string&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gnirts a ma I&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Applying a Function to an Iterable With map()
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[::&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;animals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dog&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hedgehog&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gecko&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;animals&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Calling map() With Multiple Iterables
&lt;/h3&gt;

&lt;p&gt;map(, , , ..., )&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_three&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;


&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;add_three&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;#[111,222,333] (1, 10, 100), (2, 20, 200)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Selecting Elements From an Iterable With filter()
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;greater_than_100&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="bp"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;greater_than_100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;222&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;333&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;222&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;333&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Reducing an Iterable to a Single Value With reduce()
&lt;/h2&gt;

&lt;p&gt;reduce() applies a function to the items in an iterable two at a time, progressively combining them to produce a single result.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="bp"&gt;...&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;functools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nb"&gt;reduce&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="c1"&gt;# 15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Calling reduce() With an Initial Value
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;
&lt;span class="bp"&gt;...&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;functools&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nb"&gt;reduce&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# (100 + 1 + 2 + 3 + 4 + 5)
&lt;/span&gt;&lt;span class="mi"&gt;115&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>python</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>Python Metadata</title>
      <dc:creator>Ashutosh Sarangi</dc:creator>
      <pubDate>Wed, 17 Sep 2025 13:18:40 +0000</pubDate>
      <link>https://forem.com/ashutoshsarangi/python-metadata-4n70</link>
      <guid>https://forem.com/ashutoshsarangi/python-metadata-4n70</guid>
      <description>&lt;h2&gt;
  
  
  Cheat Sheet
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://realpython.com/cheatsheets/python/#getting-started" rel="noopener noreferrer"&gt;https://realpython.com/cheatsheets/python/#getting-started&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Basic
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Python Basic &lt;strong&gt;init&lt;/strong&gt; , &lt;strong&gt;pycache&lt;/strong&gt; &amp;amp; PIP

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ashutoshsarangi/python-basic-init-pycache-pip-3dkl"&gt;https://dev.to/ashutoshsarangi/python-basic-init-pycache-pip-3dkl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Intermediate
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Intermediate Python OOP For Gen AI

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ashutoshsarangi/intermediate-python-oop-for-gen-ai-2lim"&gt;https://dev.to/ashutoshsarangi/intermediate-python-oop-for-gen-ai-2lim&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Functional Programming In Python

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ashutoshsarangi/functional-programming-in-python-cka"&gt;https://dev.to/ashutoshsarangi/functional-programming-in-python-cka&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Unit Testing

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ashutoshsarangi/writing-unit-tests-for-python-code-unittest-doctest-iob"&gt;https://dev.to/ashutoshsarangi/writing-unit-tests-for-python-code-unittest-doctest-iob&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Advanced
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Advanced Python Concepts 

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ashutoshsarangi/advanced-python-concepts-3ci8"&gt;https://dev.to/ashutoshsarangi/advanced-python-concepts-3ci8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Python Performance Optimization: Detailed Guide

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ashutoshsarangi/python-performance-optimization-detailed-guide-5739"&gt;https://dev.to/ashutoshsarangi/python-performance-optimization-detailed-guide-5739&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Specialization
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;will update soon 

&lt;ul&gt;
&lt;li&gt;link&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Folder Structure

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ashutoshsarangi/python-project-folder-structure-for-a-genai-application-13kc"&gt;https://dev.to/ashutoshsarangi/python-project-folder-structure-for-a-genai-application-13kc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>python</category>
      <category>genai</category>
    </item>
    <item>
      <title>Python project folder structure for a GenAI application</title>
      <dc:creator>Ashutosh Sarangi</dc:creator>
      <pubDate>Wed, 17 Sep 2025 11:42:00 +0000</pubDate>
      <link>https://forem.com/ashutoshsarangi/python-project-folder-structure-for-a-genai-application-13kc</link>
      <guid>https://forem.com/ashutoshsarangi/python-project-folder-structure-for-a-genai-application-13kc</guid>
      <description>&lt;h2&gt;
  
  
  📁 Project Structure Overview
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;genai_app/
│
├── app/
│   ├── __init__.py
│   ├── main.py               # FastAPI app entry point
│   ├── config.py             # Environment/config settings
│   ├── models/               # Pydantic models and data schemas
│   │   └── genai.py
│   ├── services/             # Core GenAI logic (e.g., LangChain, transformers)
│   │   └── genai_service.py
│   ├── api/                  # Route definitions
│   │   ├── __init__.py
│   │   └── genai_routes.py
│   ├── utils/                # Helper functions, logging, etc.
│   │   └── helpers.py
│   └── middleware/           # Custom middleware (e.g., logging, auth)
│       └── auth.py
│
├── tests/                    # Unit and integration tests
│   ├── __init__.py
│   └── test_genai.py
│
├── requirements.txt          # Python dependencies
├── .env                      # Environment variables
├── README.md                 # Project documentation
└── run.sh                    # Shell script to run the app with Uvicorn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 Key Components Explained
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;main.py&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.api.genai_routes&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai_router&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GenAI FastAPI App&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include_router&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;genai_router&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;genai_routes.py&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;APIRouter&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.services.genai_service&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;generate_response&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;app.models.genai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;GenAIRequest&lt;/span&gt;

&lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;APIRouter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@router.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/generate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;GenAIRequest&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;generate_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;genai_service.py&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Call to GenAI model (e.g., OpenAI, HuggingFace, LangChain)
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Generated text for: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧪 Running the App
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;run.sh&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
uvicorn app.main:app &lt;span class="nt"&gt;--reload&lt;/span&gt; &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 Optional Enhancements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker support&lt;/strong&gt;: Add &lt;code&gt;Dockerfile&lt;/code&gt; and &lt;code&gt;docker-compose.yml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Async support&lt;/strong&gt;: Use &lt;code&gt;async def&lt;/code&gt; in routes and services&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model integration&lt;/strong&gt;: Add HuggingFace or OpenAI SDK in &lt;code&gt;genai_service.py&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LangGraph or LangChain&lt;/strong&gt;: Integrate in &lt;code&gt;services/&lt;/code&gt; for advanced workflows&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>python</category>
      <category>genai</category>
    </item>
  </channel>
</rss>
