<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title>Real Python</title>
  <link href="https://realpython.com/atom.xml" rel="self"/>
  <link href="https://realpython.com/"/>
  <updated>2026-05-06T14:00:00+00:00</updated>
  <id>https://realpython.com/</id>
  <author>
    <name>Real Python</name>
  </author>

  
    <entry>
      <title>ChatterBot: Build a Chatbot With Python</title>
      <id>https://realpython.com/build-a-chatbot-python-chatterbot/</id>
      <link href="https://realpython.com/build-a-chatbot-python-chatterbot/"/>
      <updated>2026-05-06T14:00:00+00:00</updated>
      <summary>Build a Python chatbot with the ChatterBot library. Clean real conversation data, train on custom datasets, and add local AI with Ollama.</summary>
      <content type="html">
        &lt;div&gt;&lt;p&gt;The Python ChatterBot library lets you build a self-learning command-line chatbot with just a few lines of code. You’ll set up a basic bot, clean real WhatsApp conversation data with regular expressions, and train your chatbot on that custom corpus. You’ll also plug in a local LLM through Ollama to augment its replies with contextual knowledge.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;By the end of this tutorial, you’ll understand that:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatterBot is a &lt;strong&gt;Python library&lt;/strong&gt; that combines text processing, machine learning, and a local database to generate chatbot replies.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;minimal ChatterBot script&lt;/strong&gt; instantiates &lt;code&gt;ChatBot&lt;/code&gt;, collects user input in a loop, and returns matching responses through &lt;code&gt;.get_response()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Training with &lt;code&gt;ListTrainer&lt;/code&gt; and default settings stores conversation pairs in a &lt;strong&gt;SQLite&lt;/strong&gt; database that ChatterBot queries with &lt;strong&gt;Levenshtein distance&lt;/strong&gt; to pick each reply.&lt;/li&gt;
&lt;li&gt;ChatterBot can call a &lt;strong&gt;local LLM&lt;/strong&gt; through &lt;code&gt;OllamaLogicAdapter&lt;/code&gt;, voting against other logic adapters with a confidence score.&lt;/li&gt;
&lt;li&gt;ChatterBot was &lt;strong&gt;revived in 2025&lt;/strong&gt; with spaCy-based &lt;a href=&quot;/ref/ai-coding-glossary/nlp/&quot; class=&quot;ref-link&quot;&gt;NLP&lt;/a&gt;, CSV and JSON trainers, and experimental &lt;a href=&quot;/ref/ai-coding-glossary/llm/&quot; class=&quot;ref-link&quot;&gt;LLM&lt;/a&gt; support.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Along the way, you’ll move from a potted plant that can only echo &lt;em&gt;hello&lt;/em&gt; to a chatbot that chats knowledgeably about houseplants. You can follow along with your own WhatsApp export or grab the provided sample data below.&lt;/p&gt;
&lt;div class=&quot;alert alert-warning&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong markdown&gt;Get Your Code:&lt;/strong&gt; &lt;a href=&quot;https://realpython.com/bonus/build-a-chatbot-python-chatterbot-code/&quot; class=&quot;alert-link&quot; data-toggle=&quot;modal&quot; data-target=&quot;#modal-build-a-chatbot-python-chatterbot-code&quot; markdown&gt;Click here to download the free sample code&lt;/a&gt; that you’ll use to build a chatbot with Python’s Chatterbot.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;container border rounded text-wrap-pretty my-3&quot;&gt;

  &lt;p class=&quot;my-3&quot;&gt;&lt;mark class=&quot;marker-highlight&quot;&gt;&lt;strong&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@quiz&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt; Take the Quiz:&lt;/strong&gt;&lt;/mark&gt; Test your knowledge with our interactive “ChatterBot: Build a Chatbot With Python” quiz. You’ll receive a score upon completion to help you track your learning progress:&lt;/p&gt;

  &lt;hr&gt;

  &lt;div class=&quot;row my-3&quot;&gt;
    &lt;div class=&quot;col-xs-12 col-sm-4 col-md-3 align-self-center&quot;&gt;

      &lt;a href=&quot;/quizzes/build-a-chatbot-python-chatterbot/&quot; tabindex=&quot;-1&quot;&gt;
        &lt;div class=&quot;embed-responsive embed-responsive-16by9&quot;&gt;

            &lt;img class=&quot;card-img-top m-0 p-0 embed-responsive-item rounded&quot; style=&quot;object-fit: contain; background: #ffc774;&quot; alt=&quot;ChatterBot: Build a Chatbot With Python&quot; src=&quot;https://files.realpython.com/media/Chatterbot-Build-a-Chatbot-With-Python_Watermarked.07a26197ef70.jpg&quot; width=&quot;1920&quot; height=&quot;1080&quot; srcset=&quot;/cdn-cgi/image/width=480,format=auto/https://files.realpython.com/media/Chatterbot-Build-a-Chatbot-With-Python_Watermarked.07a26197ef70.jpg 480w, /cdn-cgi/image/width=640,format=auto/https://files.realpython.com/media/Chatterbot-Build-a-Chatbot-With-Python_Watermarked.07a26197ef70.jpg 640w, /cdn-cgi/image/width=960,format=auto/https://files.realpython.com/media/Chatterbot-Build-a-Chatbot-With-Python_Watermarked.07a26197ef70.jpg 960w, /cdn-cgi/image/width=1920,format=auto/https://files.realpython.com/media/Chatterbot-Build-a-Chatbot-With-Python_Watermarked.07a26197ef70.jpg 1920w&quot; sizes=&quot;(min-width: 1200px) 142px, (min-width: 1000px) 122px, (min-width: 780px) 112px, (min-width: 580px) 139px, calc(100vw - 62px)&quot;&gt;


          &lt;div class=&quot;card-img-overlay d-flex align-items-center&quot;&gt;
            &lt;div class=&quot;mx-auto&quot;&gt;
              &lt;span class=&quot;text-light&quot; style=&quot;opacity: 0.90;&quot;&gt;&lt;span class=&quot;icon baseline scale2x&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@quiz&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/a&gt;

    &lt;/div&gt;
    &lt;div class=&quot;col&quot;&gt;
      &lt;div class=&quot;mt-3 d-md-none&quot;&gt;&lt;/div&gt; 
      &lt;p class=&quot;small text-muted mb-0&quot;&gt;&lt;strong&gt;Interactive Quiz&lt;/strong&gt;&lt;/p&gt;
      &lt;a href=&quot;/quizzes/build-a-chatbot-python-chatterbot/&quot; class=&quot;stretched-link&quot;&gt;&lt;span class=&quot;my-0 h4&quot;&gt;ChatterBot: Build a Chatbot With Python&lt;/span&gt;&lt;/a&gt; 
      &lt;p class=&quot;text-muted mb-0 small&quot;&gt;Test your understanding of the ChatterBot Python library, from training a basic bot with ListTrainer to wiring in a local LLM through Ollama.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;

&lt;/div&gt;

&lt;h2 id=&quot;preview-the-chatbot&quot;&gt;Preview the Chatbot&lt;a class=&quot;headerlink&quot; href=&quot;#preview-the-chatbot&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;At the end of this tutorial, you’ll have a command-line chatbot that can respond to your inputs with semi-meaningful replies:&lt;/p&gt;
&lt;figure&gt;
  &lt;div class=&quot;embed-responsive embed-responsive-16by9 rounded mb-3 &quot;&gt;
    &lt;iframe loading=&quot;lazy&quot; class=&quot;embed-responsive-item&quot; src=&quot;https://player.vimeo.com/video/1184820305&quot; frameborder=&quot;0&quot; allow=&quot;fullscreen&quot; allowfullscreen&gt;&lt;/iframe&gt;
  &lt;/div&gt;

&lt;/figure&gt;

&lt;p&gt;You’ll achieve that by preparing WhatsApp chat data and using it to train the chatbot. Beyond learning from your automated training, the chatbot will improve over time as it gets more exposure to questions and replies from user interactions.&lt;/p&gt;
&lt;h2 id=&quot;project-overview&quot;&gt;Project Overview&lt;a class=&quot;headerlink&quot; href=&quot;#project-overview&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.chatterbot.us/&quot;&gt;The ChatterBot library&lt;/a&gt; combines text processing, &lt;a href=&quot;/ref/ai-coding-glossary/machine-learning/&quot; class=&quot;ref-link&quot;&gt;machine learning&lt;/a&gt; algorithms, and data storage and retrieval to allow you to build flexible chatbots.&lt;/p&gt;
&lt;p&gt;You can build an industry-specific chatbot by training it with relevant data. Additionally, the chatbot will remember user responses and continue building its internal &lt;a href=&quot;https://en.wikipedia.org/wiki/Graph_(abstract_data_type)&quot;&gt;graph structure&lt;/a&gt; to improve the responses that it can give.&lt;/p&gt;
&lt;div class=&quot;alert alert-primary&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; After a long hiatus, ChatterBot was revived in early 2025 with support for modern Python, new training formats for &lt;a href=&quot;https://realpython.com/python-csv/&quot;&gt;CSV&lt;/a&gt; and &lt;a href=&quot;https://realpython.com/python-json/&quot;&gt;JSON&lt;/a&gt; data, and even experimental LLM integration. Under the hood, ChatterBot now uses &lt;a href=&quot;https://spacy.io/&quot;&gt;spaCy&lt;/a&gt; for language processing, which gives it a more robust &lt;a href=&quot;https://realpython.com/natural-language-processing-spacy-python/&quot;&gt;NLP pipeline&lt;/a&gt; than before.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If you want to develop an LLM-first chatbot, Real Python’s LLM Application Development With Python learning path takes you through the concepts and libraries step by step:&lt;/p&gt;
&lt;div&gt;


&lt;learning-path-card data-path-id=&quot;llm-application-development-python&quot; class=&quot;d-block container border rounded mb-4 shadow-sm&quot; data-progress-card&gt;
  &lt;div class=&quot;row my-3&quot;&gt;
    &lt;div class=&quot;col-xs-12 col-sm-4 col-md-3 align-self-center px-3&quot;&gt;

        &lt;a href=&quot;/learning-paths/llm-application-development-python/&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; data-not-previewable&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://files.realpython.com/media/LLM-Application-Development-With-Python_Watermarked.b05c360e7536.jpg&quot; srcset=&quot;/cdn-cgi/image/width=480,format=auto/https://files.realpython.com/media/LLM-Application-Development-With-Python_Watermarked.b05c360e7536.jpg 480w, /cdn-cgi/image/width=640,format=auto/https://files.realpython.com/media/LLM-Application-Development-With-Python_Watermarked.b05c360e7536.jpg 640w, /cdn-cgi/image/width=960,format=auto/https://files.realpython.com/media/LLM-Application-Development-With-Python_Watermarked.b05c360e7536.jpg 960w, /cdn-cgi/image/width=1920,format=auto/https://files.realpython.com/media/LLM-Application-Development-With-Python_Watermarked.b05c360e7536.jpg 1920w&quot; style=&quot;background: #fe7e73;&quot; class=&quot;rounded img-fluid w-100 my-0&quot; alt=&quot;Two people operating a large machine with conveyor belts and panels labeled RAG, Agents, and MCP, alongside a robotic arm, a Python logo, and API key icons.&quot; sizes=&quot;(min-width: 1200px) 142px, (min-width: 1000px) 122px, (min-width: 780px) 112px, (min-width: 580px) 139px, calc(100vw - 62px)&quot;&gt;&lt;/a&gt;

    &lt;/div&gt;
    &lt;div class=&quot;col px-3 pl-sm-0 mt-3 mt-sm-0&quot;&gt;
      &lt;p class=&quot;small text-muted mb-0&quot;&gt;&lt;strong&gt;Learning Path&lt;/strong&gt;&lt;/p&gt;
      &lt;a class=&quot;stretched-link&quot; href=&quot;/learning-paths/llm-application-development-python/&quot;&gt;&lt;h2 class=&quot;my-0 h3&quot;&gt;LLM Application Development With Python&lt;/h2&gt;&lt;/a&gt;
      &lt;p class=&quot;text-muted mb-0 small&quot;&gt;13 Resources ⋅ &lt;strong&gt;Skills:&lt;/strong&gt; OpenAI, Ollama, OpenRouter, Prompt Engineering, LangChain, LlamaIndex, ChromaDB, MarkItDown, RAG, Embeddings, Pydantic AI, LangGraph, MCP&lt;/p&gt;


      &lt;div class=&quot;progress mt-2&quot; data-progress-placeholder&gt;
        &lt;div class=&quot;progress-bar bg-light text-black-50 small w-100&quot; data-progress-placeholder-bar&gt;&lt;/div&gt;
      &lt;/div&gt;


      &lt;div class=&quot;progress mt-2 d-none&quot; data-progress-container&gt;
        &lt;div class=&quot;progress-bar small&quot; role=&quot;progressbar&quot; data-progress-bar aria-valuenow=&quot;0&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot; style=&quot;min-width: 2.5em; cursor: default;&quot;&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/learning-path-card&gt;
&lt;/div&gt;

&lt;p&gt;In this tutorial, you’ll start with an untrained chatbot that’ll showcase how quickly you can create an interactive chatbot using Python’s ChatterBot. You’ll also notice how small the vocabulary of an untrained chatbot is.&lt;/p&gt;
&lt;p&gt;Next, you’ll learn how you can train such a chatbot and check on the slightly improved results. The more plentiful and high-quality your training data is, the better your chatbot’s responses will be.&lt;/p&gt;
&lt;p&gt;Therefore, you’ll either fetch the conversation history of one of your WhatsApp chats or use the provided &lt;code&gt;chat.txt&lt;/code&gt; file that you can download here:&lt;/p&gt;
&lt;div class=&quot;alert alert-warning&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong markdown&gt;Get Your Code:&lt;/strong&gt; &lt;a href=&quot;https://realpython.com/bonus/build-a-chatbot-python-chatterbot-code/&quot; class=&quot;alert-link&quot; data-toggle=&quot;modal&quot; data-target=&quot;#modal-build-a-chatbot-python-chatterbot-code&quot; markdown&gt;Click here to download the free sample code&lt;/a&gt; that you’ll use to build a chatbot with Python’s Chatterbot.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;It’s rare that input data comes exactly in the form you need, so you’ll clean the chat export data to get it into a useful input format. This process will show you some tools you can use for data cleaning, which may help you prepare other input data to feed to your chatbot.&lt;/p&gt;
&lt;p&gt;After data cleaning, you’ll retrain your chatbot and give it another spin to experience the improved performance. Finally, you’ll hook a local LLM into your chatbot to augment the variety and contextual relevance of its responses.&lt;/p&gt;
&lt;p&gt;When you work through this process from start to finish, you’ll get a good idea of how you can build and train a Python chatbot with the ChatterBot library so that it can provide an interactive experience with relevant replies.&lt;/p&gt;
&lt;h2 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;a class=&quot;headerlink&quot; href=&quot;#prerequisites&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Before you get started, make sure that you have &lt;strong&gt;Python 3.10 or later&lt;/strong&gt; installed, which is the minimum Python version that ChatterBot supports. If you need help setting up Python, check out &lt;a href=&quot;https://realpython.com/installing-python/&quot;&gt;Python 3 Installation &amp;amp; Setup Guide&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;&lt;h2&gt;&lt;a href=&quot;https://realpython.com/build-a-chatbot-python-chatterbot/?utm_source=realpython&amp;utm_medium=rss&quot;&gt;Read the full article at https://realpython.com/build-a-chatbot-python-chatterbot/ »&lt;/a&gt;&lt;/h2&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Quiz: Python &amp; APIs: A Winning Combo for Reading Public Data</title>
      <id>https://realpython.com/quizzes/python-api/</id>
      <link href="https://realpython.com/quizzes/python-api/"/>
      <updated>2026-05-06T12:00:00+00:00</updated>
      <summary>Test your understanding of working with web APIs in Python, from reading responses and handling status codes to authentication and rate limiting.</summary>
      <content type="html">
        &lt;p&gt;In this quiz, you&amp;rsquo;ll test your understanding of
&lt;a href=&quot;https://realpython.com/python-api/&quot;&gt;Python &amp;amp; APIs: A Winning Combo for Reading Public Data&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By working through this quiz, you&amp;rsquo;ll revisit how APIs send requests and responses, how the &lt;code&gt;requests&lt;/code&gt; library works, what status codes and headers mean, and how to handle authentication, pagination, and rate limits in your own code.&lt;/p&gt;
&lt;p&gt;Good luck!&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Quiz: How to Use OpenCode for AI-Assisted Python Coding</title>
      <id>https://realpython.com/quizzes/opencode-guide/</id>
      <link href="https://realpython.com/quizzes/opencode-guide/"/>
      <updated>2026-05-06T12:00:00+00:00</updated>
      <summary>Quiz yourself on OpenCode: install it, connect an AI provider, and use it to analyze and refactor Python from your terminal.</summary>
      <content type="html">
        &lt;p&gt;In this quiz, you&amp;rsquo;ll test your understanding of
&lt;a href=&quot;https://realpython.com/opencode-guide/&quot;&gt;How to Use OpenCode for AI-Assisted Python Coding&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By working through these questions, you&amp;rsquo;ll revisit how to install OpenCode,
connect it to an AI provider, configure project context with &lt;code&gt;AGENTS.md&lt;/code&gt;, and take advantage of features
like mid-session model switching and built-in language servers.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;d like a broader look at AI-assisted Python development, you can also
follow the &lt;a href=&quot;https://realpython.com/learning-paths/coding-with-ai/&quot;&gt;Python Coding With AI&lt;/a&gt; learning path.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Use Codex CLI to Enhance Your Python Projects</title>
      <id>https://realpython.com/courses/use-codex-cli-enhance-your-python-projects/</id>
      <link href="https://realpython.com/courses/use-codex-cli-enhance-your-python-projects/"/>
      <updated>2026-05-05T14:00:00+00:00</updated>
      <summary>Learn how to use Codex CLI to add features to Python projects directly from your terminal, without needing a browser or IDE plugins.</summary>
      <content type="html">
        &lt;p&gt;After watching this video course, you&amp;rsquo;ll be able to use Codex CLI to add features to a Python project directly from your terminal. &lt;strong&gt;Codex CLI&lt;/strong&gt; is an AI-powered coding assistant that runs inside your terminal. It understands your project structure, reads your files, and proposes multi-file changes using natural language instructions.&lt;/p&gt;
&lt;p&gt;Instead of copying code from a browser or relying on an IDE plugin, you&amp;rsquo;ll use Codex CLI to implement a real feature in a multi-file Python project directly from your terminal.&lt;/p&gt;
&lt;p&gt;In the following lessons, you&amp;rsquo;ll install and configure Codex CLI, use it to implement a deletion feature in a contact book app, and then refine that feature through iterative prompting.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Quiz: Python Application Layouts: A Reference</title>
      <id>https://realpython.com/quizzes/python-application-layouts/</id>
      <link href="https://realpython.com/quizzes/python-application-layouts/"/>
      <updated>2026-05-05T12:00:00+00:00</updated>
      <summary>Test your knowledge of Python project layouts for one-off scripts, installable packages, internal packages, and Django and Flask web applications.</summary>
      <content type="html">
        &lt;p&gt;In this quiz, you&amp;rsquo;ll test your understanding of
&lt;a href=&quot;https://realpython.com/python-application-layouts/&quot;&gt;Python Application Layouts: A Reference&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By working through this quiz, you&amp;rsquo;ll revisit how to structure one-off scripts,
installable packages, larger applications with internal packages, and web projects
built with Django or Flask.&lt;/p&gt;
&lt;p&gt;A dependable starting layout helps you avoid coder&amp;rsquo;s block
so you can focus on writing code instead of figuring out where it should live.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>A New Python Packaging Council and Other News for May 2026</title>
      <id>https://realpython.com/python-news-may-2026/</id>
      <link href="https://realpython.com/python-news-may-2026/"/>
      <updated>2026-05-04T14:00:00+00:00</updated>
      <summary>A new Python Packaging Council, PEP 803 stabilizes the free-threaded ABI, the incremental GC gets reverted, and Astral changes hands.</summary>
      <content type="html">
        &lt;div&gt;&lt;p&gt;April gave Python developers a new governing body. &lt;a href=&quot;https://peps.python.org/pep-0772/&quot;&gt;PEP 772&lt;/a&gt; was accepted on April 16, creating a dedicated &lt;strong&gt;Python Packaging Council&lt;/strong&gt; that will make binding decisions about packaging standards and tools. After years of informal coordination through the Python Packaging Authority (PyPA), the packaging community now has its own elected five-member council with authority comparable to the &lt;a href=&quot;/ref/glossary/python-steering-council/&quot; class=&quot;ref-link&quot;&gt;Steering Council&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On the release side, &lt;strong&gt;Python 3.15.0 alpha 8&lt;/strong&gt; dropped with a refreshed &lt;a href=&quot;/ref/glossary/jit-compiler/&quot; class=&quot;ref-link&quot;&gt;JIT&lt;/a&gt; delivering &lt;strong&gt;6–7 percent speedups on x86-64 Linux&lt;/strong&gt; and &lt;strong&gt;12–13 percent on AArch64 macOS&lt;/strong&gt;. The core team also decided to &lt;strong&gt;revert 3.14’s incremental garbage collector&lt;/strong&gt; after production reports of runaway memory use, with the fix landing in the upcoming 3.14.5 patch release. The next pre-release is the first beta, scheduled for &lt;strong&gt;May 5&lt;/strong&gt;, which marks the feature freeze for Python 3.15.&lt;/p&gt;
&lt;p&gt;Elsewhere, Google released the open-weights &lt;strong&gt;Gemma 4&lt;/strong&gt; family, &lt;strong&gt;Starlette 1.0&lt;/strong&gt; shipped for FastAPI’s foundation, and the broader Python ecosystem absorbed the news that &lt;strong&gt;OpenAI acquired Astral&lt;/strong&gt;, the company behind &lt;code&gt;uv&lt;/code&gt;, Ruff, and ty. Get ready to dig into the biggest Python news from the past month!&lt;/p&gt;
&lt;div class=&quot;alert alert-warning&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong markdown&gt;Join Now:&lt;/strong&gt; &lt;a href=&quot;https://realpython.com/bonus/newsletter/&quot; class=&quot;alert-link&quot; data-toggle=&quot;modal&quot; data-target=&quot;#modal-newsletter&quot; markdown&gt;Click here to join the Real Python Newsletter&lt;/a&gt; and you’ll never miss another Python tutorial, course, or news update.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;python-releases-and-pep-highlights&quot;&gt;Python Releases and PEP Highlights&lt;a class=&quot;headerlink&quot; href=&quot;#python-releases-and-pep-highlights&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;April pushed Python 3.15 to its final alpha before the beta freeze, walked back the incremental garbage collector introduced in 3.14, and gave the Steering Council a busy month of PEP decisions. The packaging community even got its own elected governing body for the first time. Plenty to unpack on the language and process side of the ecosystem.&lt;/p&gt;
&lt;h3 id=&quot;python-3150-alpha-8-final-alpha-before-beta-freeze&quot;&gt;Python 3.15.0 Alpha 8: Final Alpha Before Beta Freeze&lt;a class=&quot;headerlink&quot; href=&quot;#python-3150-alpha-8-final-alpha-before-beta-freeze&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.python.org/2026/04/python-3150a8-3144-31313/&quot;&gt;Python 3.15.0a8&lt;/a&gt; landed on April 7, released alongside maintenance updates &lt;strong&gt;3.14.4&lt;/strong&gt; and &lt;strong&gt;3.13.13&lt;/strong&gt;. Release manager Hugo van Kemenade confirmed that a8 is the &lt;strong&gt;final alpha&lt;/strong&gt; before the beta phase begins. If you maintain a library, this is the last alpha where you can file an issue against an unreleased feature and reasonably expect it to land before the freeze.&lt;/p&gt;
&lt;p&gt;Alpha 8 consolidates a long list of &lt;a href=&quot;/ref/glossary/pep/&quot; class=&quot;ref-link&quot;&gt;PEPs&lt;/a&gt; you’ve been hearing about in earlier alphas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0810/&quot;&gt;PEP 810&lt;/a&gt;: Explicit lazy imports, which we covered &lt;a href=&quot;https://realpython.com/python-news-april-2026/#python-3150-alpha-7-lazy-imports-land&quot;&gt;last month&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0814/&quot;&gt;PEP 814&lt;/a&gt;: &lt;code&gt;frozendict&lt;/code&gt; as a built-in type&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0799/&quot;&gt;PEP 799&lt;/a&gt;: Statistical sampling profiler&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0798/&quot;&gt;PEP 798&lt;/a&gt;: Unpacking in comprehensions&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0686/&quot;&gt;PEP 686&lt;/a&gt;: UTF-8 as the default encoding&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://peps.python.org/pep-0728/&quot;&gt;PEP 728&lt;/a&gt;: TypedDict enhancements&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The headline number is the &lt;a href=&quot;/ref/glossary/jit-compiler/&quot; class=&quot;ref-link&quot;&gt;JIT&lt;/a&gt; performance jump. On x86-64 Linux, the alpha reports a &lt;strong&gt;6–7 percent geometric mean improvement&lt;/strong&gt; over the standard &lt;a href=&quot;/ref/glossary/interpreter/&quot; class=&quot;ref-link&quot;&gt;interpreter&lt;/a&gt;. On AArch64 macOS, the gain is &lt;strong&gt;12–13 percent&lt;/strong&gt; over the tail-calling interpreter introduced in 3.14. Those aren’t microbenchmark curiosities. They’re cumulative gains across a broad suite of workloads.&lt;/p&gt;
&lt;div class=&quot;alert alert-primary&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you haven’t tried the alpha yet, installing it in an isolated environment is a good idea. Running &lt;code&gt;uv python install 3.15.0a8&lt;/code&gt; pulls the binary, and &lt;a href=&quot;https://realpython.com/intro-to-pyenv/&quot;&gt;pyenv&lt;/a&gt; handles alpha builds too. The next pre-release, &lt;strong&gt;3.15.0 beta 1&lt;/strong&gt;, is scheduled for &lt;strong&gt;May 5&lt;/strong&gt;, which marks the feature freeze. After that, no new PEPs land in 3.15.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id=&quot;incremental-gc-reverted-in-3145-and-315&quot;&gt;Incremental GC Reverted in 3.14.5 and 3.15&lt;a class=&quot;headerlink&quot; href=&quot;#incremental-gc-reverted-in-3145-and-315&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;On April 16, release manager Hugo van Kemenade &lt;a href=&quot;https://discuss.python.org/t/reverting-the-incremental-gc-in-python-3-14-and-3-15/107014&quot;&gt;proposed reverting&lt;/a&gt; the incremental &lt;a href=&quot;/ref/glossary/garbage-collection/&quot; class=&quot;ref-link&quot;&gt;garbage collector&lt;/a&gt; that debuted in Python 3.14, and the core team agreed. The revert will ship in &lt;strong&gt;Python 3.14.5&lt;/strong&gt; and also make it into 3.15 before feature freeze.&lt;/p&gt;
&lt;p&gt;The reasoning is practical. Neil Schemenauer’s testing on production workloads showed that the incremental collector cut maximum pause times from &lt;strong&gt;26 ms down to 1.3 ms&lt;/strong&gt;, which looks great on paper. But peak memory usage climbed to as much as &lt;strong&gt;5x&lt;/strong&gt; the generational baseline in the worst case, and total runtime went up, not down, because of the extra bookkeeping.&lt;/p&gt;
&lt;p&gt;For most Python programs, like web apps, data pipelines, and batch jobs, reducing long pauses isn’t the win that matters. Memory pressure is.&lt;/p&gt;
&lt;p&gt;The unusual part is doing this in a patch release. The working assumption during 3.14’s release cycle was that the incremental GC had earned its place. Rolling it back in 3.14.5 is a reminder that “passed the benchmark suite” and “works in production” aren’t the same thing. If you noticed your 3.14 deployments using noticeably more memory than 3.13, this is almost certainly why, and 3.14.5 should give you the old behavior back.&lt;/p&gt;
&lt;div class=&quot;alert alert-primary&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The incremental approach isn’t dead. The core team noted that it could return in Python 3.16 through a proper &lt;a href=&quot;https://peps.python.org/&quot;&gt;PEP&lt;/a&gt; review process, which the original implementation had skipped. If you were on the fence about the switch, waiting for the formal design round is probably the right call.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id=&quot;pep-772-accepted-python-gets-a-packaging-council&quot;&gt;PEP 772 Accepted: Python Gets a Packaging Council&lt;a class=&quot;headerlink&quot; href=&quot;#pep-772-accepted-python-gets-a-packaging-council&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;On April 16, the &lt;a href=&quot;/ref/glossary/psf/&quot; class=&quot;ref-link&quot;&gt;Python Software Foundation (PSF)&lt;/a&gt; and the Steering Council accepted &lt;a href=&quot;https://peps.python.org/pep-0772/&quot;&gt;PEP 772&lt;/a&gt;, which creates a &lt;strong&gt;five-member Packaging Council&lt;/strong&gt; with broad authority over packaging standards, tools, and implementations. It’s one of the biggest governance changes the ecosystem has seen since the Steering Council itself was established back in 2019.&lt;/p&gt;
&lt;p&gt;Council members will be &lt;strong&gt;elected by PSF voting members&lt;/strong&gt; who opt into the election. The council runs on staggered two-year terms, with two seats and three seats rotating in different cycles to preserve institutional continuity. Decision-making emphasizes &lt;strong&gt;consensus over voting&lt;/strong&gt;, following the same pattern that has worked for the Steering Council.&lt;/p&gt;
&lt;p&gt;The practical impact is that a formal, elected body now owns decisions about tools like &lt;a href=&quot;/ref/glossary/pip/&quot; class=&quot;ref-link&quot;&gt;&lt;code&gt;pip&lt;/code&gt;&lt;/a&gt;, &lt;code&gt;setuptools&lt;/code&gt;, and &lt;a href=&quot;https://realpython.com/pypi-publish-python-package/&quot;&gt;PyPI&lt;/a&gt;, replacing the ambiguous delegation model defined in PEP 609.&lt;/p&gt;
&lt;p&gt;If you’ve ever wondered why packaging decisions in Python sometimes feel stuck in committee, PEP 772 is the structural answer to that complaint. It also sets the stage for the council to weigh in on &lt;a href=&quot;/ref/ai-coding-glossary/llm/&quot; class=&quot;ref-link&quot;&gt;LLM&lt;/a&gt;-era packaging concerns, which are popping up faster than the PyPA’s informal coordination could address them.&lt;/p&gt;
&lt;h3 id=&quot;pep-803-accepted-stable-abi-goes-free-threaded&quot;&gt;PEP 803 Accepted: Stable ABI Goes Free-Threaded&lt;a class=&quot;headerlink&quot; href=&quot;#pep-803-accepted-stable-abi-goes-free-threaded&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://peps.python.org/pep-0803/&quot;&gt;PEP 803&lt;/a&gt; was accepted on March 30 and targets Python 3.15. It defines &lt;strong&gt;&lt;code&gt;abi3t&lt;/code&gt;&lt;/strong&gt;, a new variant of the stable ABI that works with free-threaded builds. When the Steering Council accepted &lt;a href=&quot;https://peps.python.org/pep-0779/&quot;&gt;PEP 779&lt;/a&gt; last year, it promised &lt;a href=&quot;https://realpython.com/python-news-july-2025/#python-314-beta-3-lands-free-threaded-support&quot;&gt;free-threading&lt;/a&gt; would get a proper stable ABI story for 3.15. PEP 803 is that follow-through.&lt;/p&gt;
&lt;/div&gt;&lt;h2&gt;&lt;a href=&quot;https://realpython.com/python-news-may-2026/?utm_source=realpython&amp;utm_medium=rss&quot;&gt;Read the full article at https://realpython.com/python-news-may-2026/ »&lt;/a&gt;&lt;/h2&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Quiz: Data Management With Python, SQLite, and SQLAlchemy</title>
      <id>https://realpython.com/quizzes/python-sqlite-sqlalchemy/</id>
      <link href="https://realpython.com/quizzes/python-sqlite-sqlalchemy/"/>
      <updated>2026-05-04T12:00:00+00:00</updated>
      <summary>Test your knowledge of SQLite and SQLAlchemy in Python, from flat files and SQL to ORM models and many-to-many relationships.</summary>
      <content type="html">
        &lt;p&gt;In this quiz, you&amp;rsquo;ll test your understanding of the tutorial &lt;a href=&quot;https://realpython.com/python-sqlite-sqlalchemy/&quot;&gt;Data Management With Python, SQLite, and SQLAlchemy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By working through this quiz, you&amp;rsquo;ll revisit how Python, SQLite, and SQLAlchemy work together to give your programs reliable data storage.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll also check your grasp of primary and foreign keys, SQL operations, and the SQLAlchemy models that let you work with your data as Python objects.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Quiz: Revisit Python Fundamentals</title>
      <id>https://realpython.com/quizzes/revisit-python-fundamentals/</id>
      <link href="https://realpython.com/quizzes/revisit-python-fundamentals/"/>
      <updated>2026-05-03T12:00:00+00:00</updated>
      <summary>Test your understanding of Python fundamentals: variables, data types, operators, expressions, keywords, and exceptions in 15 questions.</summary>
      <content type="html">
        &lt;p&gt;In this quiz, you&amp;rsquo;ll revisit the core concepts covered in the &lt;a href=&quot;https://realpython.com/learning-paths/python3-introduction/&quot;&gt;Revisit Python Fundamentals&lt;/a&gt; learning path:&lt;/p&gt;
&lt;div&gt;


&lt;learning-path-card data-path-id=&quot;python3-introduction&quot; class=&quot;d-block container border rounded mb-4 shadow-sm&quot; data-progress-card&gt;
  &lt;div class=&quot;row my-3&quot;&gt;
    &lt;div class=&quot;col-xs-12 col-sm-4 col-md-3 align-self-center px-3&quot;&gt;

        &lt;a href=&quot;/learning-paths/python3-introduction/&quot; aria-hidden=&quot;true&quot; tabindex=&quot;-1&quot; data-not-previewable&gt;&lt;img loading=&quot;lazy&quot; src=&quot;https://files.realpython.com/media/pcl-What-Can-I-Build-with-Python_Watermarked.551bc3d4b992.jpg&quot; srcset=&quot;/cdn-cgi/image/width=480,format=auto/https://files.realpython.com/media/pcl-What-Can-I-Build-with-Python_Watermarked.551bc3d4b992.jpg 480w, /cdn-cgi/image/width=640,format=auto/https://files.realpython.com/media/pcl-What-Can-I-Build-with-Python_Watermarked.551bc3d4b992.jpg 640w, /cdn-cgi/image/width=960,format=auto/https://files.realpython.com/media/pcl-What-Can-I-Build-with-Python_Watermarked.551bc3d4b992.jpg 960w, /cdn-cgi/image/width=1920,format=auto/https://files.realpython.com/media/pcl-What-Can-I-Build-with-Python_Watermarked.551bc3d4b992.jpg 1920w&quot; style=&quot;background: #abe0e6;&quot; class=&quot;rounded img-fluid w-100 my-0&quot; alt=&quot;A person building their Python skills brick by brick&quot; sizes=&quot;(min-width: 1200px) 142px, (min-width: 1000px) 122px, (min-width: 780px) 112px, (min-width: 580px) 139px, calc(100vw - 62px)&quot;&gt;&lt;/a&gt;

    &lt;/div&gt;
    &lt;div class=&quot;col px-3 pl-sm-0 mt-3 mt-sm-0&quot;&gt;
      &lt;p class=&quot;small text-muted mb-0&quot;&gt;&lt;strong&gt;Learning Path&lt;/strong&gt;&lt;/p&gt;
      &lt;a class=&quot;stretched-link&quot; href=&quot;/learning-paths/python3-introduction/&quot;&gt;&lt;h2 class=&quot;my-0 h3&quot;&gt;Revisit Python Fundamentals&lt;/h2&gt;&lt;/a&gt;
      &lt;p class=&quot;text-muted mb-0 small&quot;&gt;13 Resources ⋅ &lt;strong&gt;Skills:&lt;/strong&gt; Python, Variables, Data Types, REPL, Operators, Expressions, Exceptions, Comments, Keywords, IDLE, String Conversion&lt;/p&gt;


      &lt;div class=&quot;progress mt-2&quot; data-progress-placeholder&gt;
        &lt;div class=&quot;progress-bar bg-light text-black-50 small w-100&quot; data-progress-placeholder-bar&gt;&lt;/div&gt;
      &lt;/div&gt;


      &lt;div class=&quot;progress mt-2 d-none&quot; data-progress-container&gt;
        &lt;div class=&quot;progress-bar small&quot;
             role=&quot;progressbar&quot;
             data-progress-bar
             aria-valuenow=&quot;0&quot;
             aria-valuemin=&quot;0&quot;
             aria-valuemax=&quot;100&quot;
             style=&quot;min-width: 2.5em; cursor: default;&quot;&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/learning-path-card&gt;
&lt;/div&gt;

&lt;p&gt;The 15 questions span variables, data types, operators, expressions, keywords, and exceptions, giving you a way to check that you understood the most important ideas.&lt;/p&gt;
&lt;p&gt;Take your time and revisit any topics that feel rusty before moving on to the next learning path.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>The Real Python Podcast – Episode #293: Agentic Data Science Pair Programming With marimo pair</title>
      <id>https://realpython.com/podcasts/rpp/293/</id>
      <link href="https://realpython.com/podcasts/rpp/293/"/>
      <updated>2026-05-01T12:00:00+00:00</updated>
      <summary>How do you add agent skills to your data science workflow? How can a coding agent assist with data wrangling and research? This week on the show, Trevor Manz from marimo joins us to discuss marimo pair.</summary>
      <content type="html">
        &lt;p&gt;How do you add agent skills to your data science workflow? How can a coding agent assist with data wrangling and research? This week on the show, Trevor Manz from marimo joins us to discuss marimo pair.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Quiz: The Factory Method Pattern and Its Implementation in Python</title>
      <id>https://realpython.com/quizzes/factory-method-python/</id>
      <link href="https://realpython.com/quizzes/factory-method-python/"/>
      <updated>2026-05-01T12:00:00+00:00</updated>
      <summary>Check your grasp of the Factory Method pattern in Python: when to use it, the roles involved, and how to implement a flexible object factory.</summary>
      <content type="html">
        &lt;p&gt;In this quiz, you&amp;rsquo;ll test your understanding of
&lt;a href=&quot;https://realpython.com/factory-method-python/&quot;&gt;The Factory Method Pattern and Its Implementation in Python&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Factory Method is one of the most widely used design patterns, and it&amp;rsquo;s a powerful tool for separating object creation from object use in your code.&lt;/p&gt;
&lt;p&gt;By working through this quiz, you&amp;rsquo;ll revisit the components of the pattern, recognize opportunities to apply it, and see how you can implement a reusable, general-purpose solution in Python.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Quiz: Using Python for Data Analysis</title>
      <id>https://realpython.com/quizzes/python-for-data-analysis/</id>
      <link href="https://realpython.com/quizzes/python-for-data-analysis/"/>
      <updated>2026-04-30T12:00:00+00:00</updated>
      <summary>Test your understanding of a data analysis workflow in Python, from cleansing raw data with pandas to spotting insights with regression.</summary>
      <content type="html">
        &lt;p&gt;In this quiz, you&amp;rsquo;ll test your understanding of
&lt;a href=&quot;https://realpython.com/python-for-data-analysis/&quot;&gt;Using Python for Data Analysis&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By working through this quiz, you&amp;rsquo;ll revisit the stages of a data analysis workflow, including cleansing raw data with pandas, spotting outliers and typos, and using regression to find relationships between variables.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>AI Coding Agents Guide: A Map of the Four Workflow Types</title>
      <id>https://realpython.com/ai-coding-agents-guide/</id>
      <link href="https://realpython.com/ai-coding-agents-guide/"/>
      <updated>2026-04-29T14:00:00+00:00</updated>
      <summary>AI coding agents come in four types: IDE, terminal, PR, and cloud. Learn how each workflow fits into modern Python development.</summary>
      <content type="html">
        &lt;div&gt;&lt;p&gt;AI coding agents can read your code, reason about changes, and act on your behalf. To choose the right one, it helps to understand the four common workflow types: integrated development environment (IDE), terminal, pull request (PR), and cloud.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In this tutorial, you’ll&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Identify&lt;/strong&gt; the four common &lt;strong&gt;agent interaction modes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Understand&lt;/strong&gt; what makes &lt;strong&gt;each workflow distinct&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recognize&lt;/strong&gt; which mode fits &lt;strong&gt;common development scenarios&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Weigh&lt;/strong&gt; the &lt;strong&gt;risks and tradeoffs&lt;/strong&gt; of each workflow&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before exploring the four workflow types, it’s worth looking at what makes a coding tool &lt;a href=&quot;/ref/ai-coding-glossary/agentic-coding/&quot; class=&quot;ref-link&quot;&gt;agentic&lt;/a&gt; in the first place.&lt;/p&gt;
&lt;div class=&quot;container border rounded text-wrap-pretty my-3&quot;&gt;

  &lt;p class=&quot;my-3&quot;&gt;&lt;mark class=&quot;marker-highlight&quot;&gt;&lt;strong&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@quiz&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt; Take the Quiz:&lt;/strong&gt;&lt;/mark&gt; Test your knowledge with our interactive “AI Coding Agents Guide: A Map of the Four Workflow Types” quiz. You’ll receive a score upon completion to help you track your learning progress:&lt;/p&gt;

  &lt;hr&gt;

  &lt;div class=&quot;row my-3&quot;&gt;
    &lt;div class=&quot;col-xs-12 col-sm-4 col-md-3 align-self-center&quot;&gt;

      &lt;a href=&quot;/quizzes/ai-coding-agents-guide/&quot; tabindex=&quot;-1&quot;&gt;
        &lt;div class=&quot;embed-responsive embed-responsive-16by9&quot;&gt;

            &lt;img class=&quot;card-img-top m-0 p-0 embed-responsive-item rounded&quot; style=&quot;object-fit: contain; background: #b9abe6;&quot; alt=&quot;A person in overalls pointing at a four-piece puzzle map labeled IDE, Cloud, CLI, and PR/Repo, with a map info legend beside it and a Python logo.&quot; src=&quot;https://files.realpython.com/media/A-Practical-Map-of-Types-of-AI-Coding-Agents_Watermarked.7955cfd5f864.jpg&quot; width=&quot;1920&quot; height=&quot;1080&quot; srcset=&quot;/cdn-cgi/image/width=480,format=auto/https://files.realpython.com/media/A-Practical-Map-of-Types-of-AI-Coding-Agents_Watermarked.7955cfd5f864.jpg 480w, /cdn-cgi/image/width=640,format=auto/https://files.realpython.com/media/A-Practical-Map-of-Types-of-AI-Coding-Agents_Watermarked.7955cfd5f864.jpg 640w, /cdn-cgi/image/width=960,format=auto/https://files.realpython.com/media/A-Practical-Map-of-Types-of-AI-Coding-Agents_Watermarked.7955cfd5f864.jpg 960w, /cdn-cgi/image/width=1920,format=auto/https://files.realpython.com/media/A-Practical-Map-of-Types-of-AI-Coding-Agents_Watermarked.7955cfd5f864.jpg 1920w&quot; sizes=&quot;(min-width: 1200px) 142px, (min-width: 1000px) 122px, (min-width: 780px) 112px, (min-width: 580px) 139px, calc(100vw - 62px)&quot;&gt;


          &lt;div class=&quot;card-img-overlay d-flex align-items-center&quot;&gt;
            &lt;div class=&quot;mx-auto&quot;&gt;
              &lt;span class=&quot;text-light&quot; style=&quot;opacity: 0.90;&quot;&gt;&lt;span class=&quot;icon baseline scale2x&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@quiz&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/a&gt;

    &lt;/div&gt;
    &lt;div class=&quot;col&quot;&gt;
      &lt;div class=&quot;mt-3 d-md-none&quot;&gt;&lt;/div&gt; 
      &lt;p class=&quot;small text-muted mb-0&quot;&gt;&lt;strong&gt;Interactive Quiz&lt;/strong&gt;&lt;/p&gt;
      &lt;a href=&quot;/quizzes/ai-coding-agents-guide/&quot; class=&quot;stretched-link&quot;&gt;&lt;span class=&quot;my-0 h4&quot;&gt;AI Coding Agents Guide: A Map of the Four Workflow Types&lt;/span&gt;&lt;/a&gt; 
      &lt;p class=&quot;text-muted mb-0 small&quot;&gt;Check your understanding of how AI coding agents fit into your workflow through four interaction modes: IDE, terminal, pull request, and cloud.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;

&lt;/div&gt;

&lt;div class=&quot;alert alert-warning&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong markdown&gt;Get Your Cheat Sheet:&lt;/strong&gt; &lt;a href=&quot;https://realpython.com/bonus/ai-coding-agents-guide-cheatsheet/&quot; class=&quot;alert-link&quot; data-toggle=&quot;modal&quot; data-target=&quot;#modal-ai-coding-agents-guide-cheatsheet&quot; markdown&gt;Click here to download your free AI coding agents cheat sheet&lt;/a&gt; and keep the four workflow types at your fingertips when choosing the right agent for the job.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;understanding-ai-coding-agents&quot;&gt;Understanding AI Coding Agents&lt;a class=&quot;headerlink&quot; href=&quot;#understanding-ai-coding-agents&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;While standard chatbots provide one-off answers, coding agents are designed for autonomy, operating through a continuous execution loop to solve complex tasks. This loop typically follows four distinct steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Read&lt;/strong&gt;: They read relevant files from your codebase to form their context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reason&lt;/strong&gt;: They determine the logical steps needed to achieve your goal.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Act&lt;/strong&gt;: They execute those steps by editing files, running terminal commands, or using external tools.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluate&lt;/strong&gt;: They check the results of their actions to see if more work is needed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This loop repeats until the task is completed or the agent hands control back to you. Unlike simple predictive text or one-off prompts, agents bridge the gap between suggestion and execution by autonomously navigating the development workflow.&lt;/p&gt;
&lt;p&gt;The core agent loop will generally stay the same, but where an agent runs will shape how you interact with it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;In an editor&lt;/strong&gt;, it works alongside you.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;In a terminal&lt;/strong&gt;, you guide it step by step.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;In pull requests&lt;/strong&gt;, it reviews changes asynchronously.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;In the cloud&lt;/strong&gt;, it works in a managed environment and reports back later.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These environments define four primary agent types, each enabling a distinct workflow: &lt;strong&gt;IDE agents&lt;/strong&gt;, &lt;strong&gt;terminal agents&lt;/strong&gt;, &lt;strong&gt;PR agents&lt;/strong&gt;, and &lt;strong&gt;cloud agents&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id=&quot;exploring-the-four-workflow-types&quot;&gt;Exploring the Four Workflow Types&lt;a class=&quot;headerlink&quot; href=&quot;#exploring-the-four-workflow-types&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The four workflow types describe interaction modes and don’t always map cleanly to product categories. The same tool often spans multiple workflows. For example, &lt;a href=&quot;/ref/ai-coding-tools/claude-code/&quot; class=&quot;ref-link&quot;&gt;Claude Code&lt;/a&gt; runs in your &lt;a href=&quot;https://code.claude.com/docs/en/overview#terminal&quot;&gt;terminal&lt;/a&gt;, in your &lt;a href=&quot;https://code.claude.com/docs/en/overview#vs-code&quot;&gt;editor&lt;/a&gt;, and in the cloud with &lt;a href=&quot;https://code.claude.com/docs/en/claude-code-on-the-web&quot;&gt;Claude Code on the web&lt;/a&gt;. It can also review pull requests with &lt;a href=&quot;https://code.claude.com/docs/en/code-review&quot;&gt;Code Review&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The goal is to match the workflow to the task. The diagram below summarizes the four types at a glance:&lt;/p&gt;
&lt;figure class=&quot;js-lightbox&quot;&gt;&lt;a href=&quot;https://files.realpython.com/media/Autonomous_Agent-2026-04-16-135819_2.0effa4a51d4b.jpeg&quot; target=&quot;_blank&quot;&gt;&lt;img loading=&quot;lazy&quot; class=&quot;img-fluid mx-auto d-block &quot; src=&quot;https://files.realpython.com/media/Autonomous_Agent-2026-04-16-135819_2.0effa4a51d4b.jpeg&quot; width=&quot;2943&quot; height=&quot;1000&quot; srcset=&quot;/cdn-cgi/image/width=735,format=auto/https://files.realpython.com/media/Autonomous_Agent-2026-04-16-135819_2.0effa4a51d4b.jpeg 735w, /cdn-cgi/image/width=981,format=auto/https://files.realpython.com/media/Autonomous_Agent-2026-04-16-135819_2.0effa4a51d4b.jpeg 981w, /cdn-cgi/image/width=1471,format=auto/https://files.realpython.com/media/Autonomous_Agent-2026-04-16-135819_2.0effa4a51d4b.jpeg 1471w, /cdn-cgi/image/width=2943,format=auto/https://files.realpython.com/media/Autonomous_Agent-2026-04-16-135819_2.0effa4a51d4b.jpeg 2943w&quot; sizes=&quot;(min-width: 1200px) 690px, (min-width: 780px) calc(-5vw + 669px), (min-width: 580px) 510px, calc(100vw - 30px)&quot; alt=&quot;AI Agent Workflow Type Table&quot; data-asset=&quot;6908&quot;&gt;&lt;/a&gt;&lt;figcaption class=&quot;figure-caption text-center&quot;&gt;The Four Coding Agent Workflows&lt;/figcaption&gt;&lt;/figure&gt;

&lt;/div&gt;&lt;h2&gt;&lt;a href=&quot;https://realpython.com/ai-coding-agents-guide/?utm_source=realpython&amp;utm_medium=rss&quot;&gt;Read the full article at https://realpython.com/ai-coding-agents-guide/ »&lt;/a&gt;&lt;/h2&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Quiz: Python 3.13: A Modern REPL</title>
      <id>https://realpython.com/quizzes/python313-repl/</id>
      <link href="https://realpython.com/quizzes/python313-repl/"/>
      <updated>2026-04-29T12:00:00+00:00</updated>
      <summary>Test your understanding of the redesigned Python 3.13 REPL with color support, multiline editing, paste mode, and history browsing.</summary>
      <content type="html">
        &lt;p&gt;Test your knowledge of the redesigned interactive interpreter introduced in
&lt;a href=&quot;https://realpython.com/python313-repl/&quot;&gt;Python 3.13: A Modern REPL&lt;/a&gt;,
including the help system, multiline statement editing, code pasting
improvements, and the history browser.&lt;/p&gt;
&lt;p&gt;Good luck!&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Quiz: ChatterBot: Build a Chatbot With Python</title>
      <id>https://realpython.com/quizzes/build-a-chatbot-python-chatterbot/</id>
      <link href="https://realpython.com/quizzes/build-a-chatbot-python-chatterbot/"/>
      <updated>2026-04-29T12:00:00+00:00</updated>
      <summary>Test your understanding of the ChatterBot Python library, from training a basic bot with ListTrainer to wiring in a local LLM through Ollama.</summary>
      <content type="html">
        &lt;p&gt;In this quiz, you&amp;rsquo;ll test your understanding of
&lt;a href=&quot;https://realpython.com/build-a-chatbot-python-chatterbot/&quot;&gt;ChatterBot: Build a Chatbot With Python&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll revisit how ChatterBot learns from conversation data, how it picks replies based on similarity to what it&amp;rsquo;s already seen, and how it can pull in a local LLM to round out its responses.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Testing Your Code With Python&#x27;s unittest</title>
      <id>https://realpython.com/courses/testing-your-code-with-pythons-unittest/</id>
      <link href="https://realpython.com/courses/testing-your-code-with-pythons-unittest/"/>
      <updated>2026-04-28T14:00:00+00:00</updated>
      <summary>Learn how to use Python&#x27;s unittest framework to write unit tests for your code, including test cases, fixtures, and test suites.</summary>
      <content type="html">
        &lt;p&gt;The Python &lt;a href=&quot;https://docs.python.org/3/library/index.html&quot;&gt;standard library&lt;/a&gt; ships with a testing framework named &lt;strong&gt;&lt;code&gt;unittest&lt;/code&gt;&lt;/strong&gt;, which you can use to write automated tests for your code. The &lt;code&gt;unittest&lt;/code&gt; package has an object-oriented approach where test cases derive from a base class, which has several useful methods.&lt;/p&gt;
&lt;p&gt;The framework supports many features that will help you write consistent unit tests for your code. These features include test cases, fixtures, test suites, and test discovery capabilities.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In this video course, you&amp;rsquo;ll learn how to:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Write &lt;code&gt;unittest&lt;/code&gt; tests with the &lt;strong&gt;&lt;code&gt;TestCase&lt;/code&gt;&lt;/strong&gt; class&lt;/li&gt;
&lt;li&gt;Explore the &lt;strong&gt;assert&lt;/strong&gt; methods that &lt;code&gt;TestCase&lt;/code&gt; provides&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;unittest&lt;/code&gt; from the &lt;strong&gt;command line&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Group test cases using the &lt;strong&gt;&lt;code&gt;TestSuite&lt;/code&gt;&lt;/strong&gt; class&lt;/li&gt;
&lt;li&gt;Create &lt;strong&gt;fixtures&lt;/strong&gt; to handle &lt;strong&gt;setup&lt;/strong&gt; and &lt;strong&gt;teardown&lt;/strong&gt; logic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get the most out of this video course, you should be familiar with some important Python concepts, such as &lt;a href=&quot;https://realpython.com/python3-object-oriented-programming/&quot;&gt;object-oriented programming&lt;/a&gt;, &lt;a href=&quot;https://realpython.com/inheritance-composition-python/&quot;&gt;inheritance&lt;/a&gt;, and &lt;a href=&quot;https://realpython.com/python-assert-statement/&quot;&gt;assertions&lt;/a&gt;. Having a good understanding of code &lt;a href=&quot;https://realpython.com/python-testing/&quot;&gt;testing&lt;/a&gt; is a plus.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Quiz: Use Codex CLI to Enhance Your Python Projects</title>
      <id>https://realpython.com/quizzes/codex-cli-video/</id>
      <link href="https://realpython.com/quizzes/codex-cli-video/"/>
      <updated>2026-04-28T12:00:00+00:00</updated>
      <summary>Test your understanding of how to install Codex CLI, use Plan mode, and refine features with natural language in your terminal.</summary>
      <content type="html">
        &lt;p&gt;In this quiz, you&amp;rsquo;ll test your understanding of &lt;a href=&quot;https://realpython.com/courses/use-codex-cli-enhance-your-python-projects/&quot;&gt;Use Codex CLI to Enhance Your Python Projects&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;By working through this quiz, you&amp;rsquo;ll revisit how to install and configure Codex CLI, use Plan mode to review changes before they land, and refine features through iterative prompting in your terminal.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>How to Conceptualize Python Fundamentals for Greater Mastery</title>
      <id>https://realpython.com/conceptualize-python-fundamentals/</id>
      <link href="https://realpython.com/conceptualize-python-fundamentals/"/>
      <updated>2026-04-27T14:00:00+00:00</updated>
      <summary>Master Python fundamentals by learning how to conceptualize core concepts like variables, loops, and functions for better understanding and retention.</summary>
      <content type="html">
        &lt;div&gt;&lt;p&gt;Struggling to conceptualize Python fundamentals is a common problem learners face. If you’re unable to put a fundamental concept into perspective and form a clear mental picture of what it’s about, it’ll be difficult to understand and apply it.&lt;/p&gt;
&lt;p&gt;In this guide, you’ll walk through a framework of steps to help you better conceptualize Python fundamentals. This process is helpful for Python developers and learners at any experience level, but especially for beginners. If you are just starting out, this guide will help you build a solid understanding of the basics.&lt;/p&gt;
&lt;p&gt;You might want to set aside twenty minutes or so to read through the tutorial, and another thirty minutes to practice on a few key concepts. You should also gather a list of difficult topics, your preferred learning resources, and a note-taking app or pen and paper.&lt;/p&gt;
&lt;p&gt;Click the link below to download a free cheat sheet that covers the framework steps you’ll walk through in this guide:&lt;/p&gt;
&lt;div class=&quot;alert alert-warning&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong markdown&gt;Get Your Cheat Sheet:&lt;/strong&gt; &lt;a href=&quot;https://realpython.com/bonus/conceptualize-python-fundamentals-cheatsheet/&quot; class=&quot;alert-link&quot; data-toggle=&quot;modal&quot; data-target=&quot;#modal-conceptualize-python-fundamentals-cheatsheet&quot; markdown&gt;Click here to download a free PDF&lt;/a&gt; that outlines the framework of steps for conceptualizing Python fundamentals.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;container border rounded text-wrap-pretty my-3&quot;&gt;

  &lt;p class=&quot;my-3&quot;&gt;&lt;mark class=&quot;marker-highlight&quot;&gt;&lt;strong&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@quiz&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt; Take the Quiz:&lt;/strong&gt;&lt;/mark&gt; Test your knowledge with our interactive “How to Conceptualize Python Fundamentals for Greater Mastery” quiz. You’ll receive a score upon completion to help you track your learning progress:&lt;/p&gt;

  &lt;hr&gt;

  &lt;div class=&quot;row my-3&quot;&gt;
    &lt;div class=&quot;col-xs-12 col-sm-4 col-md-3 align-self-center&quot;&gt;

      &lt;a href=&quot;/quizzes/conceptualize-python-fundamentals/&quot; tabindex=&quot;-1&quot;&gt;
        &lt;div class=&quot;embed-responsive embed-responsive-16by9&quot;&gt;

            &lt;img class=&quot;card-img-top m-0 p-0 embed-responsive-item rounded&quot; style=&quot;object-fit: contain; background: #abe0e6;&quot; alt=&quot;A chef combining ingredients from labeled jars like Variables, Loops, and Lists into a pot, while a woman tastes the result, with a recipe board showing Define, Connect, and Apply steps.&quot; src=&quot;https://files.realpython.com/media/How-to-Conceptualize-Python-Fundamentals-for-Better-Understanding_Watermarked.4c4979cbf541.jpg&quot; width=&quot;1920&quot; height=&quot;1080&quot; srcset=&quot;/cdn-cgi/image/width=480,format=auto/https://files.realpython.com/media/How-to-Conceptualize-Python-Fundamentals-for-Better-Understanding_Watermarked.4c4979cbf541.jpg 480w, /cdn-cgi/image/width=640,format=auto/https://files.realpython.com/media/How-to-Conceptualize-Python-Fundamentals-for-Better-Understanding_Watermarked.4c4979cbf541.jpg 640w, /cdn-cgi/image/width=960,format=auto/https://files.realpython.com/media/How-to-Conceptualize-Python-Fundamentals-for-Better-Understanding_Watermarked.4c4979cbf541.jpg 960w, /cdn-cgi/image/width=1920,format=auto/https://files.realpython.com/media/How-to-Conceptualize-Python-Fundamentals-for-Better-Understanding_Watermarked.4c4979cbf541.jpg 1920w&quot; sizes=&quot;(min-width: 1200px) 142px, (min-width: 1000px) 122px, (min-width: 780px) 112px, (min-width: 580px) 139px, calc(100vw - 62px)&quot;&gt;


          &lt;div class=&quot;card-img-overlay d-flex align-items-center&quot;&gt;
            &lt;div class=&quot;mx-auto&quot;&gt;
              &lt;span class=&quot;text-light&quot; style=&quot;opacity: 0.90;&quot;&gt;&lt;span class=&quot;icon baseline scale2x&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@quiz&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/a&gt;

    &lt;/div&gt;
    &lt;div class=&quot;col&quot;&gt;
      &lt;div class=&quot;mt-3 d-md-none&quot;&gt;&lt;/div&gt; 
      &lt;p class=&quot;small text-muted mb-0&quot;&gt;&lt;strong&gt;Interactive Quiz&lt;/strong&gt;&lt;/p&gt;
      &lt;a href=&quot;/quizzes/conceptualize-python-fundamentals/&quot; class=&quot;stretched-link&quot;&gt;&lt;span class=&quot;my-0 h4&quot;&gt;How to Conceptualize Python Fundamentals for Greater Mastery&lt;/span&gt;&lt;/a&gt; 
      &lt;p class=&quot;text-muted mb-0 small&quot;&gt;Check your understanding of a framework for conceptualizing Python fundamentals, from defining concepts to comparing similar ideas.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;

&lt;/div&gt;

&lt;h2 id=&quot;step-1-define-the-concept-in-your-own-words&quot;&gt;Step 1: Define the Concept in Your Own Words&lt;a class=&quot;headerlink&quot; href=&quot;#step-1-define-the-concept-in-your-own-words&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Begin by briefly describing the concept in your own words. You can write your definition in the downloadable worksheet provided with this tutorial. Note that writing is a powerful tool for reinforcing learning, as educator and former Rutgers University professor Janet Emig asserted in her paper, &lt;a href=&quot;https://openlab.citytech.cuny.edu/fywpd/files/2019/01/emig-writing-as-a-mode-of-learning.pdf&quot;&gt;&lt;em&gt;Writing as a Mode of Learning&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&quot;answer-key-questions-for-defining-a-concept&quot;&gt;Answer Key Questions for Defining a Concept&lt;a class=&quot;headerlink&quot; href=&quot;#answer-key-questions-for-defining-a-concept&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;As a framework for your definition, consider these key questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What&lt;/strong&gt;: What is a short description of the concept?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Why&lt;/strong&gt;: Why is the concept important in the broader Python context?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How&lt;/strong&gt;: How is the concept used in a Python program?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These questions will help you establish a core understanding of the concept you’re learning.&lt;/p&gt;
&lt;p&gt;You might feel intimidated when you’re trying to define a Python concept. If you need help, there are many resources that can assist you. &lt;a href=&quot;https://realpython.com/ref/&quot;&gt;Real Python’s Reference section&lt;/a&gt; has concise definitions of Python keywords, built-in types, standard library modules, and more to help you build your own descriptions.&lt;/p&gt;
&lt;p&gt;If you’re a visual learner, using an illustration can be a powerful way to enhance your understanding. In addition to a written definition, you can draw a picture or diagram to illustrate the concept. For example, the &lt;a href=&quot;https://realpython.com/python-variables/#exploring-core-features-of-variables&quot;&gt;Variables in Python: Usage and Best Practices&lt;/a&gt; tutorial shows some example images of how you might picture variables. If you look at the &lt;a href=&quot;https://realpython.com/python-lists-tuples/#lists-and-tuples-can-be-indexed-and-sliced&quot;&gt;Lists vs Tuples in Python&lt;/a&gt; tutorial, you can see a diagram of a Python list.&lt;/p&gt;
&lt;p&gt;While pictures can be helpful, being able to conceptualize doesn’t necessarily mean you have to think visually. There are different thinking styles. &lt;a href=&quot;https://www.researchgate.net/publication/244250898_Verbal_or_Visual_Thinker_Different_Ways_of_Orienting_in_a_Complex_Picture&quot;&gt;Some researchers suggest&lt;/a&gt; that people can be visual or verbal thinkers. Pattern-based thinking is another style. Several of the tips in this tutorial encourage you to explore different aspects of these styles, depending on which works best for you.&lt;/p&gt;
&lt;h3 id=&quot;view-examples-of-concept-definitions&quot;&gt;View Examples of Concept Definitions&lt;a class=&quot;headerlink&quot; href=&quot;#view-examples-of-concept-definitions&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;You might find a couple of examples helpful in understanding how to define difficult concepts. Suppose you’re studying &lt;a href=&quot;https://realpython.com/python-variables/&quot;&gt;variables&lt;/a&gt;. Here are possible responses to the key questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What&lt;/strong&gt;: A variable is a name that points to an &lt;a href=&quot;/ref/glossary/object/&quot; class=&quot;ref-link&quot;&gt;object&lt;/a&gt; stored in the program’s memory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Why&lt;/strong&gt;: Variables are key for data processing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How&lt;/strong&gt;: &lt;a href=&quot;/ref/glossary/assignment/&quot; class=&quot;ref-link&quot;&gt;Assigning&lt;/a&gt; a value to a variable using the &lt;a href=&quot;https://realpython.com/python-assignment-operator/&quot;&gt;assignment operator (&lt;code&gt;=&lt;/code&gt;)&lt;/a&gt; allows you to access your program’s data in a user-friendly way. You can then access and change the value by name throughout the program as needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This description provides a concise summary of what a variable is, why it matters, and how to use one. You can also include an example of variable usage as an addendum to your definition:&lt;/p&gt;
&lt;code-block class=&quot;mb-3&quot; data-syntax-language=&quot;pycon&quot; data-is-repl=&quot;true&quot;&gt;
  &lt;div class=&quot;codeblock__header codeblock--blue&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Python&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
        &lt;span class=&quot;codeblock__output-toggle&quot; title=&quot;Toggle prompts and output&quot; aria-label=&quot;Toggle prompts and output&quot; role=&quot;button&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;icon baseline js-codeblock-output-on codeblock__header--icon-lower&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#regular--rectangle-terminal&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;age&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot; aria-label=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;
&lt;/code-block&gt;
&lt;p&gt;Here, you created a variable called &lt;code&gt;age&lt;/code&gt; and assigned it a value of 25. From now on, you can use the variable name &lt;code&gt;age&lt;/code&gt; to access, modify, or use the variable’s value.&lt;/p&gt;
&lt;p&gt;Or, you might be learning about &lt;a href=&quot;https://realpython.com/python-list/&quot;&gt;lists&lt;/a&gt;. Your definitions could look like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What&lt;/strong&gt;: A list is a &lt;a href=&quot;/ref/glossary/sequence/&quot; class=&quot;ref-link&quot;&gt;sequence&lt;/a&gt; of values or objects.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Why&lt;/strong&gt;: Working with &lt;a href=&quot;https://realpython.com/python-sequences/&quot;&gt;sequences&lt;/a&gt; of items is a common, foundational task in programming. Python lists make this important work easier.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How&lt;/strong&gt;: You can create a list by writing a pair of square brackets, with a comma-separated sequence of items inside them. Assign the list to a variable to use it throughout your program.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here’s a short Python list that demonstrates the points in the definitions above:&lt;/p&gt;
&lt;/div&gt;&lt;h2&gt;&lt;a href=&quot;https://realpython.com/conceptualize-python-fundamentals/?utm_source=realpython&amp;utm_medium=rss&quot;&gt;Read the full article at https://realpython.com/conceptualize-python-fundamentals/ »&lt;/a&gt;&lt;/h2&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>The Real Python Podcast – Episode #292: Becoming a Better Python Developer Through Learning Rust</title>
      <id>https://realpython.com/podcasts/rpp/292/</id>
      <link href="https://realpython.com/podcasts/rpp/292/"/>
      <updated>2026-04-24T12:00:00+00:00</updated>
      <summary>How can learning Rust help make you a better Python Developer? How do techniques required by a compiled language translate to improving your Python code? Christopher Trudeau is back on the show this week with another batch of PyCoder&#x27;s Weekly articles and projects.</summary>
      <content type="html">
        &lt;p&gt;How can learning Rust help make you a better Python Developer? How do techniques required by a compiled language translate to improving your Python code? Christopher Trudeau is back on the show this week with another batch of PyCoder&#x27;s Weekly articles and projects.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Altair: Declarative Charts With Python</title>
      <id>https://realpython.com/altair-python/</id>
      <link href="https://realpython.com/altair-python/"/>
      <updated>2026-04-22T14:00:00+00:00</updated>
      <summary>Build interactive Python charts the declarative way with Altair. Map data to visual properties and add linked selections. No JavaScript required.</summary>
      <content type="html">
        &lt;div&gt;&lt;p&gt;There’s a moment many data analysts know well: you have a new dataset and a clear question, and you open a notebook only to find yourself writing boilerplate axis and figure setup before you’ve even looked at the data. Matplotlib gives you fine-grained control, but that control comes with a cost. Altair takes a completely different approach to data visualization in Python.&lt;/p&gt;
&lt;p&gt;Instead of scripting every visual detail, you describe &lt;em&gt;what&lt;/em&gt; your data means. This includes specifying which column goes on which axis, what should be colored, and what should be interactive. Altair then generates the visualization.&lt;/p&gt;
&lt;p&gt;If you’re wondering whether it’s worth adding another visualization library to your toolkit, here’s how Altair and Matplotlib compare:&lt;/p&gt;
&lt;div class=&quot;table-responsive&quot;&gt;
&lt;table class=&quot;table table-hover&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th class=&quot;text-center&quot;&gt;Pick Altair&lt;/th&gt;
&lt;th class=&quot;text-center&quot;&gt;Pick Matplotlib&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Interactive exploratory charts in notebooks&lt;/td&gt;
&lt;td class=&quot;text-center&quot;&gt;✅&lt;/td&gt;
&lt;td class=&quot;text-center&quot;&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pixel-precise publication figures or 3D plots&lt;/td&gt;
&lt;td class=&quot;text-center&quot;&gt;—&lt;/td&gt;
&lt;td class=&quot;text-center&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;Altair generates &lt;strong&gt;web-native&lt;/strong&gt; charts. The output is HTML and JavaScript, which means charts render right in your notebook and can be saved as standalone HTML files or embedded in web pages. It’s not a replacement for Matplotlib, and it doesn’t try to be. Think of them as tools you reach for in different situations.&lt;/p&gt;
&lt;div class=&quot;alert alert-warning&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong markdown&gt;Get Your Code:&lt;/strong&gt; &lt;a href=&quot;https://realpython.com/bonus/altair-python-code/&quot; class=&quot;alert-link&quot; data-toggle=&quot;modal&quot; data-target=&quot;#modal-altair-python-code&quot; markdown&gt;Click here to download the free sample code&lt;/a&gt; you’ll use to build interactive Python charts the declarative way with Altair.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;container border rounded text-wrap-pretty my-3&quot;&gt;

  &lt;p class=&quot;my-3&quot;&gt;&lt;mark class=&quot;marker-highlight&quot;&gt;&lt;strong&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@quiz&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt; Take the Quiz:&lt;/strong&gt;&lt;/mark&gt; Test your knowledge with our interactive “Altair: Declarative Charts With Python” quiz. You’ll receive a score upon completion to help you track your learning progress:&lt;/p&gt;

  &lt;hr&gt;

  &lt;div class=&quot;row my-3&quot;&gt;
    &lt;div class=&quot;col-xs-12 col-sm-4 col-md-3 align-self-center&quot;&gt;

      &lt;a href=&quot;/quizzes/altair-python/&quot; tabindex=&quot;-1&quot;&gt;
        &lt;div class=&quot;embed-responsive embed-responsive-16by9&quot;&gt;

            &lt;img class=&quot;card-img-top m-0 p-0 embed-responsive-item rounded&quot; style=&quot;object-fit: contain; background: #abe0e6;&quot; alt=&quot;Two people building a chart by inserting cards into a machine labeled Describe Your Chart, with a Python logo, colorful bar charts, and mapping steps displayed.&quot; src=&quot;https://files.realpython.com/media/Altair-Declarative-Charts-with-Python_Watermarked.f6d83ff116ed.jpg&quot; width=&quot;1920&quot; height=&quot;1080&quot; srcset=&quot;/cdn-cgi/image/width=480,format=auto/https://files.realpython.com/media/Altair-Declarative-Charts-with-Python_Watermarked.f6d83ff116ed.jpg 480w, /cdn-cgi/image/width=640,format=auto/https://files.realpython.com/media/Altair-Declarative-Charts-with-Python_Watermarked.f6d83ff116ed.jpg 640w, /cdn-cgi/image/width=960,format=auto/https://files.realpython.com/media/Altair-Declarative-Charts-with-Python_Watermarked.f6d83ff116ed.jpg 960w, /cdn-cgi/image/width=1920,format=auto/https://files.realpython.com/media/Altair-Declarative-Charts-with-Python_Watermarked.f6d83ff116ed.jpg 1920w&quot; sizes=&quot;(min-width: 1200px) 142px, (min-width: 1000px) 122px, (min-width: 780px) 112px, (min-width: 580px) 139px, calc(100vw - 62px)&quot;&gt;


          &lt;div class=&quot;card-img-overlay d-flex align-items-center&quot;&gt;
            &lt;div class=&quot;mx-auto&quot;&gt;
              &lt;span class=&quot;text-light&quot; style=&quot;opacity: 0.90;&quot;&gt;&lt;span class=&quot;icon baseline scale2x&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@quiz&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/a&gt;

    &lt;/div&gt;
    &lt;div class=&quot;col&quot;&gt;
      &lt;div class=&quot;mt-3 d-md-none&quot;&gt;&lt;/div&gt; 
      &lt;p class=&quot;small text-muted mb-0&quot;&gt;&lt;strong&gt;Interactive Quiz&lt;/strong&gt;&lt;/p&gt;
      &lt;a href=&quot;/quizzes/altair-python/&quot; class=&quot;stretched-link&quot;&gt;&lt;span class=&quot;my-0 h4&quot;&gt;Altair: Declarative Charts With Python&lt;/span&gt;&lt;/a&gt; 
      &lt;p class=&quot;text-muted mb-0 small&quot;&gt;Test your knowledge of Altair, the declarative data visualization library for Python that turns DataFrames into interactive charts.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;

&lt;/div&gt;

&lt;h2 id=&quot;start-using-altair-in-python&quot;&gt;Start Using Altair in Python&lt;a class=&quot;headerlink&quot; href=&quot;#start-using-altair-in-python&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It’s a good idea to install Altair in a dedicated &lt;a href=&quot;https://realpython.com/python-virtual-environments-a-primer/&quot;&gt;virtual environment&lt;/a&gt;. It pulls in several dependencies like &lt;a href=&quot;https://realpython.com/learning-paths/pandas-data-science/&quot;&gt;pandas&lt;/a&gt; and the Vega-Lite renderer, and a &lt;a href=&quot;/ref/glossary/virtual-environment/&quot; class=&quot;ref-link&quot;&gt;virtual environment&lt;/a&gt; keeps them from interfering with your other projects. Create one and install Altair with &lt;a href=&quot;https://realpython.com/what-is-pip/&quot;&gt;&lt;code&gt;pip&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;code-block class=&quot;mb-3&quot; data-syntax-language=&quot;console&quot; data-is-repl=&quot;true&quot;&gt;
  &lt;div class=&quot;codeblock__header codeblock--yellow&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Shell&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
        &lt;span class=&quot;codeblock__output-toggle&quot; title=&quot;Toggle prompts and output&quot; aria-label=&quot;Toggle prompts and output&quot; role=&quot;button&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;icon baseline js-codeblock-output-on codeblock__header--icon-lower&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#regular--rectangle-terminal&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;python&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-m&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;venv&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;altair-venv
&lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;altair-venv/bin/activate
&lt;span class=&quot;gp gp-VirtualEnv&quot;&gt;(altair-venv)&lt;/span&gt; &lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;python&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-m&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pip&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;install&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;altair
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot; aria-label=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;
&lt;/code-block&gt;
&lt;p&gt;This tutorial uses Python 3.14 and Altair 6.0. All the code runs inside a &lt;a href=&quot;https://realpython.com/jupyter-notebook-introduction/&quot;&gt;Jupyter notebook&lt;/a&gt;, which is the most common environment for interactive data exploration with Altair. If you prefer a different JavaScript-capable environment like &lt;a href=&quot;/ref/code-editors-ides/visual-studio-code/&quot; class=&quot;ref-link&quot;&gt;VS Code&lt;/a&gt;, &lt;a href=&quot;/ref/tools/google-colab/&quot; class=&quot;ref-link&quot;&gt;Google Colab&lt;/a&gt;, or &lt;a href=&quot;/ref/code-editors-ides/jupyterlab/&quot; class=&quot;ref-link&quot;&gt;JupyterLab&lt;/a&gt;, feel free to use that instead. To launch a Jupyter notebook, run the following:&lt;/p&gt;
&lt;code-block class=&quot;mb-3&quot; data-syntax-language=&quot;console&quot; data-is-repl=&quot;true&quot;&gt;
  &lt;div class=&quot;codeblock__header codeblock--yellow&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Shell&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
        &lt;span class=&quot;codeblock__output-toggle&quot; title=&quot;Toggle prompts and output&quot; aria-label=&quot;Toggle prompts and output&quot; role=&quot;button&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;icon baseline js-codeblock-output-on codeblock__header--icon-lower&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#regular--rectangle-terminal&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;gp gp-VirtualEnv&quot;&gt;(altair-venv)&lt;/span&gt; &lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;python&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-m&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;pip&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;install&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;notebook
&lt;span class=&quot;gp gp-VirtualEnv&quot;&gt;(altair-venv)&lt;/span&gt; &lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;jupyter&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;notebook
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot; aria-label=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;
&lt;/code-block&gt;
&lt;p&gt;The second command launches the &lt;a href=&quot;/ref/code-editors-ides/jupyter-notebook/&quot; class=&quot;ref-link&quot;&gt;Jupyter Notebook&lt;/a&gt; server in your browser. Create a new notebook and enter the following code, which builds a bar chart from a small &lt;a href=&quot;/ref/glossary/dataframe/&quot; class=&quot;ref-link&quot;&gt;DataFrame&lt;/a&gt; containing daily step counts for one week:&lt;/p&gt;
&lt;code-block class=&quot;mb-3&quot; data-syntax-language=&quot;python&quot;&gt;
  &lt;div class=&quot;codeblock__header codeblock--blue&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Python&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;altair&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;alt&lt;/span&gt;
&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;pandas&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;as&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;pd&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;steps&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;pd&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DataFrame&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
    &lt;span class=&quot;s2&quot;&gt;&quot;Day&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;1-Mon&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;2-Tue&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;3-Wed&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;4-Thu&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;5-Fri&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;6-Sat&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;7-Sun&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;s2&quot;&gt;&quot;Steps&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6200&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8400&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;7100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9800&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5500&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9870&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3769&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;

&lt;span class=&quot;n&quot;&gt;weekly_steps&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;alt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Chart&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;mark_bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;encode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Day&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Steps&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;weekly_steps&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot; aria-label=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;
&lt;/code-block&gt;
&lt;p&gt;You should see a bar chart displaying daily step counts:&lt;/p&gt;
&lt;figure class=&quot;js-lightbox&quot;&gt;&lt;a href=&quot;https://files.realpython.com/media/altair-weekly-steps-bar-chart.a3b50fc2fd70.png&quot; target=&quot;_blank&quot;&gt;&lt;img loading=&quot;lazy&quot; class=&quot;img-fluid mx-auto d-block &quot; src=&quot;https://files.realpython.com/media/altair-weekly-steps-bar-chart.a3b50fc2fd70.png&quot; width=&quot;2048&quot; height=&quot;1152&quot; srcset=&quot;/cdn-cgi/image/width=512,format=auto/https://files.realpython.com/media/altair-weekly-steps-bar-chart.a3b50fc2fd70.png 512w, /cdn-cgi/image/width=682,format=auto/https://files.realpython.com/media/altair-weekly-steps-bar-chart.a3b50fc2fd70.png 682w, /cdn-cgi/image/width=1024,format=auto/https://files.realpython.com/media/altair-weekly-steps-bar-chart.a3b50fc2fd70.png 1024w, /cdn-cgi/image/width=2048,format=auto/https://files.realpython.com/media/altair-weekly-steps-bar-chart.a3b50fc2fd70.png 2048w&quot; sizes=&quot;(min-width: 1200px) 690px, (min-width: 780px) calc(-5vw + 669px), (min-width: 580px) 510px, calc(100vw - 30px)&quot; alt=&quot;Altair Bar Chart Showing Daily Step Counts&quot; data-asset=&quot;6880&quot;&gt;&lt;/a&gt;&lt;figcaption class=&quot;figure-caption text-center&quot;&gt;Step Counts as a Bar Chart&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;The dataset is intentionally minimal because data isn’t the main focus: it has seven rows for seven days, and two columns for the day name and step count. Notice how the &lt;code&gt;weekly_steps&lt;/code&gt; chart is constructed. Every Altair chart follows this same pattern. It’s built from these three building blocks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Data&lt;/strong&gt;: A &lt;a href=&quot;https://realpython.com/pandas-dataframe/&quot;&gt;pandas DataFrame&lt;/a&gt; handed to &lt;code&gt;alt.Chart()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mark&lt;/strong&gt;: The visual shape you want, chosen via &lt;code&gt;.mark_*()&lt;/code&gt;. Here, &lt;code&gt;.mark_bar()&lt;/code&gt; draws bars. Other options include &lt;code&gt;.mark_point()&lt;/code&gt;, &lt;code&gt;.mark_line()&lt;/code&gt;, and &lt;code&gt;.mark_arc()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Encode&lt;/strong&gt;: The mapping from data columns to visual properties, declared inside &lt;code&gt;.encode()&lt;/code&gt;. Here, &lt;code&gt;Day&lt;/code&gt; goes to the x-axis and &lt;code&gt;Steps&lt;/code&gt; to the y-axis.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is Altair’s core grammar in action: &lt;strong&gt;Data → Mark → Encode&lt;/strong&gt;. You’ll use it every time.&lt;/p&gt;
&lt;/div&gt;&lt;h2&gt;&lt;a href=&quot;https://realpython.com/altair-python/?utm_source=realpython&amp;utm_medium=rss&quot;&gt;Read the full article at https://realpython.com/altair-python/ »&lt;/a&gt;&lt;/h2&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Leverage OpenAI&#x27;s API in Your Python Projects</title>
      <id>https://realpython.com/courses/leverage-openais-api-in-your-python-projects/</id>
      <link href="https://realpython.com/courses/leverage-openais-api-in-your-python-projects/"/>
      <updated>2026-04-21T14:00:00+00:00</updated>
      <summary>Learn how to use the ChatGPT API with Python&#x27;s openai library to send prompts, control AI behavior with roles, and get structured outputs.</summary>
      <content type="html">
        &lt;p&gt;Python&amp;rsquo;s &lt;code&gt;openai&lt;/code&gt; library provides the tools you need to integrate the ChatGPT API into your Python applications. With it, you can send text prompts to the API and receive AI-generated responses. You can also guide the AI&amp;rsquo;s behavior with &lt;code&gt;developer&lt;/code&gt; role messages and handle both simple text generation and more complex code creation tasks.&lt;/p&gt;
&lt;p&gt;After watching this video course, you&amp;rsquo;ll understand how examples like this work under the hood. You&amp;rsquo;ll learn the fundamentals of using the ChatGPT API from Python and have code examples you can adapt for your own projects.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Gemini CLI vs Claude Code: Which to Choose for Python Tasks</title>
      <id>https://realpython.com/gemini-cli-vs-claude-code/</id>
      <link href="https://realpython.com/gemini-cli-vs-claude-code/"/>
      <updated>2026-04-20T14:00:00+00:00</updated>
      <summary>Gemini CLI vs Claude Code: compare setup, performance, code quality, and cost to find the right Python AI coding tool for your workflow.</summary>
      <content type="html">
        &lt;div&gt;&lt;p&gt;When comparing Gemini CLI vs Claude Code, the answer to “which one is better?” is usually &lt;em&gt;it depends&lt;/em&gt;. Both tools boost productivity for Python developers, but they have different strengths. Choosing the right one depends on your budget, workflow, and what you value most in generated code.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/ref/ai-coding-tools/gemini-cli/&quot; class=&quot;ref-link&quot;&gt;Gemini CLI&lt;/a&gt;, for instance, is known for its generous free tier, while &lt;a href=&quot;/ref/ai-coding-tools/claude-code/&quot; class=&quot;ref-link&quot;&gt;Claude Code&lt;/a&gt; is a paid tool known for its production-ready output.&lt;/p&gt;
&lt;p&gt;In this tutorial, you’ll explore features such as &lt;strong&gt;user experience&lt;/strong&gt;, &lt;strong&gt;performance&lt;/strong&gt;, &lt;strong&gt;code quality&lt;/strong&gt;, and &lt;strong&gt;usage cost&lt;/strong&gt; to help make that decision easier. The AI coding assistance these tools provide right in your terminal generally makes writing Python code much more seamless, helping you save time and be more productive.&lt;/p&gt;
&lt;p&gt;This table highlights the key differences at a glance:&lt;/p&gt;
&lt;div class=&quot;table-responsive&quot;&gt;
&lt;table class=&quot;table table-hover&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Use Case&lt;/strong&gt;&lt;/th&gt;
&lt;th class=&quot;text-center&quot;&gt;&lt;strong&gt;Gemini CLI&lt;/strong&gt;&lt;/th&gt;
&lt;th class=&quot;text-center&quot;&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;You need free generous usage limits&lt;/td&gt;
&lt;td class=&quot;text-center&quot;&gt;✅&lt;/td&gt;
&lt;td class=&quot;text-center&quot;&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You need Google Cloud integration&lt;/td&gt;
&lt;td class=&quot;text-center&quot;&gt;✅&lt;/td&gt;
&lt;td class=&quot;text-center&quot;&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You need faster task completion&lt;/td&gt;
&lt;td class=&quot;text-center&quot;&gt;—&lt;/td&gt;
&lt;td class=&quot;text-center&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You need code close to production quality&lt;/td&gt;
&lt;td class=&quot;text-center&quot;&gt;—&lt;/td&gt;
&lt;td class=&quot;text-center&quot;&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;You can see that Gemini CLI is a promising choice if you’re looking for free usage limits and prefer Google Cloud integration. However, if you want to complete tasks faster, Claude Code has an edge. Both tools produce code of good quality, but Claude Code generates code that is closer to production quality. If you’d like a more thorough comparison, then read on.&lt;/p&gt;
&lt;div class=&quot;alert alert-warning&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong markdown&gt;Get Your Code:&lt;/strong&gt; &lt;a href=&quot;https://realpython.com/bonus/gemini-cli-vs-claude-code-code/&quot; class=&quot;alert-link&quot; data-toggle=&quot;modal&quot; data-target=&quot;#modal-gemini-cli-vs-claude-code-code&quot; markdown&gt;Click here to download the free sample code&lt;/a&gt; for the to-do app projects built with Gemini CLI and Claude Code in this tutorial.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;container border rounded text-wrap-pretty my-3&quot;&gt;

  &lt;p class=&quot;my-3&quot;&gt;&lt;mark class=&quot;marker-highlight&quot;&gt;&lt;strong&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@quiz&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt; Take the Quiz:&lt;/strong&gt;&lt;/mark&gt; Test your knowledge with our interactive “Gemini CLI vs Claude Code: Which to Choose for Python Tasks” quiz. You’ll receive a score upon completion to help you track your learning progress:&lt;/p&gt;

  &lt;hr&gt;

  &lt;div class=&quot;row my-3&quot;&gt;
    &lt;div class=&quot;col-xs-12 col-sm-4 col-md-3 align-self-center&quot;&gt;

      &lt;a href=&quot;/quizzes/gemini-cli-vs-claude-code/&quot; tabindex=&quot;-1&quot;&gt;
        &lt;div class=&quot;embed-responsive embed-responsive-16by9&quot;&gt;

            &lt;img class=&quot;card-img-top m-0 p-0 embed-responsive-item rounded&quot; style=&quot;object-fit: contain; background: #ffc973;&quot; alt=&quot;A scientist comparing two coding terminals labeled Gemini and Claude on a balance scale with gauges for cost, speed, and quality, a Python-branded processor, and ink bottles.&quot; src=&quot;https://files.realpython.com/media/Gemini-CLI-vs-Claude-Code-Which-to-Choose-for-Python-Programming_Watermarked.d928bd4957f9.jpg&quot; width=&quot;1920&quot; height=&quot;1080&quot; srcset=&quot;/cdn-cgi/image/width=480,format=auto/https://files.realpython.com/media/Gemini-CLI-vs-Claude-Code-Which-to-Choose-for-Python-Programming_Watermarked.d928bd4957f9.jpg 480w, /cdn-cgi/image/width=640,format=auto/https://files.realpython.com/media/Gemini-CLI-vs-Claude-Code-Which-to-Choose-for-Python-Programming_Watermarked.d928bd4957f9.jpg 640w, /cdn-cgi/image/width=960,format=auto/https://files.realpython.com/media/Gemini-CLI-vs-Claude-Code-Which-to-Choose-for-Python-Programming_Watermarked.d928bd4957f9.jpg 960w, /cdn-cgi/image/width=1920,format=auto/https://files.realpython.com/media/Gemini-CLI-vs-Claude-Code-Which-to-Choose-for-Python-Programming_Watermarked.d928bd4957f9.jpg 1920w&quot; sizes=&quot;(min-width: 1200px) 142px, (min-width: 1000px) 122px, (min-width: 780px) 112px, (min-width: 580px) 139px, calc(100vw - 62px)&quot;&gt;


          &lt;div class=&quot;card-img-overlay d-flex align-items-center&quot;&gt;
            &lt;div class=&quot;mx-auto&quot;&gt;
              &lt;span class=&quot;text-light&quot; style=&quot;opacity: 0.90;&quot;&gt;&lt;span class=&quot;icon baseline scale2x&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@quiz&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/a&gt;

    &lt;/div&gt;
    &lt;div class=&quot;col&quot;&gt;
      &lt;div class=&quot;mt-3 d-md-none&quot;&gt;&lt;/div&gt; 
      &lt;p class=&quot;small text-muted mb-0&quot;&gt;&lt;strong&gt;Interactive Quiz&lt;/strong&gt;&lt;/p&gt;
      &lt;a href=&quot;/quizzes/gemini-cli-vs-claude-code/&quot; class=&quot;stretched-link&quot;&gt;&lt;span class=&quot;my-0 h4&quot;&gt;Gemini CLI vs Claude Code: Which to Choose for Python Tasks&lt;/span&gt;&lt;/a&gt; 
      &lt;p class=&quot;text-muted mb-0 small&quot;&gt;Compare Gemini CLI and Claude Code across user experience, performance, code quality, and cost to find the right AI coding tool for you.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;

&lt;/div&gt;

&lt;h2 id=&quot;metrics-comparison-gemini-cli-vs-claude-code&quot;&gt;Metrics Comparison: Gemini CLI vs Claude Code&lt;a class=&quot;headerlink&quot; href=&quot;#metrics-comparison-gemini-cli-vs-claude-code&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To ground the comparisons in hands-on data, both tools are tested using the same prompt throughout this tutorial:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prompt&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Build a CLI-based mini to-do application in Python. It should allow users to create tasks, mark tasks as completed, list tasks with filtering for completed and pending tasks, delete tasks, include error handling, persist tasks to a local &lt;a href=&quot;https://realpython.com/python-json/&quot;&gt;JSON&lt;/a&gt; file, and include basic unit tests.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For a fair comparison, Gemini CLI is tested on its free tier using Gemini 3 Flash Preview, which is the default model the free tier provides access to. Claude Code is tested on the Pro plan using Claude Sonnet 4.6, which is the model Claude Code primarily uses for everyday interactions on that plan.&lt;/p&gt;
&lt;p&gt;Each tool will run this prompt three times. Completion time, &lt;a href=&quot;/ref/ai-coding-glossary/token/&quot; class=&quot;ref-link&quot;&gt;token&lt;/a&gt; usage, and the quality of the generated code are recorded from the runs and are referenced in the Performance, Code Quality, and Usage Cost sections of this tutorial.&lt;/p&gt;
&lt;div class=&quot;alert alert-primary&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;
If you want to learn more about these tools so you can compare them yourself, Real Python has you covered. The &lt;a href=&quot;https://realpython.com/how-to-use-gemini-cli/&quot;&gt;How to Use Google’s Gemini CLI for AI Code Assistance&lt;/a&gt; tutorial covers installation, authentication, and hands-on usage, while the &lt;a href=&quot;https://realpython.com/courses/getting-started-claude-code/&quot;&gt;Getting Started With Claude Code&lt;/a&gt; video course walks you through setup and core features.&lt;/p&gt;
&lt;p&gt;You should also be comfortable using your &lt;a href=&quot;https://realpython.com/terminal-commands/&quot;&gt;terminal&lt;/a&gt;, since both Gemini CLI and Claude Code are command-line tools.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The table below provides more detailed metrics to help with each comparison:&lt;/p&gt;
&lt;div class=&quot;table-responsive&quot;&gt;
&lt;table class=&quot;table table-hover&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Gemini CLI&lt;/th&gt;
&lt;th&gt;Claude Code&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;User Experience&lt;/td&gt;
&lt;td&gt;Intuitive, browser-based auth, terminal-native&lt;/td&gt;
&lt;td&gt;Minimal setup, terminal-native, strong project awareness&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Performance&lt;/td&gt;
&lt;td&gt;Good performance, however slower generation speed&lt;/td&gt;
&lt;td&gt;Good performance, code is generated generally faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code Quality&lt;/td&gt;
&lt;td&gt;Solid, better for exploratory tasks&lt;/td&gt;
&lt;td&gt;Strong, better for production-grade work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usage Cost&lt;/td&gt;
&lt;td&gt;Free tier available; paid plans for heavier use&lt;/td&gt;
&lt;td&gt;Requires a paid subscription to get started&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p&gt;The following sections explore each metric in detail, so you can decide which tool fits your workflow best.&lt;/p&gt;
&lt;h2 id=&quot;user-experience&quot;&gt;User Experience&lt;a class=&quot;headerlink&quot; href=&quot;#user-experience&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;When writing Python programs, it helps to be able to comfortably use your tools without dealing with unintuitive interfaces. Both Gemini CLI and Claude Code prioritize a smooth terminal experience, but user experience goes beyond the interface itself—installation, setup, available models, and features offered are also part of it.&lt;/p&gt;
&lt;h3 id=&quot;installation-and-setup&quot;&gt;Installation and Setup&lt;a class=&quot;headerlink&quot; href=&quot;#installation-and-setup&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;A few differences exist between Gemini CLI and Claude Code during installation. Gemini CLI requires a Google account for authentication. Claude Code doesn’t need a Google account. Instead, it requires an Anthropic subscription or &lt;a href=&quot;/ref/glossary/api/&quot; class=&quot;ref-link&quot;&gt;API&lt;/a&gt; key.&lt;/p&gt;
&lt;p&gt;Gemini CLI is first installed using npm:&lt;/p&gt;
&lt;code-block class=&quot;mb-3&quot; data-syntax-language=&quot;console&quot; data-is-repl=&quot;true&quot;&gt;
  &lt;div class=&quot;codeblock__header codeblock--yellow&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Shell&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
        &lt;span class=&quot;codeblock__output-toggle&quot; title=&quot;Toggle prompts and output&quot; aria-label=&quot;Toggle prompts and output&quot; role=&quot;button&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;icon baseline js-codeblock-output-on codeblock__header--icon-lower&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#regular--rectangle-terminal&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;npm&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;install&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-g&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;@google/gemini-cli
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot; aria-label=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;
&lt;/code-block&gt;
&lt;p&gt;You can also install Gemini CLI with Anaconda, MacPorts, or Homebrew, which you can find in the &lt;a href=&quot;https://geminicli.com/docs/&quot;&gt;Gemini CLI documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When installing Claude Code, you run the following commands:&lt;/p&gt;
&lt;/div&gt;&lt;h2&gt;&lt;a href=&quot;https://realpython.com/gemini-cli-vs-claude-code/?utm_source=realpython&amp;utm_medium=rss&quot;&gt;Read the full article at https://realpython.com/gemini-cli-vs-claude-code/ »&lt;/a&gt;&lt;/h2&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>The Real Python Podcast – Episode #291: Reassessing the LLM Landscape &amp; Summoning Ghosts</title>
      <id>https://realpython.com/podcasts/rpp/291/</id>
      <link href="https://realpython.com/podcasts/rpp/291/"/>
      <updated>2026-04-17T12:00:00+00:00</updated>
      <summary>What are the current techniques being employed to improve the performance of LLM-based systems? How is the industry shifting from post-training towards context engineering and multi-agent orchestration? This week on the show, Jodie Burchell, data scientist and Python Advocacy Team Lead at JetBrains, returns to discuss the current AI coding landscape.</summary>
      <content type="html">
        &lt;p&gt;What are the current techniques being employed to improve the performance of LLM-based systems? How is the industry shifting from post-training towards context engineering and multi-agent orchestration? This week on the show, Jodie Burchell, data scientist and Python Advocacy Team Lead at JetBrains, returns to discuss the current AI coding landscape.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Learning Path: Python Game Development</title>
      <id>https://realpython.com/learning-paths/python-game-development/</id>
      <link href="https://realpython.com/learning-paths/python-game-development/"/>
      <updated>2026-04-16T12:00:00+00:00</updated>
      <summary>Build Python games from command-line projects to 2D graphical games with turtle, Tkinter, Pygame, and Arcade.</summary>
      <content type="html">
        &lt;p&gt;Build Python games from command-line projects to 2D graphical games with turtle, Tkinter, Pygame, and Arcade.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Variables in Python: Usage and Best Practices</title>
      <id>https://realpython.com/python-variables/</id>
      <link href="https://realpython.com/python-variables/"/>
      <updated>2026-04-15T14:00:00+00:00</updated>
      <summary>Explore Python variables from creation to best practices, covering naming conventions, dynamic typing, variable scope, and type hints with examples.</summary>
      <content type="html">
        &lt;div&gt;&lt;p&gt;In Python, variables are symbolic names that refer to objects or values stored in your computer’s memory. They allow you to assign descriptive names to data, making it easier to manipulate and reuse values throughout your code. You create a Python variable by assigning a value using the syntax &lt;code&gt;variable_name = value&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;By the end of this tutorial, you’ll understand that:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Variables&lt;/strong&gt; in Python are &lt;strong&gt;symbolic names pointing to objects&lt;/strong&gt; or values in memory.&lt;/li&gt;
&lt;li&gt;You define variables by &lt;strong&gt;assigning them a value&lt;/strong&gt; using the &lt;strong&gt;assignment operator&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Python variables are &lt;strong&gt;dynamically typed&lt;/strong&gt;, allowing type changes through reassignment.&lt;/li&gt;
&lt;li&gt;Python variable names can include &lt;strong&gt;letters, digits, and underscores&lt;/strong&gt; but can’t start with a digit. You should use &lt;strong&gt;snake case&lt;/strong&gt; for multi-word names to improve readability.&lt;/li&gt;
&lt;li&gt;Variables exist in different &lt;strong&gt;scopes&lt;/strong&gt; (global, local, non-local, or built-in), which affects how you can access them.&lt;/li&gt;
&lt;li&gt;You can have an &lt;strong&gt;unlimited number&lt;/strong&gt; of variables in Python, limited only by computer memory.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get the most out of this tutorial, you should be familiar with Python’s &lt;a href=&quot;https://realpython.com/python-data-types/&quot;&gt;basic data types&lt;/a&gt; and have a general understanding of programming concepts like &lt;a href=&quot;https://realpython.com/python-for-loop/&quot;&gt;loops&lt;/a&gt; and &lt;a href=&quot;https://realpython.com/defining-your-own-python-function/&quot;&gt;functions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Don’t worry if you don’t have all this knowledge yet and you’re just getting started. You won’t &lt;em&gt;need&lt;/em&gt; this knowledge to benefit from working through the early sections of this tutorial.&lt;/p&gt;
&lt;div class=&quot;alert alert-warning&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong markdown&gt;Get Your Code:&lt;/strong&gt; &lt;a href=&quot;https://realpython.com/bonus/python-variables-code/&quot; class=&quot;alert-link&quot; data-toggle=&quot;modal&quot; data-target=&quot;#modal-python-variables-code&quot; markdown&gt;Click here to download the free sample code&lt;/a&gt; that shows you how to use variables in Python.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;container border rounded text-wrap-pretty my-3&quot;&gt;

  &lt;p class=&quot;my-3&quot;&gt;&lt;mark class=&quot;marker-highlight&quot;&gt;&lt;strong&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@quiz&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt; Take the Quiz:&lt;/strong&gt;&lt;/mark&gt; Test your knowledge with our interactive “Variables in Python: Usage and Best Practices” quiz. You’ll receive a score upon completion to help you track your learning progress:&lt;/p&gt;

  &lt;hr&gt;

  &lt;div class=&quot;row my-3&quot;&gt;
    &lt;div class=&quot;col-xs-12 col-sm-4 col-md-3 align-self-center&quot;&gt;

      &lt;a href=&quot;/quizzes/python-variables/&quot; tabindex=&quot;-1&quot;&gt;
        &lt;div class=&quot;embed-responsive embed-responsive-16by9&quot;&gt;

            &lt;img class=&quot;card-img-top m-0 p-0 embed-responsive-item rounded&quot; style=&quot;object-fit: contain; background: #ffc973;&quot; alt=&quot;Variables in Python&quot; src=&quot;https://files.realpython.com/media/UPDATE-Variables-in-Python_Watermarked.7d8b51f3adad.jpg&quot; width=&quot;1920&quot; height=&quot;1080&quot; srcset=&quot;/cdn-cgi/image/width=480,format=auto/https://files.realpython.com/media/UPDATE-Variables-in-Python_Watermarked.7d8b51f3adad.jpg 480w, /cdn-cgi/image/width=640,format=auto/https://files.realpython.com/media/UPDATE-Variables-in-Python_Watermarked.7d8b51f3adad.jpg 640w, /cdn-cgi/image/width=960,format=auto/https://files.realpython.com/media/UPDATE-Variables-in-Python_Watermarked.7d8b51f3adad.jpg 960w, /cdn-cgi/image/width=1920,format=auto/https://files.realpython.com/media/UPDATE-Variables-in-Python_Watermarked.7d8b51f3adad.jpg 1920w&quot; sizes=&quot;(min-width: 1200px) 142px, (min-width: 1000px) 122px, (min-width: 780px) 112px, (min-width: 580px) 139px, calc(100vw - 62px)&quot;&gt;


          &lt;div class=&quot;card-img-overlay d-flex align-items-center&quot;&gt;
            &lt;div class=&quot;mx-auto&quot;&gt;
              &lt;span class=&quot;text-light&quot; style=&quot;opacity: 0.90;&quot;&gt;&lt;span class=&quot;icon baseline scale2x&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@quiz&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/a&gt;

    &lt;/div&gt;
    &lt;div class=&quot;col&quot;&gt;
      &lt;div class=&quot;mt-3 d-md-none&quot;&gt;&lt;/div&gt; 
      &lt;p class=&quot;small text-muted mb-0&quot;&gt;&lt;strong&gt;Interactive Quiz&lt;/strong&gt;&lt;/p&gt;
      &lt;a href=&quot;/quizzes/python-variables/&quot; class=&quot;stretched-link&quot;&gt;&lt;span class=&quot;my-0 h4&quot;&gt;Variables in Python: Usage and Best Practices&lt;/span&gt;&lt;/a&gt; 
      &lt;p class=&quot;text-muted mb-0 small&quot;&gt;Test your understanding of Python variables, from creation and naming conventions to dynamic typing, scopes, and type hints.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;

&lt;/div&gt;

&lt;h2 id=&quot;getting-to-know-variables-in-python&quot;&gt;Getting to Know Variables in Python&lt;a class=&quot;headerlink&quot; href=&quot;#getting-to-know-variables-in-python&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In Python, &lt;a href=&quot;https://en.wikipedia.org/wiki/Variable_%28computer_science%29&quot;&gt;variables&lt;/a&gt; are names associated with concrete objects or values stored in your computer’s memory. By associating a variable with a value, you can refer to the value using a descriptive name and reuse it as many times as needed in your code.&lt;/p&gt;
&lt;p&gt;Variables behave as if they were the value they refer to. To use variables in your code, you first need to learn how to create them, which is pretty straightforward in Python.&lt;/p&gt;
&lt;h3 id=&quot;creating-variables-with-assignments&quot;&gt;Creating Variables With Assignments&lt;a class=&quot;headerlink&quot; href=&quot;#creating-variables-with-assignments&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;The primary way to create a variable in Python is to &lt;strong&gt;assign&lt;/strong&gt; it a value using the assignment operator and the following syntax:&lt;/p&gt;
&lt;code-block class=&quot;mb-3&quot; data-syntax-language=&quot;python_syntax&quot;&gt;
  &lt;div class=&quot;codeblock__header codeblock--blue&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Python Syntax&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;variable_name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot; aria-label=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;
&lt;/code-block&gt;
&lt;p&gt;In this syntax, you have the variable’s name on the left, then the assignment (&lt;code&gt;=&lt;/code&gt;) operator, followed by the value you want to assign to the variable at hand. The value in this construct can be any Python object, including &lt;a href=&quot;https://realpython.com/python-strings/&quot;&gt;strings&lt;/a&gt;, &lt;a href=&quot;https://realpython.com/python-numbers/&quot;&gt;numbers&lt;/a&gt;, &lt;a href=&quot;https://realpython.com/python-list/&quot;&gt;lists&lt;/a&gt;, &lt;a href=&quot;https://realpython.com/python-dicts/&quot;&gt;dictionaries&lt;/a&gt;, or even custom objects.&lt;/p&gt;
&lt;div class=&quot;alert alert-primary&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; To learn more about assignments, check out &lt;a href=&quot;https://realpython.com/python-assignment-operator/&quot;&gt;Python’s Assignment Operator: Write Robust Assignments&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Here are a few examples of variables:&lt;/p&gt;
&lt;code-block class=&quot;mb-3&quot; data-syntax-language=&quot;pycon&quot; data-is-repl=&quot;true&quot;&gt;
  &lt;div class=&quot;codeblock__header codeblock--blue&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Python&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
        &lt;span class=&quot;codeblock__output-toggle&quot; title=&quot;Toggle prompts and output&quot; aria-label=&quot;Toggle prompts and output&quot; role=&quot;button&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;icon baseline js-codeblock-output-on codeblock__header--icon-lower&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#regular--rectangle-terminal&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;word&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Python&quot;&lt;/span&gt;

&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;number&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;42&lt;/span&gt;

&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;coefficient&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;2.87&lt;/span&gt;

&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fruits&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;apple&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;mango&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;grape&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ordinals&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;first&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;second&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;third&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;SomeCustomClass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;pass&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;instance&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;SomeCustomClass&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot; aria-label=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;
&lt;/code-block&gt;
&lt;p&gt;In this code, you’ve defined several variables by assigning values to names. The first five examples include variables that refer to different &lt;a href=&quot;https://realpython.com/python-data-types/&quot;&gt;built-in types&lt;/a&gt;. The last example shows that variables can also refer to custom objects like an instance of your &lt;code&gt;SomeCustomClass&lt;/code&gt; class.&lt;/p&gt;
&lt;h3 id=&quot;setting-and-changing-a-variables-data-type&quot;&gt;Setting and Changing a Variable’s Data Type&lt;a class=&quot;headerlink&quot; href=&quot;#setting-and-changing-a-variables-data-type&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Apart from a variable’s value, it’s also important to consider the &lt;strong&gt;data type&lt;/strong&gt; of the value. When you think about a variable’s type, you’re considering whether the variable refers to a string, integer, floating-point number, list, tuple, dictionary, custom object, or another data type.&lt;/p&gt;
&lt;p&gt;Python is a dynamically typed language, which means that variable types are determined and checked at runtime rather than during compilation. Because of this, you don’t need to specify a variable’s type when you’re creating the variable. Python will infer a variable’s type from the assigned object.&lt;/p&gt;
&lt;div class=&quot;alert alert-primary&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; In Python, variables themselves don’t have data types. Instead, the objects that variables reference have types.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;For example, consider the following variables:&lt;/p&gt;
&lt;code-block class=&quot;mb-3&quot; data-syntax-language=&quot;pycon&quot; data-is-repl=&quot;true&quot;&gt;
  &lt;div class=&quot;codeblock__header codeblock--blue&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Python&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
        &lt;span class=&quot;codeblock__output-toggle&quot; title=&quot;Toggle prompts and output&quot; aria-label=&quot;Toggle prompts and output&quot; role=&quot;button&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;icon baseline js-codeblock-output-on codeblock__header--icon-lower&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#regular--rectangle-terminal&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Jane Doe&quot;&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;age&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;19&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;subjects&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Math&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;English&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Physics&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Chemistry&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;lt;class &#x27;str&#x27;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;age&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;lt;class &#x27;int&#x27;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;subjects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&amp;lt;class &#x27;list&#x27;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot; aria-label=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;
&lt;/code-block&gt;
&lt;p&gt;In this example, &lt;code&gt;name&lt;/code&gt; refers to the &lt;code&gt;&quot;Jane Doe&quot;&lt;/code&gt; value, so the type of &lt;code&gt;name&lt;/code&gt; is &lt;code&gt;str&lt;/code&gt;. Similarly, &lt;code&gt;age&lt;/code&gt; refers to the integer number &lt;code&gt;19&lt;/code&gt;, so its type is &lt;code&gt;int&lt;/code&gt;. Finally, &lt;code&gt;subjects&lt;/code&gt; refers to a list, so its type is &lt;code&gt;list&lt;/code&gt;. Note that you don’t have to explicitly tell Python which type each variable is. Python determines and sets the type by checking the type of the assigned value.&lt;/p&gt;
&lt;/div&gt;&lt;h2&gt;&lt;a href=&quot;https://realpython.com/python-variables/?utm_source=realpython&amp;utm_medium=rss&quot;&gt;Read the full article at https://realpython.com/python-variables/ »&lt;/a&gt;&lt;/h2&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Vector Databases and Embeddings With ChromaDB</title>
      <id>https://realpython.com/courses/vector-databases-embeddings-chromadb/</id>
      <link href="https://realpython.com/courses/vector-databases-embeddings-chromadb/"/>
      <updated>2026-04-14T14:00:00+00:00</updated>
      <summary>Learn how to use ChromaDB, an open-source vector database, to store embeddings and give context to large language models in Python.</summary>
      <content type="html">
        &lt;p&gt;The era of &lt;a href=&quot;https://en.wikipedia.org/wiki/Large_language_model&quot;&gt;large language models&lt;/a&gt; (LLMs) is here, bringing with it rapidly evolving libraries like &lt;a href=&quot;https://docs.trychroma.com/&quot;&gt;ChromaDB&lt;/a&gt; that help augment LLM applications. You&amp;rsquo;ve most likely heard of chatbots like OpenAI&amp;rsquo;s &lt;a href=&quot;https://realpython.com/chatgpt-coding-mentor-python/&quot;&gt;ChatGPT&lt;/a&gt;, and perhaps you&amp;rsquo;ve even experienced their remarkable ability to reason about &lt;a href=&quot;https://en.wikipedia.org/wiki/Natural_language_processing&quot;&gt;natural language processing (NLP)&lt;/a&gt; problems.&lt;/p&gt;
&lt;p&gt;Modern LLMs, while imperfect, can accurately solve a wide range of problems and provide correct answers to many questions. However, due to the limits of their training and the number of text tokens they can process, LLMs aren&amp;rsquo;t a silver bullet for all tasks.&lt;/p&gt;
&lt;p&gt;You wouldn&amp;rsquo;t expect an LLM to deliver relevant responses about topics that don&amp;rsquo;t appear in its training data. For example, if you asked ChatGPT to summarize information in confidential company documents, you&amp;rsquo;d be out of luck. You could show some of these documents to ChatGPT, but there&amp;rsquo;s a limit to how many documents you can upload before you exceed ChatGPT&amp;rsquo;s maximum token count. How would you select which documents to show ChatGPT?&lt;/p&gt;
&lt;p&gt;To address these limitations and scale your LLM applications, a great option is to use a vector database like ChromaDB. A &lt;strong&gt;vector database&lt;/strong&gt; allows you to store encoded unstructured objects, like text, as lists of numbers that can be compared to one another. For instance, you can find a collection of documents relevant to a question you&amp;rsquo;d like an LLM to answer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In this video course, you&amp;rsquo;ll learn about:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Representing &lt;strong&gt;unstructured objects&lt;/strong&gt; with &lt;strong&gt;vectors&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Using &lt;strong&gt;word&lt;/strong&gt; and &lt;strong&gt;text embeddings&lt;/strong&gt; in Python&lt;/li&gt;
&lt;li&gt;Harnessing the power of &lt;strong&gt;vector databases&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Encoding&lt;/strong&gt; and &lt;strong&gt;querying&lt;/strong&gt; over documents with ChromaDB&lt;/li&gt;
&lt;li&gt;Providing &lt;strong&gt;context&lt;/strong&gt; to &lt;strong&gt;LLMs&lt;/strong&gt; like ChatGPT with ChromaDB&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After watching, you&amp;rsquo;ll have the foundational knowledge to use ChromaDB in your NLP or LLM applications. Before watching, you should be comfortable with the &lt;a href=&quot;https://realpython.com/learning-paths/python-basics/&quot;&gt;basics of Python&lt;/a&gt; and high school math.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>How to Add Features to a Python Project With Codex CLI</title>
      <id>https://realpython.com/codex-cli/</id>
      <link href="https://realpython.com/codex-cli/"/>
      <updated>2026-04-13T14:00:00+00:00</updated>
      <summary>Learn how to use Codex CLI to add features to Python projects via the terminal. Master AI-powered coding without needing a browser or IDE plugins.</summary>
      <content type="html">
        &lt;div&gt;&lt;p&gt;After reading this guide, you’ll be able to use Codex CLI to add features to a Python project directly from your terminal. &lt;strong&gt;Codex CLI&lt;/strong&gt; is an AI-powered coding assistant that runs inside your terminal. It understands your project structure, reads your files, and proposes multi-file changes using natural language instructions.&lt;/p&gt;
&lt;p&gt;Instead of copying code from a browser or relying on an &lt;a href=&quot;/ref/glossary/ide/&quot; class=&quot;ref-link&quot;&gt;IDE&lt;/a&gt; plugin, you’ll use &lt;a href=&quot;/ref/ai-coding-tools/codex-cli/&quot; class=&quot;ref-link&quot;&gt;Codex CLI&lt;/a&gt; to implement a real feature in a multi-file Python project directly from your terminal:&lt;/p&gt;
&lt;figure&gt;
  &lt;div class=&quot;embed-responsive embed-responsive-16by9 rounded mb-3 border&quot;&gt;
    &lt;iframe loading=&quot;lazy&quot; class=&quot;embed-responsive-item&quot; src=&quot;https://player.vimeo.com/video/1178445650?background=1&quot; frameborder=&quot;0&quot; allow=&quot;fullscreen&quot; allowfullscreen&gt;&lt;/iframe&gt;
  &lt;/div&gt;
  &lt;figcaption class=&quot;figure-caption text-center&quot;&gt;Example of Using Codex CLI to Implement a Project Feature&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;In the following steps, you’ll install and configure Codex CLI, use it to implement a deletion feature in a contact book app, and then refine that feature through iterative prompting.&lt;/p&gt;
&lt;div class=&quot;container border rounded text-wrap-pretty my-3&quot;&gt;

  &lt;p class=&quot;my-3&quot;&gt;&lt;mark class=&quot;marker-highlight&quot;&gt;&lt;strong&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@quiz&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt; Take the Quiz:&lt;/strong&gt;&lt;/mark&gt; Test your knowledge with our interactive “How to Add Features to a Python Project With Codex CLI” quiz. You’ll receive a score upon completion to help you track your learning progress:&lt;/p&gt;

  &lt;hr&gt;

  &lt;div class=&quot;row my-3&quot;&gt;
    &lt;div class=&quot;col-xs-12 col-sm-4 col-md-3 align-self-center&quot;&gt;

      &lt;a href=&quot;/quizzes/codex-cli/&quot; tabindex=&quot;-1&quot;&gt;
        &lt;div class=&quot;embed-responsive embed-responsive-16by9&quot;&gt;

            &lt;img class=&quot;card-img-top m-0 p-0 embed-responsive-item rounded&quot; style=&quot;object-fit: contain; background: #e5c6aa;&quot; alt=&quot;A person standing next to a machine labeled Codex CLI that processes code through a conveyor belt, with a terminal screen, colorful blocks, and buttons labeled Add, Delete, and Clear All.&quot; src=&quot;https://files.realpython.com/media/How-to-Use-Codex-CLI-for-AI-Assisted-Coding-in-Your-Terminal_Watermarked.43b0a00264fa.jpg&quot; width=&quot;1920&quot; height=&quot;1080&quot; srcset=&quot;/cdn-cgi/image/width=480,format=auto/https://files.realpython.com/media/How-to-Use-Codex-CLI-for-AI-Assisted-Coding-in-Your-Terminal_Watermarked.43b0a00264fa.jpg 480w, /cdn-cgi/image/width=640,format=auto/https://files.realpython.com/media/How-to-Use-Codex-CLI-for-AI-Assisted-Coding-in-Your-Terminal_Watermarked.43b0a00264fa.jpg 640w, /cdn-cgi/image/width=960,format=auto/https://files.realpython.com/media/How-to-Use-Codex-CLI-for-AI-Assisted-Coding-in-Your-Terminal_Watermarked.43b0a00264fa.jpg 960w, /cdn-cgi/image/width=1920,format=auto/https://files.realpython.com/media/How-to-Use-Codex-CLI-for-AI-Assisted-Coding-in-Your-Terminal_Watermarked.43b0a00264fa.jpg 1920w&quot; sizes=&quot;(min-width: 1200px) 142px, (min-width: 1000px) 122px, (min-width: 780px) 112px, (min-width: 580px) 139px, calc(100vw - 62px)&quot;&gt;


          &lt;div class=&quot;card-img-overlay d-flex align-items-center&quot;&gt;
            &lt;div class=&quot;mx-auto&quot;&gt;
              &lt;span class=&quot;text-light&quot; style=&quot;opacity: 0.90;&quot;&gt;&lt;span class=&quot;icon baseline scale2x&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@quiz&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/a&gt;

    &lt;/div&gt;
    &lt;div class=&quot;col&quot;&gt;
      &lt;div class=&quot;mt-3 d-md-none&quot;&gt;&lt;/div&gt; 
      &lt;p class=&quot;small text-muted mb-0&quot;&gt;&lt;strong&gt;Interactive Quiz&lt;/strong&gt;&lt;/p&gt;
      &lt;a href=&quot;/quizzes/codex-cli/&quot; class=&quot;stretched-link&quot;&gt;&lt;span class=&quot;my-0 h4&quot;&gt;How to Add Features to a Python Project With Codex CLI&lt;/span&gt;&lt;/a&gt; 
      &lt;p class=&quot;text-muted mb-0 small&quot;&gt;Test your knowledge of Codex CLI, the AI-powered terminal tool for adding features to Python projects with natural language.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;

&lt;/div&gt;

&lt;h2 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;a class=&quot;headerlink&quot; href=&quot;#prerequisites&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;To follow this guide, you should be familiar with the Python language. You’ll also need an OpenAI account with either a paid &lt;a href=&quot;/ref/ai-coding-tools/chatgpt/&quot; class=&quot;ref-link&quot;&gt;ChatGPT&lt;/a&gt; subscription or a valid &lt;a href=&quot;/ref/glossary/api/&quot; class=&quot;ref-link&quot;&gt;API&lt;/a&gt; key, which you’ll connect to Codex CLI once you install it. Additionally, you’ll need to have &lt;a href=&quot;https://nodejs.org/&quot;&gt;Node.js&lt;/a&gt; installed, since Codex CLI is distributed as an npm package.&lt;/p&gt;
&lt;p&gt;To make it easier for you to experiment with Codex CLI, download the &lt;em&gt;RP Contacts&lt;/em&gt; project by clicking the link below:&lt;/p&gt;
&lt;div class=&quot;alert alert-warning&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong markdown&gt;Get Your Code:&lt;/strong&gt; &lt;a href=&quot;https://realpython.com/bonus/codex-cli-code/&quot; class=&quot;alert-link&quot; data-toggle=&quot;modal&quot; data-target=&quot;#modal-codex-cli-code&quot; markdown&gt;Click here to download the free source code for the RP Contacts sample project&lt;/a&gt; used in this tutorial.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The project &lt;em&gt;RP Contacts&lt;/em&gt; is a text-based interface (TUI) that allows you to manage contacts directly in the terminal through a &lt;a href=&quot;https://github.com/textualize/textual&quot;&gt;Textual&lt;/a&gt; app. It’s an adapted version of the project from Real Python’s tutorial &lt;a href=&quot;https://realpython.com/contact-book-python-textual/&quot;&gt;Build a Contact Book App With Python, Textual, and SQLite&lt;/a&gt;. It differs from the original in that it uses &lt;a href=&quot;/ref/tools/uv/&quot; class=&quot;ref-link&quot;&gt;&lt;code&gt;uv&lt;/code&gt;&lt;/a&gt; to manage the project, and the TUI buttons &lt;em&gt;Delete&lt;/em&gt; and &lt;em&gt;Clear All&lt;/em&gt; haven’t been implemented—that’s what you’ll use Codex CLI for.&lt;/p&gt;
&lt;p&gt;Once you’ve downloaded the project, you want to check that you can run it. As mentioned, the project uses &lt;a href=&quot;https://realpython.com/python-uv/&quot;&gt;&lt;code&gt;uv&lt;/code&gt;&lt;/a&gt; for dependency management—you can tell by the &lt;code&gt;uv.lock&lt;/code&gt; file in the project root—so make sure you have &lt;code&gt;uv&lt;/code&gt; installed. If you don’t have &lt;code&gt;uv&lt;/code&gt; yet, follow &lt;a href=&quot;https://docs.astral.sh/uv/#installation&quot;&gt;the official installation instructions&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once you have &lt;code&gt;uv&lt;/code&gt; installed and you’re at the root directory of the project, you can run the project:&lt;/p&gt;
&lt;code-block class=&quot;mb-3&quot; data-syntax-language=&quot;console&quot; data-is-repl=&quot;true&quot;&gt;
  &lt;div class=&quot;codeblock__header codeblock--yellow&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Shell&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
        &lt;span class=&quot;codeblock__output-toggle&quot; title=&quot;Toggle prompts and output&quot; aria-label=&quot;Toggle prompts and output&quot; role=&quot;button&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;icon baseline js-codeblock-output-on codeblock__header--icon-lower&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#regular--rectangle-terminal&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;uv&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;run&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;rpcontacts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot; aria-label=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;
&lt;/code-block&gt;
&lt;p&gt;When you run the command &lt;code&gt;rpcontacts&lt;/code&gt; through &lt;code&gt;uv&lt;/code&gt; for the first time, &lt;code&gt;uv&lt;/code&gt; will create a &lt;a href=&quot;https://realpython.com/python-virtual-environments-a-primer/&quot;&gt;virtual environment&lt;/a&gt;, install the dependencies of your project, and start the &lt;em&gt;RP Contacts&lt;/em&gt; TUI. If all goes well, you should see a TUI in your terminal with a couple of buttons and an empty contact listing:&lt;/p&gt;
&lt;figure class=&quot;js-lightbox&quot;&gt;&lt;a href=&quot;https://files.realpython.com/media/contact-book-planned-main-tui.323905a20273.png&quot; target=&quot;_blank&quot;&gt;&lt;img loading=&quot;lazy&quot; class=&quot;img-fluid mx-auto d-block &quot; src=&quot;https://files.realpython.com/media/contact-book-planned-main-tui.323905a20273.png&quot; width=&quot;2048&quot; height=&quot;1148&quot; srcset=&quot;/cdn-cgi/image/width=512,format=auto/https://files.realpython.com/media/contact-book-planned-main-tui.323905a20273.png 512w, /cdn-cgi/image/width=682,format=auto/https://files.realpython.com/media/contact-book-planned-main-tui.323905a20273.png 682w, /cdn-cgi/image/width=1024,format=auto/https://files.realpython.com/media/contact-book-planned-main-tui.323905a20273.png 1024w, /cdn-cgi/image/width=2048,format=auto/https://files.realpython.com/media/contact-book-planned-main-tui.323905a20273.png 2048w&quot; sizes=&quot;(min-width: 1200px) 690px, (min-width: 780px) calc(-5vw + 669px), (min-width: 580px) 510px, calc(100vw - 30px)&quot; alt=&quot;Contact Book Planned Main TUI&quot; data-asset=&quot;5928&quot;&gt;&lt;/a&gt;&lt;/figure&gt;

&lt;p&gt;Once the TUI opens, create some test contacts by using the &lt;em&gt;Add&lt;/em&gt; button and filling in the form that pops up. After creating a couple of fake contacts, quit the application by pressing &lt;span class=&quot;keys&quot;&gt;&lt;kbd class=&quot;key-q&quot;&gt;Q&lt;/kbd&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Finally, you’ll want to initialize a &lt;a href=&quot;/ref/tools/git/&quot; class=&quot;ref-link&quot;&gt;Git&lt;/a&gt; repository at the root of your project and commit all your files:&lt;/p&gt;
&lt;code-block class=&quot;mb-3&quot; data-syntax-language=&quot;console&quot; data-is-repl=&quot;true&quot;&gt;
  &lt;div class=&quot;codeblock__header codeblock--yellow&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Shell&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
        &lt;span class=&quot;codeblock__output-toggle&quot; title=&quot;Toggle prompts and output&quot; aria-label=&quot;Toggle prompts and output&quot; role=&quot;button&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;icon baseline js-codeblock-output-on codeblock__header--icon-lower&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#regular--rectangle-terminal&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;git&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;init&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;.
&lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;git&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;add&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;.
&lt;span class=&quot;gp&quot;&gt;$ &lt;/span&gt;git&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;commit&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;-m&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;First commit.&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot; aria-label=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;
&lt;/code-block&gt;
&lt;p&gt;Codex CLI will modify your code, and you can never tell whether the changes will be good or not. Versioning your code makes it straightforward to roll back any changes made by &lt;a href=&quot;/ref/ai-coding-glossary/llm/&quot; class=&quot;ref-link&quot;&gt;LLMs&lt;/a&gt; if you don’t like them.&lt;/p&gt;
&lt;p&gt;If you want to explore other &lt;a href=&quot;https://realpython.com/ai-coding-agents-guide/&quot;&gt;AI-powered coding tools&lt;/a&gt; alongside Codex CLI, Real Python’s &lt;a href=&quot;https://realpython.com/learning-paths/coding-with-ai/&quot;&gt;Python Coding With AI learning path&lt;/a&gt; brings together tutorials and video courses on AI-assisted coding, &lt;a href=&quot;/ref/ai-coding-glossary/prompt-engineering/&quot; class=&quot;ref-link&quot;&gt;prompt engineering&lt;/a&gt;, and LLM development.&lt;/p&gt;
&lt;h2 id=&quot;step-1-install-and-configure-codex-cli&quot;&gt;Step 1: Install and Configure Codex CLI&lt;a class=&quot;headerlink&quot; href=&quot;#step-1-install-and-configure-codex-cli&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;With all the accessory setup out of the way, it’s now time to install Codex CLI. For that, you’ll want to check the &lt;a href=&quot;https://developers.openai.com/codex/quickstart/?setup=cli&quot;&gt;official OpenAI documentation&lt;/a&gt; to see the most up-to-date installation instructions. As of now, OpenAI recommends using &lt;a href=&quot;https://www.npmjs.com&quot;&gt;npm&lt;/a&gt;:&lt;/p&gt;
&lt;/div&gt;&lt;h2&gt;&lt;a href=&quot;https://realpython.com/codex-cli/?utm_source=realpython&amp;utm_medium=rss&quot;&gt;Read the full article at https://realpython.com/codex-cli/ »&lt;/a&gt;&lt;/h2&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>The Real Python Podcast – Episode #290: Advice on Managing Projects &amp; Making Python Classes Friendly</title>
      <id>https://realpython.com/podcasts/rpp/290/</id>
      <link href="https://realpython.com/podcasts/rpp/290/"/>
      <updated>2026-04-10T12:00:00+00:00</updated>
      <summary>What goes into managing a major project? What techniques can you employ for a project that&#x27;s in crisis? Christopher Trudeau is back on the show this week with another batch of PyCoder&#x27;s Weekly articles and projects.</summary>
      <content type="html">
        &lt;p&gt;What goes into managing a major project? What techniques can you employ for a project that&#x27;s in crisis? Christopher Trudeau is back on the show this week with another batch of PyCoder&#x27;s Weekly articles and projects.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Dictionaries in Python</title>
      <id>https://realpython.com/python-dicts/</id>
      <link href="https://realpython.com/python-dicts/"/>
      <updated>2026-04-08T14:00:00+00:00</updated>
      <summary>Learn how dictionaries in Python work: create and modify key-value pairs using dict literals, the dict() constructor, built-in methods, and operators.</summary>
      <content type="html">
        &lt;div&gt;&lt;p&gt;Python dictionaries are a powerful built-in data type that allows you to store key-value pairs for efficient data retrieval and manipulation. Learning about them is essential for developers who want to process data efficiently. In this tutorial, you’ll explore how to create dictionaries using literals and the &lt;code&gt;dict()&lt;/code&gt; constructor, as well as how to use Python’s operators and built-in functions to manipulate them.&lt;/p&gt;
&lt;p&gt;By learning about Python dictionaries, you’ll be able to access values through key lookups and modify dictionary content using various methods. This knowledge will help you in data processing, configuration management, and dealing with JSON and CSV data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;By the end of this tutorial, you’ll understand that:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A dictionary in Python is a &lt;strong&gt;mutable collection of key-value pairs&lt;/strong&gt; that allows for efficient data retrieval using unique keys.&lt;/li&gt;
&lt;li&gt;Both &lt;code&gt;dict()&lt;/code&gt; and &lt;code&gt;{}&lt;/code&gt; can create dictionaries in Python. Use &lt;code&gt;{}&lt;/code&gt; for &lt;strong&gt;concise syntax&lt;/strong&gt; and &lt;code&gt;dict()&lt;/code&gt; for &lt;strong&gt;dynamic creation&lt;/strong&gt; from iterable objects.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dict()&lt;/code&gt; is a &lt;strong&gt;class&lt;/strong&gt; used to create dictionaries. However, it’s &lt;strong&gt;commonly called a built-in function&lt;/strong&gt; in Python.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.__dict__&lt;/code&gt; is a &lt;strong&gt;special attribute&lt;/strong&gt; in Python that holds an object’s &lt;strong&gt;writable attributes&lt;/strong&gt; in a dictionary.&lt;/li&gt;
&lt;li&gt;Python &lt;code&gt;dict&lt;/code&gt; is implemented as a &lt;strong&gt;hashmap&lt;/strong&gt;, which allows for &lt;strong&gt;fast key lookups&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To get the most out of this tutorial, you should be familiar with basic Python syntax and concepts such as &lt;a href=&quot;https://realpython.com/python-variables/&quot;&gt;variables&lt;/a&gt;, &lt;a href=&quot;https://realpython.com/python-for-loop/&quot;&gt;loops&lt;/a&gt;, and &lt;a href=&quot;https://realpython.com/python-built-in-functions/&quot;&gt;built-in functions&lt;/a&gt;. Some experience with &lt;a href=&quot;https://realpython.com/python-data-types/&quot;&gt;basic Python data types&lt;/a&gt; will also be helpful.&lt;/p&gt;
&lt;div class=&quot;alert alert-warning&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong markdown&gt;Get Your Code:&lt;/strong&gt; &lt;a href=&quot;https://realpython.com/bonus/python-dicts-code/&quot; class=&quot;alert-link&quot; data-toggle=&quot;modal&quot; data-target=&quot;#modal-python-dicts-code&quot; markdown&gt;Click here to download the free sample code&lt;/a&gt; that you’ll use to learn about dictionaries in Python.&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;container border rounded text-wrap-pretty my-3&quot;&gt;

  &lt;p class=&quot;my-3&quot;&gt;&lt;mark class=&quot;marker-highlight&quot;&gt;&lt;strong&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@quiz&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt; Take the Quiz:&lt;/strong&gt;&lt;/mark&gt; Test your knowledge with our interactive “Dictionaries in Python” quiz. You’ll receive a score upon completion to help you track your learning progress:&lt;/p&gt;

  &lt;hr&gt;

  &lt;div class=&quot;row my-3&quot;&gt;
    &lt;div class=&quot;col-xs-12 col-sm-4 col-md-3 align-self-center&quot;&gt;

      &lt;a href=&quot;/quizzes/dictionaries-in-python/&quot; tabindex=&quot;-1&quot;&gt;
        &lt;div class=&quot;embed-responsive embed-responsive-16by9&quot;&gt;

            &lt;img class=&quot;card-img-top m-0 p-0 embed-responsive-item rounded&quot; style=&quot;object-fit: contain; background: #e5c5ac;&quot; alt=&quot;Dictionaries in Python&quot; src=&quot;https://files.realpython.com/media/Dictionaries-in-Python_Watermarked.3656a2293c00.jpg&quot; width=&quot;1920&quot; height=&quot;1080&quot; srcset=&quot;/cdn-cgi/image/width=480,format=auto/https://files.realpython.com/media/Dictionaries-in-Python_Watermarked.3656a2293c00.jpg 480w, /cdn-cgi/image/width=640,format=auto/https://files.realpython.com/media/Dictionaries-in-Python_Watermarked.3656a2293c00.jpg 640w, /cdn-cgi/image/width=960,format=auto/https://files.realpython.com/media/Dictionaries-in-Python_Watermarked.3656a2293c00.jpg 960w, /cdn-cgi/image/width=1920,format=auto/https://files.realpython.com/media/Dictionaries-in-Python_Watermarked.3656a2293c00.jpg 1920w&quot; sizes=&quot;(min-width: 1200px) 142px, (min-width: 1000px) 122px, (min-width: 780px) 112px, (min-width: 580px) 139px, calc(100vw - 62px)&quot;&gt;


          &lt;div class=&quot;card-img-overlay d-flex align-items-center&quot;&gt;
            &lt;div class=&quot;mx-auto&quot;&gt;
              &lt;span class=&quot;text-light&quot; style=&quot;opacity: 0.90;&quot;&gt;&lt;span class=&quot;icon baseline scale2x&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@quiz&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/a&gt;

    &lt;/div&gt;
    &lt;div class=&quot;col&quot;&gt;
      &lt;div class=&quot;mt-3 d-md-none&quot;&gt;&lt;/div&gt; 
      &lt;p class=&quot;small text-muted mb-0&quot;&gt;&lt;strong&gt;Interactive Quiz&lt;/strong&gt;&lt;/p&gt;
      &lt;a href=&quot;/quizzes/dictionaries-in-python/&quot; class=&quot;stretched-link&quot;&gt;&lt;span class=&quot;my-0 h4&quot;&gt;Dictionaries in Python&lt;/span&gt;&lt;/a&gt; 
      &lt;p class=&quot;text-muted mb-0 small&quot;&gt;Test your knowledge of Python&#x27;s dict data type: how to create, access, and modify key-value pairs using built-in methods and operators.&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;

&lt;/div&gt;

&lt;h2 id=&quot;getting-started-with-python-dictionaries&quot;&gt;Getting Started With Python Dictionaries&lt;a class=&quot;headerlink&quot; href=&quot;#getting-started-with-python-dictionaries&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Dictionaries&lt;/strong&gt; are one of Python’s most important and useful built-in data types. They provide a mutable collection of key-value pairs that lets you efficiently access and mutate values through their corresponding keys:&lt;/p&gt;
&lt;code-block class=&quot;mb-3&quot; data-syntax-language=&quot;pycon&quot; data-is-repl=&quot;true&quot;&gt;
  &lt;div class=&quot;codeblock__header codeblock--blue&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Python&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
        &lt;span class=&quot;codeblock__output-toggle&quot; title=&quot;Toggle prompts and output&quot; aria-label=&quot;Toggle prompts and output&quot; role=&quot;button&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;icon baseline js-codeblock-output-on codeblock__header--icon-lower&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#regular--rectangle-terminal&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    &lt;span class=&quot;s2&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;green&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    &lt;span class=&quot;s2&quot;&gt;&quot;width&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;42&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    &lt;span class=&quot;s2&quot;&gt;&quot;height&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    &lt;span class=&quot;s2&quot;&gt;&quot;font&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Courier&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Access a value through its key&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;color&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;&#x27;green&#x27;&lt;/span&gt;

&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;# Update a value&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;font&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Helvetica&quot;&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;config&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;    &#x27;color&#x27;: &#x27;green&#x27;,&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;    &#x27;width&#x27;: 42,&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;    &#x27;height&#x27;: 100,&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;    &#x27;font&#x27;: &#x27;Helvetica&#x27;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot; aria-label=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;
&lt;/code-block&gt;
&lt;p&gt;A Python dictionary consists of a collection of key-value pairs, where each key corresponds to its associated value. In this example, &lt;code&gt;&quot;color&quot;&lt;/code&gt; is a key, and &lt;code&gt;&quot;green&quot;&lt;/code&gt; is the associated value.&lt;/p&gt;
&lt;p&gt;Dictionaries are a fundamental part of Python. You’ll find them behind core concepts like scopes and namespaces as seen with the &lt;a href=&quot;https://realpython.com/python-built-in-functions/&quot;&gt;built-in functions&lt;/a&gt; &lt;code&gt;globals()&lt;/code&gt; and &lt;code&gt;locals()&lt;/code&gt;:&lt;/p&gt;
&lt;code-block class=&quot;mb-3&quot; data-syntax-language=&quot;pycon&quot; data-is-repl=&quot;true&quot;&gt;
  &lt;div class=&quot;codeblock__header codeblock--blue&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Python&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
        &lt;span class=&quot;codeblock__output-toggle&quot; title=&quot;Toggle prompts and output&quot; aria-label=&quot;Toggle prompts and output&quot; role=&quot;button&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;icon baseline js-codeblock-output-on codeblock__header--icon-lower&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#regular--rectangle-terminal&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;globals&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;    &#x27;__name__&#x27;: &#x27;__main__&#x27;,&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;    &#x27;__doc__&#x27;: None,&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;    &#x27;__package__&#x27;: None,&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;    ...&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot; aria-label=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;
&lt;/code-block&gt;
&lt;p&gt;The &lt;code&gt;globals()&lt;/code&gt; function returns a dictionary containing key-value pairs that map names to objects that live in your current global scope.&lt;/p&gt;
&lt;p&gt;Python also uses dictionaries to support the internal implementation of &lt;a href=&quot;https://realpython.com/python-classes/&quot;&gt;classes&lt;/a&gt;. Consider the following demo class:&lt;/p&gt;
&lt;code-block class=&quot;mb-3&quot; data-syntax-language=&quot;pycon&quot; data-is-repl=&quot;true&quot;&gt;
  &lt;div class=&quot;codeblock__header codeblock--blue&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Python&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
        &lt;span class=&quot;codeblock__output-toggle&quot; title=&quot;Toggle prompts and output&quot; aria-label=&quot;Toggle prompts and output&quot; role=&quot;button&quot; tabindex=&quot;0&quot;&gt;&lt;span class=&quot;icon baseline js-codeblock-output-on codeblock__header--icon-lower&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#regular--rectangle-terminal&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/span&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;Number&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;fm&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;... &lt;/span&gt;        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;value&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;value&lt;/span&gt;
&lt;span class=&quot;gp&quot;&gt;...&lt;/span&gt;

&lt;span class=&quot;gp&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Number&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;42&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;vm&quot;&gt;__dict__&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;{&#x27;value&#x27;: 42}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot; aria-label=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;
&lt;/code-block&gt;
&lt;p&gt;The &lt;a href=&quot;https://realpython.com/python-dict-attribute/&quot;&gt;&lt;code&gt;.__dict__&lt;/code&gt;&lt;/a&gt; special attribute is a dictionary that maps attribute names to their corresponding values in Python classes and objects. This implementation makes attribute and method lookup fast and efficient in &lt;a href=&quot;https://realpython.com/python3-object-oriented-programming/&quot;&gt;object-oriented&lt;/a&gt; code.&lt;/p&gt;
&lt;p&gt;You can use dictionaries to approach many programming tasks in your Python code. They come in handy when processing &lt;a href=&quot;https://realpython.com/python-csv/&quot;&gt;CSV&lt;/a&gt; and &lt;a href=&quot;https://realpython.com/python-json/&quot;&gt;JSON&lt;/a&gt; files, working with databases, loading configuration files, and more.&lt;/p&gt;
&lt;p&gt;Python’s dictionaries have the following characteristics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mutable&lt;/strong&gt;: The dictionary values can be updated &lt;a href=&quot;https://en.wikipedia.org/wiki/In-place_algorithm&quot;&gt;in place&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamic&lt;/strong&gt;: Dictionaries can grow and shrink as needed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Efficient&lt;/strong&gt;: They’re implemented as &lt;a href=&quot;https://realpython.com/python-hash-table/&quot;&gt;hash tables&lt;/a&gt;, which allows for fast key lookup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ordered&lt;/strong&gt;: Starting with &lt;a href=&quot;https://realpython.com/python37-new-features/&quot;&gt;Python 3.7&lt;/a&gt;, dictionaries keep their items in the same &lt;a href=&quot;https://realpython.com/python37-new-features/#the-order-of-dictionaries-is-guaranteed&quot;&gt;order&lt;/a&gt; they were inserted.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The keys of a dictionary have a couple of restrictions. They need to be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hashable&lt;/strong&gt;: This means that you can’t use unhashable objects like lists as dictionary keys.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unique&lt;/strong&gt;: This means that your dictionaries won’t have duplicate keys.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In contrast, the values in a dictionary aren’t restricted. They can be of any Python type, including other dictionaries, which makes it possible to have nested dictionaries.&lt;/p&gt;
&lt;p&gt;Dictionaries are collections of pairs. So, you can’t insert a key without its corresponding value or vice versa. Since they come as a pair, you always have to insert a key with its corresponding value.&lt;/p&gt;
&lt;div class=&quot;alert alert-primary&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; In some situations, you may want to add keys to a dictionary without deciding what the associated value should be. In those cases, you can use the &lt;a href=&quot;#setting-one-key-setdefaultkey-defaultnone&quot;&gt;&lt;code&gt;.setdefault()&lt;/code&gt;&lt;/a&gt; method to create keys with a default or placeholder value.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2&gt;&lt;a href=&quot;https://realpython.com/python-dicts/?utm_source=realpython&amp;utm_medium=rss&quot;&gt;Read the full article at https://realpython.com/python-dicts/ »&lt;/a&gt;&lt;/h2&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Using Loguru to Simplify Python Logging</title>
      <id>https://realpython.com/courses/using-loguru-to-simplify-python-logging/</id>
      <link href="https://realpython.com/courses/using-loguru-to-simplify-python-logging/"/>
      <updated>2026-04-07T14:00:00+00:00</updated>
      <summary>Learn how to use Loguru for simpler Python logging, from zero-config setup and custom formats to file rotation, retention, and adding context.</summary>
      <content type="html">
        &lt;p&gt;Logging is a vital programming practice that helps you track, understand, and debug your application&amp;rsquo;s behavior. Loguru is a Python library that provides simpler, more intuitive logging compared to Python&amp;rsquo;s built-in &lt;code&gt;logging&lt;/code&gt; module.&lt;/p&gt;
&lt;p&gt;Good logging gives you insights into your program&amp;rsquo;s execution, helps you diagnose issues, and provides valuable information about your application&amp;rsquo;s health in production. Without proper logging, you risk missing critical errors, spending countless hours &lt;a href=&quot;https://realpython.com/python-debugging-pdb/&quot;&gt;debugging&lt;/a&gt; blind spots, and potentially undermining your project&amp;rsquo;s overall stability.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;By the end of this video course, you&amp;rsquo;ll understand that:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Logging&lt;/strong&gt; in Python can be &lt;strong&gt;simple and intuitive&lt;/strong&gt; with the right tools.&lt;/li&gt;
&lt;li&gt;Using Loguru lets you &lt;strong&gt;start logging immediately&lt;/strong&gt; without complex configuration.&lt;/li&gt;
&lt;li&gt;You can &lt;strong&gt;customize log formats&lt;/strong&gt; and send logs to multiple destinations like files, the standard error stream, or external services.&lt;/li&gt;
&lt;li&gt;Loguru provides &lt;strong&gt;powerful debugging capabilities&lt;/strong&gt; that make troubleshooting easier.&lt;/li&gt;
&lt;li&gt;Loguru supports &lt;strong&gt;structured logging&lt;/strong&gt; with JSON formatting for modern applications.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After watching this course, you&amp;rsquo;ll be able to quickly implement better logging in your Python applications. You&amp;rsquo;ll spend less time wrestling with logging configuration and more time using logs effectively to debug issues. This will help you build production-ready applications that are easier to troubleshoot when problems occur.&lt;/p&gt;
&lt;p&gt;To get the most from this course, you should be familiar with Python concepts like &lt;a href=&quot;https://realpython.com/defining-your-own-python-function/&quot;&gt;functions&lt;/a&gt;, &lt;a href=&quot;https://realpython.com/primer-on-python-decorators/&quot;&gt;decorators&lt;/a&gt;, and &lt;a href=&quot;https://realpython.com/python-with-statement/&quot;&gt;context managers&lt;/a&gt;. You might also find it helpful to have some experience with Python&amp;rsquo;s built-in &lt;a href=&quot;https://realpython.com/python-logging/&quot;&gt;&lt;code&gt;logging&lt;/code&gt;&lt;/a&gt; module, though this isn&amp;rsquo;t required.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t worry if you&amp;rsquo;re new to logging in Python. This course will guide you through everything you need to know to get started with Loguru and implement effective logging in your applications.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>D-Strings Could End Your textwrap.dedent() Days and Other Python News for April 2026</title>
      <id>https://realpython.com/python-news-april-2026/</id>
      <link href="https://realpython.com/python-news-april-2026/"/>
      <updated>2026-04-06T14:00:00+00:00</updated>
      <summary>D-strings proposed to kill textwrap.dedent(), Python 3.15 alpha 7 ships lazy imports, GPT-5.4 launches, and Python Insider moves home.</summary>
      <content type="html">
        &lt;div&gt;&lt;p&gt;If you’ve ever wrapped a multiline string in &lt;code&gt;textwrap.dedent()&lt;/code&gt; and wondered why Python can’t just handle that for you, then your PEP has arrived. &lt;a href=&quot;https://peps.python.org/pep-0822/&quot;&gt;PEP 822&lt;/a&gt; proposes &lt;strong&gt;d-strings&lt;/strong&gt;, a new &lt;code&gt;d&quot;&quot;&quot;...&quot;&quot;&quot;&lt;/code&gt; prefix that automatically strips leading indentation. It’s one of those small quality-of-life ideas that make you wonder why it didn’t exist already. The &lt;a href=&quot;/ref/glossary/pep/&quot; class=&quot;ref-link&quot;&gt;PEP&lt;/a&gt; is currently a draft proposal.&lt;/p&gt;
&lt;p&gt;March also delivered &lt;strong&gt;Python 3.15.0 alpha 7&lt;/strong&gt; with &lt;a href=&quot;https://peps.python.org/pep-0810/&quot;&gt;lazy imports&lt;/a&gt; you can finally test and security patches across three older branches. On the ecosystem side, &lt;strong&gt;GPT-5.4&lt;/strong&gt; landed with a tool search feature that changes agentic workflows. Meanwhile, the Python Insider blog migration moved 307 posts to a new home without breaking a single URL. It’s time to get into the biggest &lt;strong&gt;Python news&lt;/strong&gt; from the past month.&lt;/p&gt;
&lt;div class=&quot;alert alert-warning&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong markdown&gt;Join Now:&lt;/strong&gt; &lt;a href=&quot;https://realpython.com/bonus/newsletter/&quot; class=&quot;alert-link&quot; data-toggle=&quot;modal&quot; data-target=&quot;#modal-newsletter&quot; markdown&gt;Click here to join the Real Python Newsletter&lt;/a&gt; and you’ll never miss another Python tutorial, course, or news update.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;python-releases-and-pep-highlights&quot;&gt;Python Releases and PEP Highlights&lt;a class=&quot;headerlink&quot; href=&quot;#python-releases-and-pep-highlights&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;March brought the penultimate alpha of Python 3.15 with a long-awaited feature that finally lets Python developers defer imports cleanly. On top of that, security patches landed for three older branches, and a fresh PEP proposal showed up that could clean up your multiline strings for good.&lt;/p&gt;
&lt;h3 id=&quot;python-3150-alpha-7-lazy-imports-land&quot;&gt;Python 3.15.0 Alpha 7: Lazy Imports Land&lt;a class=&quot;headerlink&quot; href=&quot;#python-3150-alpha-7-lazy-imports-land&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.python.org/downloads/release/python-3150a7/&quot;&gt;Python 3.15.0a7&lt;/a&gt; dropped on March 10, the second-to-last alpha before the beta freeze on May 5. The headline feature you can finally test is &lt;a href=&quot;https://peps.python.org/pep-0810/&quot;&gt;PEP 810&lt;/a&gt;, &lt;strong&gt;explicit lazy imports&lt;/strong&gt;. The &lt;a href=&quot;/ref/glossary/python-steering-council/&quot; class=&quot;ref-link&quot;&gt;Steering Council&lt;/a&gt; &lt;a href=&quot;https://realpython.com/python-news-december-2025/#pep-810-accepted-explicit-lazy-imports&quot;&gt;accepted PEP 810 back in November&lt;/a&gt;, but this is the first alpha where the implementation is available to try.&lt;/p&gt;
&lt;p&gt;The idea is straightforward: prefix any &lt;a href=&quot;https://realpython.com/python-import/&quot;&gt;import statement&lt;/a&gt; with &lt;code&gt;lazy&lt;/code&gt;, and the &lt;a href=&quot;/ref/glossary/module/&quot; class=&quot;ref-link&quot;&gt;module&lt;/a&gt; won’t actually load until you first access an &lt;a href=&quot;/ref/glossary/attribute/&quot; class=&quot;ref-link&quot;&gt;attribute&lt;/a&gt; on it:&lt;/p&gt;
&lt;code-block class=&quot;mb-3&quot; data-syntax-language=&quot;python&quot;&gt;
  &lt;div class=&quot;codeblock__header codeblock--blue&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Python&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;lazy&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;json&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;lazy&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;datetime&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;timedelta&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# The json module isn&#x27;t loaded yet, so no startup cost&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Later, when you actually use it:&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;loads&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;payload&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;# Now it loads&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot; aria-label=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;
&lt;/code-block&gt;
&lt;p&gt;The PEP authors note that &lt;strong&gt;17 percent of &lt;a href=&quot;/ref/glossary/standard-library/&quot; class=&quot;ref-link&quot;&gt;standard library&lt;/a&gt; imports&lt;/strong&gt; are already placed inside functions to defer loading. Tools like &lt;a href=&quot;https://realpython.com/learning-paths/django-web-development/&quot;&gt;Django’s&lt;/a&gt; management commands, &lt;a href=&quot;https://realpython.com/python-click/&quot;&gt;Click&lt;/a&gt;-based CLIs, and codebases heavy on &lt;a href=&quot;https://realpython.com/python-type-checking/&quot;&gt;type checking&lt;/a&gt; often spend hundreds of milliseconds on imports they might never use. Lazy imports make that optimization explicit and clean, without scattering imports deep inside &lt;a href=&quot;/ref/glossary/function/&quot; class=&quot;ref-link&quot;&gt;function&lt;/a&gt; bodies.&lt;/p&gt;
&lt;div class=&quot;alert alert-primary&quot; role=&quot;alert&quot;&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Alpha 7 also continues to ship the &lt;a href=&quot;https://realpython.com/python313-free-threading-jit/#jit-compiler&quot;&gt;JIT compiler&lt;/a&gt; improvements from &lt;a href=&quot;https://realpython.com/python-news-march-2026/#python-3150-alpha-6-comprehension-unpacking-and-more&quot;&gt;earlier alphas&lt;/a&gt;, with &lt;strong&gt;3–4 percent geometric mean gains on x86-64 Linux&lt;/strong&gt; and &lt;strong&gt;7–8 percent on AArch64 macOS&lt;/strong&gt;. Alpha 8 is scheduled for April 7, with the beta phase starting May 5.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 id=&quot;security-releases-python-31213-31115-and-31020&quot;&gt;Security Releases: Python 3.12.13, 3.11.15, and 3.10.20&lt;a class=&quot;headerlink&quot; href=&quot;#security-releases-python-31213-31115-and-31020&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;On March 3, Thomas Wouters released security-only patches across three older Python branches. The updates fix several CVEs, including two XML parsing vulnerabilities (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-24515&quot;&gt;CVE-2026-24515&lt;/a&gt; and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-25210&quot;&gt;CVE-2026-25210&lt;/a&gt;), patched by upgrading the bundled libexpat to 2.7.4. Additional fixes cover an XML memory amplification bug and the rejection of control characters in HTTP headers and URL parsing.&lt;/p&gt;
&lt;p&gt;If you’re still running Python 3.12 or older in production, applying these patches is highly recommended. Python 3.12 is now in security-fixes-only mode, so no binary installers are provided. You’ll need to build from source.&lt;/p&gt;
&lt;h3 id=&quot;pep-822-dedented-multiline-strings-d-strings&quot;&gt;PEP 822: Dedented Multiline Strings (D-Strings)&lt;a class=&quot;headerlink&quot; href=&quot;#pep-822-dedented-multiline-strings-d-strings&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://peps.python.org/pep-0822/&quot;&gt;PEP 822&lt;/a&gt;, authored by Inada Naoki, proposes a new &lt;code&gt;d&quot;&quot;&quot;...&quot;&quot;&quot;&lt;/code&gt; string prefix that automatically strips leading &lt;a href=&quot;/ref/glossary/indentation/&quot; class=&quot;ref-link&quot;&gt;indentation&lt;/a&gt; from multiline strings, using the same algorithm as &lt;code&gt;textwrap.dedent()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Anyone who’s written a multiline SQL query or help text inside a &lt;a href=&quot;https://realpython.com/defining-your-own-python-function/&quot;&gt;function&lt;/a&gt; and battled with indentation knows the pain:&lt;/p&gt;
&lt;code-block class=&quot;mb-3&quot; data-syntax-language=&quot;python&quot;&gt;
  &lt;div class=&quot;codeblock__header codeblock--blue&quot;&gt;
    &lt;span class=&quot;mr-2 noselect&quot;&gt;&lt;span class=&quot;sr-only&quot;&gt;Language: &lt;/span&gt;Python&lt;/span&gt;
    
    &lt;div class=&quot;noselect&quot;&gt;
      
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;codeblock__contents&quot;&gt;
    &lt;div class=&quot;highlight highlight--with-header&quot;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nn&quot;&gt;textwrap&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# Before: awkward indentation or textwrap.dedent() wrapper&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;get_query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;textwrap&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;dedent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;\&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;        SELECT name, email&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;        FROM users&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;        WHERE active = true&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;    &quot;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;# With d-strings: clean and readable&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;get_query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;        SELECT name, email&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;        FROM users&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;        WHERE active = true&lt;/span&gt;
&lt;span class=&quot;s2&quot;&gt;    &quot;&quot;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
    
    &lt;button class=&quot;codeblock__copy btn btn-outline-secondary border m-1 px-1 d-hover-only&quot; title=&quot;Copy to clipboard&quot; aria-label=&quot;Copy to clipboard&quot;&gt;&lt;span class=&quot;icon baseline&quot; aria-hidden=&quot;true&quot;&gt;&lt;svg aria-hidden=&quot;true&quot;&gt;&lt;use href=&quot;/static/icons.ea74988d8a7e.svg#@copy&quot;&gt;&lt;/use&gt;&lt;/svg&gt;&lt;/span&gt;&lt;/button&gt;
    
  &lt;/div&gt;
&lt;/code-block&gt;
&lt;p&gt;The &lt;code&gt;d&lt;/code&gt; prefix combines with &lt;code&gt;f&lt;/code&gt;, &lt;code&gt;r&lt;/code&gt;, &lt;code&gt;b&lt;/code&gt;, and even the upcoming &lt;code&gt;t&lt;/code&gt; (&lt;a href=&quot;https://realpython.com/python-t-strings/&quot;&gt;template strings&lt;/a&gt;) prefixes. PEP 822 was submitted to the Steering Council on March 9 and targets Python 3.15, though a decision hasn’t landed yet. If you’ve ever wished Python strings would just handle indentation for you, this one’s worth keeping an eye on.&lt;/p&gt;
&lt;h3 id=&quot;other-peps-in-progress&quot;&gt;Other PEPs in Progress&lt;a class=&quot;headerlink&quot; href=&quot;#other-peps-in-progress&quot; title=&quot;Permanent link&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;/div&gt;&lt;h2&gt;&lt;a href=&quot;https://realpython.com/python-news-april-2026/?utm_source=realpython&amp;utm_medium=rss&quot;&gt;Read the full article at https://realpython.com/python-news-april-2026/ »&lt;/a&gt;&lt;/h2&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Adding Python to PATH</title>
      <id>https://realpython.com/courses/adding-python-to-path/</id>
      <link href="https://realpython.com/courses/adding-python-to-path/"/>
      <updated>2026-03-31T14:00:00+00:00</updated>
      <summary>Learn how to add Python to your PATH environment variable on Windows, macOS, and Linux so you can run Python from the command line.</summary>
      <content type="html">
        &lt;p&gt;You may need to add Python to &lt;code&gt;PATH&lt;/code&gt; if you&amp;rsquo;ve &lt;a href=&quot;https://realpython.com/installing-python/&quot;&gt;installed Python&lt;/a&gt;, but typing &lt;code&gt;python&lt;/code&gt; on the command line doesn&amp;rsquo;t seem to work. You might see a message saying that &lt;code&gt;python&lt;/code&gt; isn&amp;rsquo;t recognized, or you might end up running the wrong version of Python.&lt;/p&gt;
&lt;p&gt;A common fix for these problems is adding Python to the &lt;code&gt;PATH&lt;/code&gt; &lt;a href=&quot;https://en.wikipedia.org/wiki/Environment_variable&quot;&gt;environment variable&lt;/a&gt;. In this video course, you&amp;rsquo;ll learn how to add Python to &lt;code&gt;PATH&lt;/code&gt;. You&amp;rsquo;ll also learn what &lt;code&gt;PATH&lt;/code&gt; is and why it&amp;rsquo;s essential for tools like the command line to be able to find your Python installation.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>The Real Python Podcast – Episode #289: Limitations in Human and Automated Code Review</title>
      <id>https://realpython.com/podcasts/rpp/289/</id>
      <link href="https://realpython.com/podcasts/rpp/289/"/>
      <updated>2026-03-27T12:00:00+00:00</updated>
      <summary>With the mountains of Python code that it&#x27;s possible to generate now, how&#x27;s your code review going? What are the limitations of human review, and where does machine review excel? Christopher Trudeau is back on the show this week with another batch of PyCoder&#x27;s Weekly articles and projects.</summary>
      <content type="html">
        &lt;p&gt;With the mountains of Python code that it&#x27;s possible to generate now, how&#x27;s your code review going? What are the limitations of human review, and where does machine review excel? Christopher Trudeau is back on the show this week with another batch of PyCoder&#x27;s Weekly articles and projects.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Understanding CRUD Operations in SQL</title>
      <id>https://realpython.com/courses/understanding-crud-operations-sql/</id>
      <link href="https://realpython.com/courses/understanding-crud-operations-sql/"/>
      <updated>2026-03-24T14:00:00+00:00</updated>
      <summary>Learn how CRUD operations work in SQL by writing raw SQL queries with SQLite and using SQLAlchemy as an ORM in Python.</summary>
      <content type="html">
        &lt;p&gt;CRUD operations are at the heart of nearly every application you interact with. As a developer, you usually want to create data, read or retrieve data, update data, and delete data. Whether you access a database or interact with a REST API, only when all four operations are present are you able to make a complete data roundtrip in your app.&lt;/p&gt;
&lt;p&gt;Creating, reading, updating, and deleting are so vital in software development that these methods are widely referred to as &lt;strong&gt;CRUD&lt;/strong&gt;. Understanding CRUD will give you an actionable blueprint when you build applications and help you understand how the applications you use work behind the scenes. So, what exactly does CRUD mean?&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>The Real Python Podcast – Episode #288: Automate Exploratory Data Analysis &amp; Invent Python Comprehensions</title>
      <id>https://realpython.com/podcasts/rpp/288/</id>
      <link href="https://realpython.com/podcasts/rpp/288/"/>
      <updated>2026-03-20T12:00:00+00:00</updated>
      <summary>How do you quickly get an understanding of what&#x27;s inside a new set of data? How can you share an exploratory data analysis with your team? Christopher Trudeau is back on the show this week with another batch of PyCoder&#x27;s Weekly articles and projects.</summary>
      <content type="html">
        &lt;p&gt;How do you quickly get an understanding of what&#x27;s inside a new set of data? How can you share an exploratory data analysis with your team? Christopher Trudeau is back on the show this week with another batch of PyCoder&#x27;s Weekly articles and projects.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Learning Path: LLM Application Development With Python</title>
      <id>https://realpython.com/learning-paths/llm-application-development-python/</id>
      <link href="https://realpython.com/learning-paths/llm-application-development-python/"/>
      <updated>2026-03-19T12:00:00+00:00</updated>
      <summary>Build LLM-powered applications in Python. Call model APIs, craft prompts, add retrieval-augmented generation, create AI agents, and connect via MCP.</summary>
      <content type="html">
        &lt;p&gt;Build LLM-powered applications in Python. Call model APIs, craft prompts, add retrieval-augmented generation, create AI agents, and connect via MCP.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Downloading Files From URLs With Python</title>
      <id>https://realpython.com/courses/downloading-files-urls/</id>
      <link href="https://realpython.com/courses/downloading-files-urls/"/>
      <updated>2026-03-17T14:00:00+00:00</updated>
      <summary>Learn to download files from URLs with Python using urllib and requests, including data streaming for large files.</summary>
      <content type="html">
        &lt;p&gt;Python makes it straightforward to download files from a URL with its robust set of libraries. For quick tasks, you can use the built-in &lt;code&gt;urllib&lt;/code&gt; module or the &lt;code&gt;requests&lt;/code&gt; library to fetch and save files. When working with large files, streaming data in chunks can help save memory and improve performance.&lt;/p&gt;
&lt;p&gt;You can also perform parallel file downloads using &lt;code&gt;ThreadPoolExecutor&lt;/code&gt; for multithreading or the &lt;code&gt;aiohttp&lt;/code&gt; library for asynchronous tasks. These approaches allow you to handle multiple downloads concurrently, significantly reducing the total download time if you&amp;rsquo;re handling many files.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;By the end of this video course, you&amp;rsquo;ll understand that:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can use Python to &lt;strong&gt;download files with libraries&lt;/strong&gt; like &lt;strong&gt;&lt;code&gt;urllib&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;requests&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;To &lt;strong&gt;download a file using a URL&lt;/strong&gt; in Python, you can use &lt;strong&gt;&lt;code&gt;urlretrieve()&lt;/code&gt;&lt;/strong&gt; or &lt;strong&gt;&lt;code&gt;requests.get()&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;To &lt;strong&gt;extract data from a URL&lt;/strong&gt; in Python, you use the response object from &lt;strong&gt;&lt;code&gt;requests&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;To &lt;strong&gt;download a CSV file from a URL&lt;/strong&gt; in Python, you may need to specify the format in the URL or query parameters.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this video course, you&amp;rsquo;ll be downloading a range of economic data from the World Bank Open Data platform.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>The Real Python Podcast – Episode #287: Crafting and Editing In-Depth Tutorials at Real Python</title>
      <id>https://realpython.com/podcasts/rpp/287/</id>
      <link href="https://realpython.com/podcasts/rpp/287/"/>
      <updated>2026-03-13T12:00:00+00:00</updated>
      <summary>What goes into creating the tutorials you read at Real Python? What are the steps in the editorial process, and who are the people behind the scenes? This week on the show, Real Python team members Martin Breuss, Brenda Weleschuk, and Philipp Acsany join us to discuss topic curation, review stages, and quality assurance.</summary>
      <content type="html">
        &lt;p&gt;What goes into creating the tutorials you read at Real Python? What are the steps in the editorial process, and who are the people behind the scenes? This week on the show, Real Python team members Martin Breuss, Brenda Weleschuk, and Philipp Acsany join us to discuss topic curation, review stages, and quality assurance.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Working With APIs in Python: Reading Public Data</title>
      <id>https://realpython.com/courses/working-apis-reading-public-data/</id>
      <link href="https://realpython.com/courses/working-apis-reading-public-data/"/>
      <updated>2026-03-10T14:00:00+00:00</updated>
      <summary>Learn how to consume REST APIs with Python using the requests library, including authentication, query parameters, and handling responses.</summary>
      <content type="html">
        &lt;p&gt;Python is an excellent choice for working with Application Programming Interfaces (APIs), allowing you to efficiently consume and interact with them. By using the Requests library, you can easily fetch data from APIs that communicate using HTTP, such as REST, SOAP, or GraphQL APIs. This video course covers the essentials of consuming REST APIs with Python, including authentication and handling responses.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;By the end of this video course, you&amp;rsquo;ll understand that:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;API&lt;/strong&gt; is an interface that allows different systems to communicate, typically through requests and responses.&lt;/li&gt;
&lt;li&gt;Python is a versatile language for &lt;strong&gt;consuming APIs&lt;/strong&gt;, offering libraries like &lt;strong&gt;Requests&lt;/strong&gt; to simplify the process.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;REST and GraphQL&lt;/strong&gt; are two common &lt;strong&gt;types of APIs&lt;/strong&gt;, with REST being more widely used for public APIs.&lt;/li&gt;
&lt;li&gt;To handle &lt;strong&gt;API authentication in Python&lt;/strong&gt;, you can use API keys or more complex methods like &lt;strong&gt;OAuth&lt;/strong&gt; to access protected resources.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Knowing how to consume an API is one of those magical skills that, once mastered, will crack open a whole new world of possibilities, and consuming APIs using Python is a great way to learn such a skill.&lt;/p&gt;
&lt;p&gt;By the end of this video course, you&amp;rsquo;ll be able to use Python to consume most of the APIs that you come across. If you&amp;rsquo;re a developer, then knowing how to consume APIs with Python will empower you to integrate data from various online sources into your applications.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>What Does Python&#x27;s __init__.py Do?</title>
      <id>https://realpython.com/courses/init-py/</id>
      <link href="https://realpython.com/courses/init-py/"/>
      <updated>2026-03-03T14:00:00+00:00</updated>
      <summary>Learn how Python&#x27;s __init__.py declares packages, initializes variables, simplifies imports, and controls what gets exported.</summary>
      <content type="html">
        &lt;p&gt;Python&amp;rsquo;s special &lt;code&gt;__init__.py&lt;/code&gt; file marks a directory as a regular Python package and allows you to import its modules. This file runs automatically the first time you import its containing package. You can use it to initialize package-level variables, define functions or classes, and structure the package&amp;rsquo;s namespace clearly for users.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;By the end of this video course, you&amp;rsquo;ll understand that:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A directory &lt;strong&gt;without an &lt;code&gt;__init__.py&lt;/code&gt; file&lt;/strong&gt; becomes a &lt;strong&gt;namespace package&lt;/strong&gt;, which behaves differently from a regular package and may cause slower imports.&lt;/li&gt;
&lt;li&gt;You can use &lt;code&gt;__init__.py&lt;/code&gt; to explicitly define a package&amp;rsquo;s &lt;strong&gt;public API&lt;/strong&gt; by importing specific modules or functions into the package namespace.&lt;/li&gt;
&lt;li&gt;The Python convention of using &lt;strong&gt;leading underscores&lt;/strong&gt; helps indicate to users which objects are intended as &lt;strong&gt;non-public&lt;/strong&gt;, although this convention can still be bypassed.&lt;/li&gt;
&lt;li&gt;Code inside &lt;code&gt;__init__.py&lt;/code&gt; runs &lt;strong&gt;only once&lt;/strong&gt; during the first import, even if you run the import statement multiple times.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Understanding how to effectively use &lt;code&gt;__init__.py&lt;/code&gt; helps you structure your Python packages in a clear, maintainable way, improving usability and namespace management.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>The Real Python Podcast – Episode #286: Overcoming Testing Obstacles With Python&#x27;s Mock Object Library</title>
      <id>https://realpython.com/podcasts/rpp/286/</id>
      <link href="https://realpython.com/podcasts/rpp/286/"/>
      <updated>2026-02-27T12:00:00+00:00</updated>
      <summary>Do you have complex logic and unpredictable dependencies that make it hard to write reliable tests? How can you use Python&#x27;s mock object library to improve your tests? Christopher Trudeau is back on the show this week with another batch of PyCoder&#x27;s Weekly articles and projects.</summary>
      <content type="html">
        &lt;p&gt;Do you have complex logic and unpredictable dependencies that make it hard to write reliable tests? How can you use Python&#x27;s mock object library to improve your tests? Christopher Trudeau is back on the show this week with another batch of PyCoder&#x27;s Weekly articles and projects.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>The Real Python Podcast – Episode #285: Exploring MCP Apps &amp; Adding Interactive UIs to Clients</title>
      <id>https://realpython.com/podcasts/rpp/285/</id>
      <link href="https://realpython.com/podcasts/rpp/285/"/>
      <updated>2026-02-20T12:00:00+00:00</updated>
      <summary>How can you move your MCP tools beyond plain text? How do you add interactive UI components directly inside chat conversations? This week on the show, Den Delimarsky from Anthropic joins us to discuss MCP Apps and interactive UIs in MCP.</summary>
      <content type="html">
        &lt;p&gt;How can you move your MCP tools beyond plain text? How do you add interactive UI components directly inside chat conversations? This week on the show, Den Delimarsky from Anthropic joins us to discuss MCP Apps and interactive UIs in MCP.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>The Real Python Podcast – Episode #284: Running Local LLMs With Ollama and Connecting With Python</title>
      <id>https://realpython.com/podcasts/rpp/284/</id>
      <link href="https://realpython.com/podcasts/rpp/284/"/>
      <updated>2026-02-13T12:00:00+00:00</updated>
      <summary>Would you like to learn how to work with LLMs locally on your own computer? How do you integrate your Python projects with a local model? Christopher Trudeau is back on the show this week with another batch of PyCoder&#x27;s Weekly articles and projects.</summary>
      <content type="html">
        &lt;p&gt;Would you like to learn how to work with LLMs locally on your own computer? How do you integrate your Python projects with a local model? Christopher Trudeau is back on the show this week with another batch of PyCoder&#x27;s Weekly articles and projects.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Learning Path: Python Coding With AI</title>
      <id>https://realpython.com/learning-paths/coding-with-ai/</id>
      <link href="https://realpython.com/learning-paths/coding-with-ai/"/>
      <updated>2025-12-07T12:00:00+00:00</updated>
      <summary>Use AI coding assistants to write, review, and debug Python code faster. Pick from Claude Code, Cursor, or Gemini CLI and start coding.</summary>
      <content type="html">
        &lt;p&gt;Use AI coding assistants to write, review, and debug Python code faster. Pick from Claude Code, Cursor, or Gemini CLI and start coding.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Learning Path: Python Control Flow and Loops</title>
      <id>https://realpython.com/learning-paths/python-control-flow-and-loops/</id>
      <link href="https://realpython.com/learning-paths/python-control-flow-and-loops/"/>
      <updated>2024-11-14T12:00:00+00:00</updated>
      <summary>Learn Python control flow and loops. Use conditional statements, Boolean operators, for and while loops, and keywords like break and continue.</summary>
      <content type="html">
        &lt;p&gt;Learn Python control flow and loops. Use conditional statements, Boolean operators, for and while loops, and keywords like break and continue.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Learning Path: Modules and Packages</title>
      <id>https://realpython.com/learning-paths/modules-and-packages/</id>
      <link href="https://realpython.com/learning-paths/modules-and-packages/"/>
      <updated>2024-11-14T12:00:00+00:00</updated>
      <summary>Learn Python&#x27;s import system, organize code into modules and packages, manage dependencies with pip, and publish to PyPI.</summary>
      <content type="html">
        &lt;p&gt;Learn Python&#x27;s import system, organize code into modules and packages, manage dependencies with pip, and publish to PyPI.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Learning Path: Functions and Scopes</title>
      <id>https://realpython.com/learning-paths/functions-and-scopes/</id>
      <link href="https://realpython.com/learning-paths/functions-and-scopes/"/>
      <updated>2024-11-14T12:00:00+00:00</updated>
      <summary>Learn to define Python functions, use parameters and return values, create inner functions, and understand namespaces and scope.</summary>
      <content type="html">
        &lt;p&gt;Learn to define Python functions, use parameters and return values, create inner functions, and understand namespaces and scope.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Learning Path: Create Graphical User Interfaces (GUI)</title>
      <id>https://realpython.com/learning-paths/python-gui-programming/</id>
      <link href="https://realpython.com/learning-paths/python-gui-programming/"/>
      <updated>2024-11-14T12:00:00+00:00</updated>
      <summary>Build Python GUI applications with Tkinter, PyQt, wxPython, and Kivy. Learn layouts, event handling, threading, and database integration.</summary>
      <content type="html">
        &lt;p&gt;Build Python GUI applications with Tkinter, PyQt, wxPython, and Kivy. Learn layouts, event handling, threading, and database integration.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Learning Path: Important Standard Library Modules</title>
      <id>https://realpython.com/learning-paths/standard-library-modules-you-should-know/</id>
      <link href="https://realpython.com/learning-paths/standard-library-modules-you-should-know/"/>
      <updated>2024-11-14T12:00:00+00:00</updated>
      <summary>Explore Python standard library modules including math, datetime, JSON, CSV, regex, subprocess, and argparse through hands-on tutorials and courses.</summary>
      <content type="html">
        &lt;p&gt;Explore Python standard library modules including math, datetime, JSON, CSV, regex, subprocess, and argparse through hands-on tutorials and courses.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Learning Path: Network Programming and Security</title>
      <id>https://realpython.com/learning-paths/network-programming-and-security/</id>
      <link href="https://realpython.com/learning-paths/network-programming-and-security/"/>
      <updated>2024-11-14T12:00:00+00:00</updated>
      <summary>Learn network programming and security in Python. Work with CRUD operations, REST APIs, HTTPS, and socket programming to build networked apps.</summary>
      <content type="html">
        &lt;p&gt;Learn network programming and security in Python. Work with CRUD operations, REST APIs, HTTPS, and socket programming to build networked apps.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  
    <entry>
      <title>Learning Path: Functional Programming With Python</title>
      <id>https://realpython.com/learning-paths/functional-programming/</id>
      <link href="https://realpython.com/learning-paths/functional-programming/"/>
      <updated>2024-11-14T12:00:00+00:00</updated>
      <summary>Explore functional programming in Python. Learn lambda functions, map(), filter(), reduce(), closures, decorators, and recursion.</summary>
      <content type="html">
        &lt;p&gt;Explore functional programming in Python. Learn lambda functions, map(), filter(), reduce(), closures, decorators, and recursion.&lt;/p&gt;
        &lt;hr /&gt;
        &lt;p&gt;&lt;em&gt;[ Improve Your Python With 🐍 Python Tricks 💌 – Get a short &amp;amp; sweet Python Trick delivered to your inbox every couple of days. &lt;a href=&quot;https://realpython.com/python-tricks/?utm_source=realpython&amp;amp;utm_medium=rss&amp;amp;utm_campaign=footer&quot;&gt;&amp;gt;&amp;gt; Click here to learn more and see examples&lt;/a&gt; ]&lt;/em&gt;&lt;/p&gt;
      </content>
    </entry>
  

</feed>
