<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sameer Qaiser</title>
    <description>The latest articles on DEV Community by Sameer Qaiser (@sameerqaiser17).</description>
    <link>https://dev.to/sameerqaiser17</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4121118%2F575bc0a9-3fa8-4a56-93f7-c09ac1cfb970.jpeg</url>
      <title>DEV Community: Sameer Qaiser</title>
      <link>https://dev.to/sameerqaiser17</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sameerqaiser17"/>
    <language>en</language>
    <item>
      <title>Top 5 Python Libraries Every Beginner Should Know</title>
      <dc:creator>Sameer Qaiser</dc:creator>
      <pubDate>Tue, 13 Oct 2026 08:21:15 +0000</pubDate>
      <link>https://dev.to/sameerqaiser17/top-5-python-libraries-every-beginner-should-know-7j7</link>
      <guid>https://dev.to/sameerqaiser17/top-5-python-libraries-every-beginner-should-know-7j7</guid>
      <description>&lt;h2&gt;
  
  
  📌 Quick Info
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Topic:&lt;/strong&gt; The five Python libraries that actually matter for beginners&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target Audience:&lt;/strong&gt; Beginners who know the basics and want to build real things&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Cut through the noise — not list every library in existence&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"There are over 400,000 packages on PyPI. That number is useless to a beginner. Here are the five that actually changed what I could build."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. How I Chose These Five
&lt;/h2&gt;

&lt;p&gt;I didn't pick the "most popular" libraries. I picked the ones that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Solve a problem you'll actually run into&lt;/li&gt;
&lt;li&gt;Are beginner-friendly (no steep learning curve)&lt;/li&gt;
&lt;li&gt;Are used in real projects, not just tutorials&lt;/li&gt;
&lt;li&gt;Open doors to more advanced work once you know them&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There are thousands of Python libraries. These are the five I'd start with.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. #1 — &lt;code&gt;requests&lt;/code&gt; (Talking to the Internet)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Makes HTTP requests simple.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Almost every modern app talks to the internet. Fetching data from an API, downloading a file, posting to a service — &lt;code&gt;requests&lt;/code&gt; is how Python does it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;https://api.github.com/users/torvalds&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to learn it:&lt;/strong&gt; As soon as you understand functions and JSON.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. #2-Json (Built in, But essential)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Reads and writes JSON -the standard format for data on the web.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; APIs return JSN. Config Files are JSON. Every modern data pipeline uses JSON somewhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt;

&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ali&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;age&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;w&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to learn it&lt;/strong&gt;: Right after you learn file handling.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. #3-csv (Built-in, But Ignored)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does&lt;/strong&gt;: Reads and writes CSV files- the format of every spreadsheet and database export.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Real Data lives in CSVs. If you can’t read and write them, you can’t work with real-world data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;csv&lt;/span&gt;

&lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;users.csv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;r&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to learn it:&lt;/strong&gt; As soon as you start working with data.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. #4-pandas (Data Manipulation)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Works with tabular data- think “Excel inside Python.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; If you ever need to filter, group, join, or analyze data, pandas is the tool. It’s the backbone of data science and analysis in python.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;pd&lt;/span&gt;

&lt;span class="nx"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_csv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sales.csv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;region&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;revenue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to learn it:&lt;/strong&gt; After you’re comfortable with lists, dictionaries, and CSVs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Warning:&lt;/strong&gt; Pandas is powerful but has a learning curve. Don’t jump in on day one.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. #5-pytest (Testing)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Lets you write tests for your code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters:&lt;/strong&gt; Most Beginners never write tests. That’s why their projects break the moment thet change something. &lt;strong&gt;pytest&lt;/strong&gt; teaches you to write code you can trust. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;

&lt;span class="nx"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_add&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
    &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;When to learn it:&lt;/strong&gt; As soon as your scripts get longer than 50 lines.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Quick Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Library&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Type&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Learn When&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Why&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;requests&lt;/td&gt;
&lt;td&gt;external&lt;/td&gt;
&lt;td&gt;After Functions + JSON&lt;/td&gt;
&lt;td&gt;Talk to APIs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;json&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;td&gt;After File Handling&lt;/td&gt;
&lt;td&gt;Work with data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;csv&lt;/td&gt;
&lt;td&gt;Built-in&lt;/td&gt;
&lt;td&gt;After File Handling&lt;/td&gt;
&lt;td&gt;Real-world data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pandas&lt;/td&gt;
&lt;td&gt;External&lt;/td&gt;
&lt;td&gt;After lists + dicts&lt;/td&gt;
&lt;td&gt;Analyze Data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pytest&lt;/td&gt;
&lt;td&gt;External&lt;/td&gt;
&lt;td&gt;After scripts get bigger&lt;/td&gt;
&lt;td&gt;Write reliable code&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  9. What I’d Skip (For Now)
&lt;/h2&gt;

&lt;p&gt;These Libraries are popular but not useful for beginners yet:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Library&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Why Skip It&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Django&lt;/td&gt;
&lt;td&gt;Full web framework- way too much at once.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flask&lt;/td&gt;
&lt;td&gt;Better after you understand functions well.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NumPy&lt;/td&gt;
&lt;td&gt;Learn it after pandas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TensorFlow/ PyTorch&lt;/td&gt;
&lt;td&gt;AI/ML- learn after you have foundations.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;scikit-learn&lt;/td&gt;
&lt;td&gt;Same-later&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;beautifulsoup&lt;/td&gt;
&lt;td&gt;Learn after requests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;selenium&lt;/td&gt;
&lt;td&gt;Learn after requests&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There’s no rush. Learn the fundamentals first.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. How to learn these (In Order)
&lt;/h2&gt;

&lt;p&gt;Here’s the path I’d take:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;json- one afternoon&lt;/li&gt;
&lt;li&gt;csv- one afternoon&lt;/li&gt;
&lt;li&gt;requests- a few days of practice&lt;/li&gt;
&lt;li&gt;pandas- a few weeks to get comfortable&lt;/li&gt;
&lt;li&gt;pytest- a week to build the habit&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s it. Five libraries. Each one compounds on the last.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Conclusion
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"You don't need 400,000 libraries. You need five. Learn them deeply, not shallowly. Build something small with each one. By the time you're done, you'll have the foundation for almost anything Python can do.”&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>python</category>
      <category>beginners</category>
      <category>programming</category>
      <category>data</category>
    </item>
    <item>
      <title>Python vs JavaScript: Which Should a Beginner Learn First?</title>
      <dc:creator>Sameer Qaiser</dc:creator>
      <pubDate>Mon, 12 Oct 2026 07:32:41 +0000</pubDate>
      <link>https://dev.to/sameerqaiser17/python-vs-javascript-which-should-a-beginner-learn-first-3d56</link>
      <guid>https://dev.to/sameerqaiser17/python-vs-javascript-which-should-a-beginner-learn-first-3d56</guid>
      <description>&lt;h2&gt;
  
  
  📌 Quick Info
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Topic:&lt;/strong&gt; An honest comparison of Python and JavaScript for beginners&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target Audience:&lt;/strong&gt; Beginners deciding what to learn first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Give a framework — not just pick a winner&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"I picked Python. But that doesn't mean it's the right choice for you. Here's the honest breakdown — and the question you should actually be asking."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. The Wrong Question
&lt;/h2&gt;

&lt;p&gt;People ask: &lt;strong&gt;"Which language is better, Python or JavaScript?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's not a useful question. Both languages are good. Both get used in production. Both have massive job markets.&lt;/p&gt;

&lt;p&gt;The useful question is: &lt;strong&gt;"Which language gets me closer to the thing I want to build?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So let's break this down properly.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. What Python Is Actually Good At
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Why Python Wins&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data science&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;pandas, NumPy, Matplotlib — unmatched ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI / machine learning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TensorFlow, PyTorch, scikit-learn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Automation / scripting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clean syntax, quick to write&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scientific computing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Used by NASA, CERN, research labs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backend APIs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Django, Flask, FastAPI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Education&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Simplest syntax for learning core concepts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Python's strength:&lt;/strong&gt; It reads like English. You focus on thinking, not fighting the syntax.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Python's weakness:&lt;/strong&gt; Slower than compiled languages. Not great for mobile. Not the language of the browser.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. What JavaScript Is Actually Good At
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Why JavaScript Wins&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Web frontends&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The only language browsers run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Full-stack apps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Same language on front and back&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Interactive UIs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;React, Vue, Svelte&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Mobile apps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;React Native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Real-time apps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Chat, collaboration tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Startup MVPs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fastest path from idea to live product&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;JavaScript's strength:&lt;/strong&gt; It runs everywhere. Any device with a browser can run your code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JavaScript's weakness:&lt;/strong&gt; Weird quirks (type coercion, &lt;code&gt;this&lt;/code&gt;). Steeper learning curve for beginners.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The Comparison Table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Python&lt;/th&gt;
&lt;th&gt;JavaScript&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Syntax difficulty&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Easier&lt;/td&gt;
&lt;td&gt;Harder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Job market&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Strong (data, AI, backend)&lt;/td&gt;
&lt;td&gt;Strong (web, full-stack)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What you can build&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scripts, APIs, data tools&lt;/td&gt;
&lt;td&gt;Websites, web apps, mobile apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Where it runs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Servers, scripts, notebooks&lt;/td&gt;
&lt;td&gt;Browsers, servers, mobile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Time to first project&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fast&lt;/td&gt;
&lt;td&gt;Slower&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Community size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Huge&lt;/td&gt;
&lt;td&gt;Huge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Learning curve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Gentler&lt;/td&gt;
&lt;td&gt;Steeper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ecosystem for AI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Best&lt;/td&gt;
&lt;td&gt;Weak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ecosystem for web&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fine&lt;/td&gt;
&lt;td&gt;Best&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  6. The Question You Should Actually Ask
&lt;/h2&gt;

&lt;p&gt;Here's the framework I'd use:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What do I want to build in the next 6 months?"&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you want to...&lt;/th&gt;
&lt;th&gt;Learn this first&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Analyze data or work with AI&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automate boring tasks&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build a personal website&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build a web app or startup MVP&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get into machine learning&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Make interactive UIs&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Work in research or academia&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Freelance building websites&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Notice:&lt;/strong&gt; Neither is "better." They serve different goals.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. What I Chose and Why
&lt;/h2&gt;

&lt;p&gt;I picked Python. Here's my honest reasoning:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;I wanted to learn how to think, not how to fight syntax.&lt;/strong&gt; Python's simple syntax let me focus on concepts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I'm interested in AI and automation.&lt;/strong&gt; Python is the language of both.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I wanted to write about what I learn.&lt;/strong&gt; Python's clarity makes it easier to explain to beginners.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I use AI constantly.&lt;/strong&gt; AI tools write Python best — knowing Python means I can read, judge, and direct their output.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But if I wanted to build a startup tomorrow, I'd learn JavaScript.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. What Actually Matters (More Than the Language)
&lt;/h2&gt;

&lt;p&gt;Whichever you pick, the thing that determines whether you succeed isn't the language. It's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consistency&lt;/strong&gt; — showing up daily beats picking the "right" language&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Building&lt;/strong&gt; — projects teach more than tutorials&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Writing&lt;/strong&gt; — explaining what you learn forces understanding&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Curiosity&lt;/strong&gt; — the people who keep going aren't smarter, they're more curious&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Switching languages later is easy. Learning how to learn is the hard part.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. The Honest Verdict
&lt;/h2&gt;

&lt;p&gt;There is no "best first language."&lt;/p&gt;

&lt;p&gt;There's only the language that gets you closer to what you want to build. Pick one. Start today. Ship something small by the end of the week.&lt;/p&gt;

&lt;p&gt;If you hate it, switch. You'll learn faster the second time because you'll already know how to learn.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Conclusion
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Python vs JavaScript isn't a competition. It's a choice about direction. Pick the one that points at the thing you want to build. Then build it. That's the whole game."&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>python</category>
      <category>javascript</category>
      <category>discuss</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How I'd Learn Python in 2026 (A Realistic Roadmap)</title>
      <dc:creator>Sameer Qaiser</dc:creator>
      <pubDate>Sun, 11 Oct 2026 07:52:21 +0000</pubDate>
      <link>https://dev.to/sameerqaiser17/how-id-learn-python-in-2026-a-realistic-roadmap-4fo1</link>
      <guid>https://dev.to/sameerqaiser17/how-id-learn-python-in-2026-a-realistic-roadmap-4fo1</guid>
      <description>&lt;h2&gt;
  
  
  📌 Quick Info
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Topic:&lt;/strong&gt; A practical, honest roadmap for learning Python in 2026&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target Audience:&lt;/strong&gt; Beginners, career-changers, self-taught learners&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Give a real plan — not the same recycled advice&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"I've published 28 articles about Python in four weeks. I've made every beginner mistake in the book. If I had to start over today, this is exactly what I'd do — and what I'd skip."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. First, the Honest Truth
&lt;/h2&gt;

&lt;p&gt;Learning Python in 2026 is different from learning it five years ago. Not because the language changed — it hasn't, much — but because the &lt;strong&gt;context&lt;/strong&gt; changed.&lt;/p&gt;

&lt;p&gt;AI can write Python faster than you can type. Tutorials are everywhere. YouTube has 10,000 hours of beginner content.&lt;/p&gt;

&lt;p&gt;And yet most beginners still take 6-12 months to feel competent.&lt;/p&gt;

&lt;p&gt;Why? Because the problem was never access to information. It was knowing &lt;strong&gt;what to do with it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This roadmap is about that.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The 4-Week Foundation (What Actually Matters)
&lt;/h2&gt;

&lt;p&gt;Forget the giant course. Forget the 40-hour video. Here's what you actually need in your first month:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 1: Variables, Types, Control Flow&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Variables and basic types (&lt;code&gt;int&lt;/code&gt;, &lt;code&gt;str&lt;/code&gt;, &lt;code&gt;float&lt;/code&gt;, &lt;code&gt;bool&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;if&lt;/code&gt; / &lt;code&gt;elif&lt;/code&gt; / &lt;code&gt;else&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;for&lt;/code&gt; and &lt;code&gt;while&lt;/code&gt; loops&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Week 2: Data Structures&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lists&lt;/li&gt;
&lt;li&gt;Dictionaries&lt;/li&gt;
&lt;li&gt;Sets and tuples&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Week 3: Functions &amp;amp; Files&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing functions (&lt;code&gt;def&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Reading and writing files&lt;/li&gt;
&lt;li&gt;Error handling (&lt;code&gt;try&lt;/code&gt; / &lt;code&gt;except&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Week 4: First Real Project&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build something small that you'll actually use&lt;/li&gt;
&lt;li&gt;A weather CLI, a to-do list, a password generator&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. That's the foundation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to skip in the first month:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Classes and OOP (you don't need them yet)&lt;/li&gt;
&lt;li&gt;Frameworks (Django, Flask, FastAPI)&lt;/li&gt;
&lt;li&gt;Advanced libraries (NumPy, pandas)&lt;/li&gt;
&lt;li&gt;Anything that requires you to "just trust me" about why it works&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. The Month That Changes Everything (Week 5-8)
&lt;/h2&gt;

&lt;p&gt;Now you build. Not tutorials — projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rules for this phase:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;One project at a time.&lt;/strong&gt; Finish it before starting the next.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No tutorials for the project itself.&lt;/strong&gt; Use docs, search, and struggle.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Break things on purpose.&lt;/strong&gt; Change values, delete lines, see what happens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the error messages.&lt;/strong&gt; Actually read them. All of them.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Project ideas that teach real skills:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A CLI tool that automates something you do weekly&lt;/li&gt;
&lt;li&gt;A web scraper for a site you actually visit&lt;/li&gt;
&lt;li&gt;A small API client (weather, news, GitHub)&lt;/li&gt;
&lt;li&gt;A file organizer that sorts by extension or date&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end of this month, you'll have built 3-4 real things. That's more than 90% of tutorial followers ever do.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The Trap Nobody Warns You About
&lt;/h2&gt;

&lt;p&gt;Here's the thing about tutorials: they're designed to make you feel productive.&lt;/p&gt;

&lt;p&gt;You follow along, the code runs, you feel smart. Then you close the tab and try to build something on your own — and you freeze.&lt;/p&gt;

&lt;p&gt;That's not a sign you're bad at this. It's a sign that &lt;strong&gt;following instructions and producing code are different skills.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The fix isn't to avoid tutorials. It's to notice when a tutorial is teaching you &lt;strong&gt;recognition&lt;/strong&gt; instead of &lt;strong&gt;understanding&lt;/strong&gt; — and go build something that forces you to actually know it.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. How AI Changes the Game
&lt;/h2&gt;

&lt;p&gt;AI is the biggest variable in learning Python in 2026. Use it — but use it right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use AI for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explaining error messages&lt;/li&gt;
&lt;li&gt;Explaining unfamiliar code&lt;/li&gt;
&lt;li&gt;Suggesting approaches when you're stuck&lt;/li&gt;
&lt;li&gt;Reviewing your code for issues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don't use AI for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing code you don't understand&lt;/li&gt;
&lt;li&gt;Skipping the struggle entirely&lt;/li&gt;
&lt;li&gt;Making decisions about what to build&lt;/li&gt;
&lt;li&gt;Replacing your own thinking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The rule that works for me:&lt;/strong&gt; Try first. Ask AI second. Struggle for 20 minutes before asking. The answer lands better when you've earned the confusion.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. The Skills That Actually Matter
&lt;/h2&gt;

&lt;p&gt;In 2026, the most valuable Python skills are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Why It Matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reading code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You'll read 10x more than you write&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Debugging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Half of development is figuring out why things break&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Knowing what to build&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI can code. You decide what should exist.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Writing about it&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;If you can explain it, you understand it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Knowing when to stop&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The simplest solution is usually right&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Notice: none of these are "memorizing syntax."&lt;/p&gt;




&lt;h2&gt;
  
  
  8. The Honest Timeline
&lt;/h2&gt;

&lt;p&gt;Here's what progress actually looks like:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;What You'll Feel&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Week 1-2&lt;/td&gt;
&lt;td&gt;Overwhelmed. Everything is new.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Week 3-4&lt;/td&gt;
&lt;td&gt;"I think I'm getting it." Then you hit a wall.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Week 5-6&lt;/td&gt;
&lt;td&gt;First real project. Painful but exciting.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Week 7-8&lt;/td&gt;
&lt;td&gt;You realize you don't know as much as you thought.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Month 3&lt;/td&gt;
&lt;td&gt;You can build small things without a tutorial.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Month 6&lt;/td&gt;
&lt;td&gt;You can build medium things. You forget syntax — but you know how to look it up.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Year 1&lt;/td&gt;
&lt;td&gt;You stop calling yourself a beginner.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The gap between "I know Python" and "I can build with Python" is real. Everyone crosses it at a different pace. Most people quit before they do.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. What I'd Tell Someone Starting Today
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Don't try to learn everything.&lt;/strong&gt; Learn enough to build one thing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write about what you learn.&lt;/strong&gt; It's the fastest way to actually understand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build things you'll use.&lt;/strong&gt; Not tutorials. Tools.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use AI, but don't let it think for you.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publish your work.&lt;/strong&gt; Even if it's imperfect. Especially if it's imperfect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Show up daily.&lt;/strong&gt; Consistency beats motivation every time.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  10. Conclusion
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Learning Python isn't about memorizing syntax. It's about building enough small things that the syntax becomes invisible. The roadmap is simple. The execution is hard. That's the whole game."&lt;/p&gt;
&lt;/blockquote&gt;




</description>
      <category>python</category>
      <category>learning</category>
      <category>career</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Python Logging: How to Stop Using print () for Debugging</title>
      <dc:creator>Sameer Qaiser</dc:creator>
      <pubDate>Sat, 10 Oct 2026 07:57:40 +0000</pubDate>
      <link>https://dev.to/sameerqaiser17/python-logging-how-to-stop-using-print-for-debugging-54b6</link>
      <guid>https://dev.to/sameerqaiser17/python-logging-how-to-stop-using-print-for-debugging-54b6</guid>
      <description>&lt;h2&gt;
  
  
  📌 Quick Info
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Topic:&lt;/strong&gt; Using Python's logging module instead of print()&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target Audience:&lt;/strong&gt; Beginners who debug with print statements&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Learn a proper tool that scales&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"For my first few weeks of Python, every bug got solved the same way: add a print statement, run the code, read the output, delete the print. It worked — until it didn't. Then I learned about logging."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. The Problem with print()
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Starting divide&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, b = &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Result: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;You have to delete it later — or leave messy output in production&lt;/li&gt;
&lt;li&gt;No timestamps, no severity levels, no file output&lt;/li&gt;
&lt;li&gt;You can't turn it off without editing code&lt;/li&gt;
&lt;li&gt;Every debug session becomes a cleanup job&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. The Solution (Logging)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;logging&lt;/span&gt;

&lt;span class="nx"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;divide&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nx"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Starting divide&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a = {a}, b = {b}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;
    &lt;span class="nx"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Result: {result}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;Starting&lt;/span&gt; &lt;span class="nx"&gt;divide&lt;/span&gt;
&lt;span class="nx"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;5.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the &lt;strong&gt;debug line didn’t print- because the level is set to INFO&lt;/strong&gt;. Debug messages are hidden by default.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. The Five Log Levels
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;When to use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DEBUG&lt;/td&gt;
&lt;td&gt;Detailed info for diagnosing problem.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INFO&lt;/td&gt;
&lt;td&gt;Confirmation that things are working.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WARNING&lt;/td&gt;
&lt;td&gt;Something unexpected, but not breaking.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ERROR&lt;/td&gt;
&lt;td&gt;Something failed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRITICAL&lt;/td&gt;
&lt;td&gt;The Program cannot continue.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Set the level once, and all messages below it are hidden.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Real Example (Logging to a file)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;logging&lt;/span&gt;

&lt;span class="nx"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;app.log&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;%(asctime)s - %(levelname)s - %(message)s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nx"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;App started&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Low disk space&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Could not connect to database&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What’s in &lt;strong&gt;app.log:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;234&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;INFO&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="nx"&gt;started&lt;/span&gt;
&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;235&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;WARNING&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Low&lt;/span&gt; &lt;span class="nx"&gt;disk&lt;/span&gt; &lt;span class="nx"&gt;space&lt;/span&gt;
&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;236&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;ERROR&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;Could&lt;/span&gt; &lt;span class="nx"&gt;not&lt;/span&gt; &lt;span class="nx"&gt;connect&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;database&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have timestamps, levels, and a permanent record.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Try/Except + Logging
&lt;/h2&gt;

&lt;p&gt;The most useful combination:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;logging&lt;/span&gt;

&lt;span class="nx"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;INFO&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="nx"&gt;except&lt;/span&gt; &lt;span class="nx"&gt;ZeroDivisionError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Division failed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;logging.exception()&lt;/strong&gt; automatically includes the full traceback. No more losing the error message.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. What I learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;print() is for output. logging is for diagnostics. They're different tools.&lt;/li&gt;
&lt;li&gt;Log levels let you control verbosity without changing code&lt;/li&gt;
&lt;li&gt;logging.basicConfig() sets the format, level, and destination&lt;/li&gt;
&lt;li&gt;logging.exception() captures tracebacks automatically&lt;/li&gt;
&lt;li&gt;Log to a file for anything you want to keep&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8. Common Beginner Mistakes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Mistake 1:&lt;/strong&gt; Forgetting to set the level&lt;br&gt;
Without level=logging.INFO, only warnings and above show up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 2:&lt;/strong&gt; Using print() and logging together&lt;br&gt;
Pick one. Mixing them makes output hard to parse.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 3:&lt;/strong&gt; Logging sensitive data&lt;br&gt;
Never log passwords, tokens, or personal data — even at DEBUG level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 4:&lt;/strong&gt; Not using f-strings carefully&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User: {user}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="nx"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;User: %s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  9. Conclusion
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"print() gets you through your first week. logging gets you through the next year. The switch takes 10 minutes, and you'll never go back.”&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>beginners</category>
      <category>debugging</category>
    </item>
    <item>
      <title>The Gap Between Knowing Python and Being a Python Developer</title>
      <dc:creator>Sameer Qaiser</dc:creator>
      <pubDate>Fri, 09 Oct 2026 16:02:46 +0000</pubDate>
      <link>https://dev.to/sameerqaiser17/the-gap-between-knowing-python-and-being-a-python-developer-2nmi</link>
      <guid>https://dev.to/sameerqaiser17/the-gap-between-knowing-python-and-being-a-python-developer-2nmi</guid>
      <description>&lt;h2&gt;
  
  
  📌 Quick Info
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Topic:&lt;/strong&gt; The difference between learning syntax and becoming a developer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target Audience:&lt;/strong&gt; Beginners, self-taught developers, anyone stuck in tutorial hell&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Name the gap and explain how to cross it&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"I know Python. I've written 25 articles about it. But for a long time, I wasn't a Python developer — I was someone who knew the syntax. Those are different things."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. Two Different States
&lt;/h2&gt;

&lt;p&gt;There's a difference between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Knowing Python&lt;/strong&gt; — you understand the syntax, you can follow tutorials, you can write small scripts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Being a Python developer&lt;/strong&gt; — you can build things from scratch, debug them, and ship them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both feel similar when you're in them. But they're separated by a gap most beginners don't see until they're standing right in front of it.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. How I Noticed the Gap
&lt;/h2&gt;

&lt;p&gt;I was writing tutorials. Following my own templates. Publishing daily. And I felt productive.&lt;/p&gt;

&lt;p&gt;Then I tried to build something without a tutorial — a small tool for myself. No guide. No code to copy. Just me, a blank file, and an idea.&lt;/p&gt;

&lt;p&gt;I froze.&lt;/p&gt;

&lt;p&gt;I knew the syntax. I knew the concepts. But I didn't know how to &lt;em&gt;start&lt;/em&gt;. I didn't know how to plan. I didn't know how to debug something that didn't work the first time.&lt;/p&gt;

&lt;p&gt;That's when I realized: I wasn't a developer yet. I was a student who was very good at following instructions.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Why the Gap Exists
&lt;/h2&gt;

&lt;p&gt;Three reasons:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Tutorials teach recognition, not production.&lt;/strong&gt;&lt;br&gt;
Copying working code teaches you what working code looks like. It doesn't teach you how to produce it. Those are different skills.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Tutorials remove the messy parts.&lt;/strong&gt;&lt;br&gt;
They show you the fixed version. They skip the six hours of staring at something that should work and doesn't. But that mess is where learning actually happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Tutorials don't teach planning.&lt;/strong&gt;&lt;br&gt;
They hand you a project that's already been decomposed. Real development starts with a vague idea and requires you to break it down yourself.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. What Crossing the Gap Looks Like
&lt;/h2&gt;

&lt;p&gt;I don't think there's a single moment. It's more like a slow shift.&lt;/p&gt;

&lt;p&gt;Here's what I've been doing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Build without a tutorial.&lt;/strong&gt;&lt;br&gt;
Even something small. A script that does one thing you actually need. Struggle with it. Get stuck. Figure it out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Debug by narrowing.&lt;/strong&gt;&lt;br&gt;
When something breaks, don't stare at the whole thing. Make the question smaller. "Is this function even running?" "Is the value what I think it is?" Narrow until you find the line.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Read code, not just tutorials.&lt;/strong&gt;&lt;br&gt;
Open a real Python library on GitHub. You won't understand it all. That's fine. Try to understand one function.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Write about what you don't understand.&lt;/strong&gt;&lt;br&gt;
The tutorials I've learned the most from are the ones where I got stuck, figured it out, and wrote down the answer. Writing forces understanding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Ship something imperfect.&lt;/strong&gt;&lt;br&gt;
The first version won't be good. That's not a bug — that's the process. Ship it, then improve it.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. The Uncomfortable Truth
&lt;/h2&gt;

&lt;p&gt;Crossing the gap is uncomfortable. Not because it's hard, but because it's &lt;strong&gt;unguided&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When you're following a tutorial, you always know the next step. When you're building on your own, you don't. That uncertainty is exactly what makes it growth.&lt;/p&gt;

&lt;p&gt;The gap isn't a wall. It's a fog. And the only way through is to walk into it.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. What I'd Tell Someone in the Gap
&lt;/h2&gt;

&lt;p&gt;You're not failing. You're exactly where you should be.&lt;/p&gt;

&lt;p&gt;The fact that you can follow a tutorial but can't build your own thing isn't a sign that you're not cut out for this. It's a sign that you've learned the first layer. The second layer is harder, but it's also where everything gets interesting.&lt;/p&gt;

&lt;p&gt;The only way out is through. Build something small. Break it. Fix it. Build the next thing.&lt;/p&gt;

&lt;p&gt;The gap doesn't close because you learn more. It closes because you build more.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Conclusion
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Knowing Python and being a Python developer are two different things. The first is a state you can reach by reading. The second requires you to build, break, and figure out things nobody taught you. I'm still crossing the gap. But at least now I can see it."&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>python</category>
      <category>career</category>
      <category>discuss</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Python CSV Files: Reading and Writing for Beginners</title>
      <dc:creator>Sameer Qaiser</dc:creator>
      <pubDate>Thu, 08 Oct 2026 08:40:56 +0000</pubDate>
      <link>https://dev.to/sameerqaiser17/python-csv-files-reading-and-writing-for-beginners-18p3</link>
      <guid>https://dev.to/sameerqaiser17/python-csv-files-reading-and-writing-for-beginners-18p3</guid>
      <description>&lt;h2&gt;
  
  
  📌 Quick Info
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Topic:&lt;/strong&gt; Working with CSV files in Python&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target Audience:&lt;/strong&gt; Beginners who know file handling and dictionaries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Understand how to read, write, and process CSV data&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"I could save data to a JSON file. But every spreadsheet I've ever seen exports to CSV. So I learned how to work with CSVs — and suddenly I could process real data."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. What Is a CSV?
&lt;/h2&gt;

&lt;p&gt;CSV stands for &lt;strong&gt;Comma-Separated Values.&lt;/strong&gt; It's a plain text file where each line is a row, and each value is separated by a comma.&lt;/p&gt;

&lt;p&gt;Example — a list of users:&lt;/p&gt;

&lt;p&gt;name,age,city&lt;br&gt;
Ali,25,Karachi&lt;br&gt;
Sara,30,Lahore&lt;br&gt;
Ahmed,28,Islamabad&lt;/p&gt;

&lt;p&gt;That's it. No formatting, no colors, no formulas. Just text.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. Why CSV Matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Every spreadsheet exports to CSV&lt;/strong&gt; — Excel, Google Sheets, Numbers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every database can export to CSV&lt;/strong&gt; — MySQL, PostgreSQL, SQLite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every data tool imports CSV&lt;/strong&gt; — pandas, R, Tableau&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you can read and write CSV in Python, you can process real-world data.&lt;/p&gt;


&lt;h2&gt;
  
  
  4. Reading a CSV (The Manual Way)
&lt;/h2&gt;

&lt;p&gt;You could read a CSV like a normal text file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;users.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;,&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;age&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;city&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ali&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;25&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Karachi&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sara&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;30&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lahore&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works — but notice that "25" is a string, not a number. And if any value contains a comma (like an address), this breaks.&lt;/p&gt;

&lt;p&gt;That's why Python has a built-in &lt;strong&gt;csv&lt;/strong&gt; module.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Reading a CSV (The Right Way)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;csv&lt;/span&gt;

&lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;users.csv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;r&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ali&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;age&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;25&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;city&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Karachi&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sara&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;age&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;30&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;city&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Lahore&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;DictReader&lt;/strong&gt; uses the first row as headers, and each row becomes a dictionary. Much cleaner.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Writing a CSV
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;csv&lt;/span&gt;

&lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ali&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;age&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;city&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Karachi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sara&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;age&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;city&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Lahore&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;users.csv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;w&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fieldnames&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;age&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;city&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="nx"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeheader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nx"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What’s in the file:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;
&lt;span class="nx"&gt;Ali&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;Karachi&lt;/span&gt;
&lt;span class="nx"&gt;Sara&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;Lahore&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice &lt;strong&gt;newline=""&lt;/strong&gt;. Without it, Python adds extra blank lines on Windows.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Real Example (Processing Data)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;csv&lt;/span&gt;

&lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;users.csv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;r&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;adults&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;age&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;adults.csv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;w&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fieldnames&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;age&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;city&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="nx"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeheader&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nx"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;adults&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s a mini data pipeline: read. filter, write. Ten lines.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Common Mistakes Beginners Make
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Mistake 1: Forgetting &lt;strong&gt;newline=””&lt;/strong&gt; when writing. You get blank lines between every row on windows.&lt;/li&gt;
&lt;li&gt;Mistake 2: Assuming values are numbers CSV values are always strings. Convert with &lt;strong&gt;int()&lt;/strong&gt; or &lt;strong&gt;float()&lt;/strong&gt; if needed.&lt;/li&gt;
&lt;li&gt;Mistake 3: Not handling missing files. Always check with &lt;strong&gt;os.path.exists()&lt;/strong&gt; before reading.&lt;/li&gt;
&lt;li&gt;Mistake 4: Using wrong delimiter. Some CSVs use semicolons or tabs. Pass &lt;strong&gt;delimiter=”;”&lt;/strong&gt; or &lt;strong&gt;delimiter=”\t”&lt;/strong&gt; if needed.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  9. What I learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;CSV is everywhere&lt;/em&gt;&lt;/strong&gt; — it's the default export of every spreadsheet and database&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;csv.DictReader&lt;/strong&gt; gives you dictionaries instead of lists&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;csv.DictWriter&lt;/strong&gt; lets you write rows with named fields&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;newline=""&lt;/strong&gt; prevents blank lines on Windows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;All CSV values are strings&lt;/em&gt;&lt;/strong&gt; — convert them yourself&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  10. Conclusion
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"CSV files felt boring until I realized they're how the real world moves data around. Every spreadsheet, every database export, every report — it's all CSV underneath. Learning this opened up a new kind of project.”&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>python</category>
      <category>beginners</category>
      <category>data</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why Most Python Tutorials Teach the Wrong Thing First</title>
      <dc:creator>Sameer Qaiser</dc:creator>
      <pubDate>Wed, 07 Oct 2026 08:03:47 +0000</pubDate>
      <link>https://dev.to/sameerqaiser17/why-most-python-tutorials-teach-the-wrong-thing-first-1fj0</link>
      <guid>https://dev.to/sameerqaiser17/why-most-python-tutorials-teach-the-wrong-thing-first-1fj0</guid>
      <description>&lt;h2&gt;
  
  
  📌 Quick Info
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Topic:&lt;/strong&gt; A critique of how Python is usually taught&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target Audience:&lt;/strong&gt; Beginners, self-taught developers, and anyone who writes tutorials&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Make a real argument — not just complain&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"I've read dozens of Python tutorials. I've written 23 articles of my own. And the more I look at how Python is taught, the more I think most tutorials start in the wrong place."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. The Standard Recipe
&lt;/h2&gt;

&lt;p&gt;Almost every beginner Python tutorial follows the same structure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install Python&lt;/li&gt;
&lt;li&gt;Print "Hello, World"&lt;/li&gt;
&lt;li&gt;Variables&lt;/li&gt;
&lt;li&gt;Data types&lt;/li&gt;
&lt;li&gt;If-else&lt;/li&gt;
&lt;li&gt;Loops&lt;/li&gt;
&lt;li&gt;Functions&lt;/li&gt;
&lt;li&gt;Lists and dictionaries&lt;/li&gt;
&lt;li&gt;Classes&lt;/li&gt;
&lt;li&gt;"Now build a project"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It works. People learn from it. I learned from it.&lt;/p&gt;

&lt;p&gt;But there's a problem. And it's not about the topics — it's about the order.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The Wrong Thing First
&lt;/h2&gt;

&lt;p&gt;Most tutorials start with &lt;strong&gt;syntax&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They teach you how to write code before teaching you why code exists.&lt;/p&gt;

&lt;p&gt;So the beginner learns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How to write &lt;code&gt;if x &amp;gt; 5:&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;How to write &lt;code&gt;for i in range(10):&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;How to write &lt;code&gt;def greet():&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And then they sit down to build something and realize they don't actually know what to build, why to build it, or how the pieces fit together.&lt;/p&gt;

&lt;p&gt;That's not a knowledge gap. It's a &lt;strong&gt;context gap.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. What Should Come First
&lt;/h2&gt;

&lt;p&gt;I think the order is backwards. The first thing a beginner should learn isn't syntax — it's &lt;strong&gt;purpose.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's what I mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Before &lt;code&gt;if-else&lt;/code&gt;&lt;/strong&gt; — teach decision-making. "Programs need to choose between options."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Before loops&lt;/strong&gt; — teach repetition. "Programs need to do things many times."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Before functions&lt;/strong&gt; — teach reusability. "Programs need to avoid repeating themselves."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Before classes&lt;/strong&gt; — teach grouping. "Programs need to keep related data together."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you understand the &lt;em&gt;why&lt;/em&gt;, the &lt;em&gt;how&lt;/em&gt; is easy. The syntax is just the notation.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The Tutorial Trap
&lt;/h2&gt;

&lt;p&gt;Here's the trap most beginners fall into:&lt;/p&gt;

&lt;p&gt;They follow a tutorial. They copy the code. It runs. They feel like they learned something.&lt;/p&gt;

&lt;p&gt;Then they close the tab and try to write something on their own — and they can't.&lt;/p&gt;

&lt;p&gt;Why? Because copying working code teaches you &lt;strong&gt;recognition&lt;/strong&gt;, not &lt;strong&gt;understanding.&lt;/strong&gt; You recognize what working code looks like. But you can't produce it.&lt;/p&gt;

&lt;p&gt;This is the gap between "I've seen this" and "I can do this."&lt;/p&gt;

&lt;p&gt;And most tutorials don't address it. They assume that if you follow along, you'll absorb the skill by osmosis.&lt;/p&gt;

&lt;p&gt;You won't.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. What Actually Works
&lt;/h2&gt;

&lt;p&gt;Based on my own experience (23 articles, 3 weeks, a lot of mistakes), here's what actually helps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Write about what you learn.&lt;/strong&gt;&lt;br&gt;
I didn't understand &lt;code&gt;range(1, 6)&lt;/code&gt; until I wrote a tutorial explaining why it stops at 5. Writing forces you to understand.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Build small things.&lt;/strong&gt;&lt;br&gt;
Not "build a full-stack app." Build a 30-line script that does one thing. Then build another. Then another.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Break things on purpose.&lt;/strong&gt;&lt;br&gt;
Change a value. Delete a line. See what happens. The error message teaches you more than the working code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Rebuild the same thing twice.&lt;/strong&gt;&lt;br&gt;
Build a to-do list. Then close the file. Open a new one. Build it again from scratch, without looking. That's the real test.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. What I'd Tell Tutorial Writers
&lt;/h2&gt;

&lt;p&gt;If you're writing Python tutorials, here's my honest ask:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lead with the problem.&lt;/strong&gt;&lt;br&gt;
Not "here's how &lt;code&gt;if-else&lt;/code&gt; works." But "here's a situation where you need to make a decision."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Show the failure first.&lt;/strong&gt;&lt;br&gt;
Show the code that breaks. Then show how the concept fixes it. The contrast teaches more than the concept alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stop at the right moment.&lt;/strong&gt;&lt;br&gt;
Don't explain everything. Leave a gap for the reader to figure out. That gap is where learning happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;End with a challenge, not a summary.&lt;/strong&gt;&lt;br&gt;
"Here's a small thing to try" beats "here's what we covered."&lt;/p&gt;




&lt;h2&gt;
  
  
  8. The Honest Caveat
&lt;/h2&gt;

&lt;p&gt;This isn't a takedown of tutorials. I've written 23 of them. They work — for a certain stage of learning.&lt;/p&gt;

&lt;p&gt;But they have a ceiling. And if you never break past that ceiling, you'll be stuck in tutorial hell forever: able to follow along, unable to build on your own.&lt;/p&gt;

&lt;p&gt;The fix isn't to stop reading tutorials. It's to notice when a tutorial is teaching you recognition instead of understanding — and to go build something that forces you to actually know it.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Conclusion
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"The right question isn't 'which tutorial should I follow next?' It's 'what can I build that I don't know how to build yet?' Everything else is just preparation."&lt;/p&gt;
&lt;/blockquote&gt;




</description>
      <category>python</category>
      <category>discuss</category>
      <category>beginners</category>
      <category>learning</category>
    </item>
    <item>
      <title>Building a To-Do List App in Python (With File Saving)</title>
      <dc:creator>Sameer Qaiser</dc:creator>
      <pubDate>Tue, 06 Oct 2026 07:56:44 +0000</pubDate>
      <link>https://dev.to/sameerqaiser17/building-a-to-do-list-app-in-python-with-file-saving-2o23</link>
      <guid>https://dev.to/sameerqaiser17/building-a-to-do-list-app-in-python-with-file-saving-2o23</guid>
      <description>&lt;h2&gt;
  
  
  📌 Quick Info
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Topic:&lt;/strong&gt; A beginner project that saves data to a file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target Audience:&lt;/strong&gt; Beginners who know the basics and want a real project&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Build a working to-do list that remembers tasks after you close it&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"My first two projects didn't save anything. Close the program, everything gone. Then I learned how to save data to a file — and suddenly my programs could remember."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. What We're Building
&lt;/h2&gt;

&lt;p&gt;A simple CLI to-do list where you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add a task&lt;/li&gt;
&lt;li&gt;List all tasks&lt;/li&gt;
&lt;li&gt;Mark a task as done&lt;/li&gt;
&lt;li&gt;Delete a task&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Save everything to a file&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you reopen the program, your tasks are still there.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Why This Project Matters
&lt;/h2&gt;

&lt;p&gt;Most beginner projects don't save anything. That's fine for practice, but it's not how real tools work.&lt;/p&gt;

&lt;p&gt;Real apps remember. Your notes app remembers. Your browser history remembers. Your IDE remembers which files you had open.&lt;/p&gt;

&lt;p&gt;Learning to save data to a file is the step from "toy" to "useful."&lt;/p&gt;




&lt;h2&gt;
  
  
  4. The Code
&lt;/h2&gt;



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

&lt;span class="n"&gt;FILE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;todos.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;load_tasks&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save_tasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;show_tasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No tasks yet.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✓&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;done&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. [&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;] &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;done&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nf"&gt;save_tasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Added: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;complete_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;done&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
        &lt;span class="nf"&gt;save_tasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Completed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;delete_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;removed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;save_tasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Deleted: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;removed&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load_tasks&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;1. List  2. Add  3. Complete  4. Delete  5. Quit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;choice&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Choose: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;show_tasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Task: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;add_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;show_tasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Complete #: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                &lt;span class="nf"&gt;complete_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Enter a number.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;show_tasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Delete #: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                &lt;span class="nf"&gt;delete_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Enter a number.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;choice&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bye!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid choice.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. How It Works
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Storage&lt;/strong&gt;: Tasks are stored as a list of dictionaries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Buy groceries&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;done&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Write article&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;done&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Load &amp;amp; save&lt;/strong&gt; : load_tasks() reads the file if it exists. save_tasks() writes the whole list back every time somethiing changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Loop&lt;/strong&gt;: The main loop shows a menu, takes input, and calls the right function. It runs until you pick “Quit.”&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Run It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;python&lt;/span&gt; &lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;py&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;List&lt;/span&gt;  &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Add&lt;/span&gt;  &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Complete&lt;/span&gt;  &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Delete&lt;/span&gt;  &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Quit&lt;/span&gt;
&lt;span class="nx"&gt;Choose&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="nx"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Buy&lt;/span&gt; &lt;span class="nx"&gt;groceries&lt;/span&gt;
&lt;span class="nx"&gt;Added&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Buy&lt;/span&gt; &lt;span class="nx"&gt;groceries&lt;/span&gt;

&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;List&lt;/span&gt;  &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Add&lt;/span&gt;  &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Complete&lt;/span&gt;  &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Delete&lt;/span&gt;  &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;Quit&lt;/span&gt;
&lt;span class="nx"&gt;Choose&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="nx"&gt;Buy&lt;/span&gt; &lt;span class="nx"&gt;groceries&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Close the program. Reopen it. Run 1 again. Your task is still there.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. What I learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;json.dump() and json.load() are how you save and load structured data&lt;/li&gt;
&lt;li&gt;os.path.exists() checks if a file exists before reading it&lt;/li&gt;
&lt;li&gt;enumerate() gives you both the index and the value in a loop&lt;/li&gt;
&lt;li&gt;try/except keeps the program from crashing on bad input&lt;/li&gt;
&lt;li&gt;Saving on every change means the file is always up to date&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8. What To Add Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Due dates — add a due field to each task&lt;/li&gt;
&lt;li&gt;Priorities — sort tasks by importance&lt;/li&gt;
&lt;li&gt;Categories — group tasks by project&lt;/li&gt;
&lt;li&gt;A GUI — rebuild it with Tkinter&lt;/li&gt;
&lt;li&gt;Search — find tasks by keyword&lt;/li&gt;
&lt;li&gt;Undo — keep a history of changes&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  9. Conclusion
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"This was the first project I built that felt real. Not because the code was fancy — but because it remembered things. That's the difference between a tutorial and a tool.”&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>tutorial</category>
      <category>programming</category>
      <category>python</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Building a Password Generator in Python</title>
      <dc:creator>Sameer Qaiser</dc:creator>
      <pubDate>Mon, 05 Oct 2026 08:06:07 +0000</pubDate>
      <link>https://dev.to/sameerqaiser17/building-a-password-generator-in-python-2g89</link>
      <guid>https://dev.to/sameerqaiser17/building-a-password-generator-in-python-2g89</guid>
      <description>&lt;h2&gt;
  
  
  📌 Quick Info
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Topic:&lt;/strong&gt; A beginner project using Python's built-in libraries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target Audience:&lt;/strong&gt; Beginners who want a second project&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Build something useful in under 40 lines&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"The first project I built was a weather app. The second was a password generator. It took 30 minutes and I use it almost every week."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. What We're Building
&lt;/h2&gt;

&lt;p&gt;A CLI tool that generates a strong random password:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python password.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Your&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="nx"&gt;Kx&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;m2Qa&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="nx"&gt;Lp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also choose the length and whether to include symbols.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Why This Is a Good Beginner Project
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Uses built-in Python Libraries (no pip install needed)&lt;/li&gt;
&lt;li&gt;Teaches modules, strings, loops, and user input&lt;/li&gt;
&lt;li&gt;You end up with something you’ll actually use&lt;/li&gt;
&lt;li&gt;Small enough to finish in one sitting&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. The Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;random&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;

&lt;span class="nx"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_password&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;use_symbols&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nx"&gt;letters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ascii_letters&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;digits&lt;/span&gt;
    &lt;span class="nx"&gt;symbols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;!@#$%^&amp;amp;*()-_=+&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

    &lt;span class="nx"&gt;characters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;letters&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;use_symbols&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nx"&gt;characters&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;symbols&lt;/span&gt;

    &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;characters&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="nx"&gt;_&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt;

&lt;span class="nx"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Password length (default 12): &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;except&lt;/span&gt; &lt;span class="nx"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid length. Using 12.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;

    &lt;span class="nx"&gt;use_symbols&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Include symbols? (y/n): &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

    &lt;span class="nx"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generate_password&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;use_symbols&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Your password: {password}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;__main__&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. How It Works (Line By Line)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Line 1-2: Import random (for picking characters) and string (for ready-made character sets).&lt;/li&gt;
&lt;li&gt;Line 4: generate_password() takes a length and a flag for symbols.&lt;/li&gt;
&lt;li&gt;Line 5-6: Build the character pool- letters, digits, and optional symbols.&lt;/li&gt;
&lt;li&gt;Line 9: “”. join(random.choice(characters)for_in range(length)) picks a random character length times and joins them into one string.&lt;/li&gt;
&lt;li&gt;Line 12-22: main() handles user input and calls the generator.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Real Example (What It Looks Like In Action)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Password&lt;/span&gt; &lt;span class="nf"&gt;length &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;
&lt;span class="nx"&gt;Include&lt;/span&gt; &lt;span class="nx"&gt;symbols&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;

&lt;span class="nx"&gt;Your&lt;/span&gt; &lt;span class="nx"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="nx"&gt;Kx&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;m2Qa&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="nx"&gt;LpWn$3f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Strong, random, and 16 characters long. That’s a better password than most people use.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. What I learned Building This
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;random.choice() is the core of randomness in Python&lt;/li&gt;
&lt;li&gt;string module has ready-made character sets (ascii_letters, digits, punctuation)&lt;/li&gt;
&lt;li&gt;"".join(...) is how you turn a list of characters into a string&lt;/li&gt;
&lt;li&gt;input() returns a string — you have to convert it with int() if you need a number&lt;/li&gt;
&lt;li&gt;try/except keeps the program from crashing on bad input&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  8. What To Add Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Save generated passwords to a file (encrypted, ideally)&lt;/li&gt;
&lt;li&gt;Copy to clipboard using pyperclip&lt;/li&gt;
&lt;li&gt;Add a strength checker that scores the password&lt;/li&gt;
&lt;li&gt;Generate passphrases instead of random strings (e.g., "correct-horse-battery-staple")&lt;/li&gt;
&lt;li&gt;Turn it into a GUI with Tkinter&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  9. Conclusion
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"This project took 30 minutes to build and I've used it dozens of times since. That's the thing about small projects — they teach you the syntax and they earn their place in your workflow. Build something small. Use it. Then build the next one.”&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>python</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Building a Weather CLI App in Python (Beginner Project)</title>
      <dc:creator>Sameer Qaiser</dc:creator>
      <pubDate>Sun, 04 Oct 2026 07:59:02 +0000</pubDate>
      <link>https://dev.to/sameerqaiser17/building-a-weather-cli-app-in-python-beginner-project-1f59</link>
      <guid>https://dev.to/sameerqaiser17/building-a-weather-cli-app-in-python-beginner-project-1f59</guid>
      <description>&lt;h2&gt;
  
  
  📌 Quick Info
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Topic:&lt;/strong&gt; Building a real command-line app with Python&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target Audience:&lt;/strong&gt; Beginners who know the basics and want a first project&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Combine everything you've learned into one working tool&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"I'd learned variables, loops, functions, APIs, and JSON. But I hadn't built anything real. So I built a weather app — and it taught me more than any tutorial."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. What We're Building
&lt;/h2&gt;

&lt;p&gt;A command-line tool where you type:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python weather.py Karachi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And it prints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Weather&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;Karachi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="nx"&gt;Temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;32.4&lt;/span&gt;&lt;span class="err"&gt;°&lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;
&lt;span class="nx"&gt;Wind&lt;/span&gt; &lt;span class="nx"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;12.5&lt;/span&gt; &lt;span class="nx"&gt;km&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No Frameworks. No GUI. Just Python + an API.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. What You’ll Need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python Installed&lt;/li&gt;
&lt;li&gt;The requests library:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;pip&lt;/span&gt; &lt;span class="nx"&gt;install&lt;/span&gt; &lt;span class="nx"&gt;requests&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;An idea of how APIs work (see my earlier article)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. The Weather API
&lt;/h2&gt;

&lt;p&gt;We'll use Open-Meteo because it's free and doesn't require an API key.&lt;/p&gt;

&lt;p&gt;It takes latitude and longitude, and returns weather data.&lt;/p&gt;

&lt;p&gt;But first, we need to turn a city name into coordinates. For that, we'll use their geocoding endpoint.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Step 1: Get Coordinates from a City Name
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;requests&lt;/span&gt;

&lt;span class="nx"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_coordinates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://geocoding-api.open-meteo.com/v1/search&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;count&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;results&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;not&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;None&lt;/span&gt;

    &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;results&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;latitude&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;longitude&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Step 2: Get the Weather
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;lon&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.open-meteo.com/v1/forecast&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;latitude&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;lat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;longitude&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;lon&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;current_weather&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;True&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;current_weather&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Step 3: Put It Together
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;sys&lt;/span&gt;

&lt;span class="nx"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Usage: python weather.py &amp;lt;city&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;

    &lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="nx"&gt;coords&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_coordinates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;not&lt;/span&gt; &lt;span class="nx"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Couldn't find city: {city}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;

    &lt;span class="nx"&gt;weather&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;coords&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Weather in {city}:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Temperature: {weather['temperature']}°C&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Wind speed: {weather['windspeed']} km/h&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;__main__&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Run It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;python&lt;/span&gt; &lt;span class="nx"&gt;weather&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;py&lt;/span&gt; &lt;span class="nx"&gt;Karachi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Weather&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;Karachi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="nx"&gt;Temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;32.4&lt;/span&gt;&lt;span class="err"&gt;°&lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;
&lt;span class="nx"&gt;Wind&lt;/span&gt; &lt;span class="nx"&gt;speed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;12.5&lt;/span&gt; &lt;span class="nx"&gt;km&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it. A working weather app in 30 Lines.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. What I Learned Building This
&lt;/h2&gt;

&lt;p&gt;· APIs are just URLs with parameters. Once I saw that, everything clicked.&lt;br&gt;
· Functions keep things clean. Without get_coordinates and get_weather, the file would be a mess.&lt;br&gt;
· sys.argv is how you take input from the terminal. Simple, but I'd never used it before.&lt;br&gt;
· Error handling matters. What if the city doesn't exist? What if the API is down? Always check.&lt;br&gt;
· Small projects teach more than big tutorials. This one taught me more than three courses combined.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. What To Build Next
&lt;/h2&gt;

&lt;p&gt;Once you have this working, try:&lt;/p&gt;

&lt;p&gt;· Add error handling for network failures&lt;br&gt;
· Save favorite cities to a JSON file&lt;br&gt;
· Format the output with colors (using colorama)&lt;br&gt;
· Add a forecast instead of just current weather&lt;br&gt;
· Turn it into a web app with Flask or FastAPI&lt;/p&gt;




&lt;h2&gt;
  
  
  11. Conclusion
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Building this tiny app taught me more than reading ten articles about APIs. If you're stuck in tutorial hell, pick something small and build it. You'll learn the syntax by breaking it. That's the whole game.”&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>tutorial</category>
      <category>programming</category>
      <category>beginners</category>
      <category>python</category>
    </item>
    <item>
      <title>Why Python Is the Most Modern and Important Language of Computer</title>
      <dc:creator>Sameer Qaiser</dc:creator>
      <pubDate>Sat, 03 Oct 2026 07:56:13 +0000</pubDate>
      <link>https://dev.to/sameerqaiser17/why-python-is-the-most-modern-and-important-language-of-computer-115a</link>
      <guid>https://dev.to/sameerqaiser17/why-python-is-the-most-modern-and-important-language-of-computer-115a</guid>
      <description>&lt;h2&gt;
  
  
  📌 Quick Info
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Topic:&lt;/strong&gt; Why Python matters in 2026 and beyond&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target Audience:&lt;/strong&gt; Beginners deciding what to learn + experienced devs curious about the hype&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Make the case for Python with real reasons, not fanboy energy&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Every few years, someone declares a new language 'the future.' I've been learning Python for a few weeks, and I think the reason it keeps winning isn't because it's trendy. It's because it's honest."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. The Wrong Question
&lt;/h2&gt;

&lt;p&gt;People always ask: &lt;strong&gt;"Which language is the best?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the wrong question.&lt;/p&gt;

&lt;p&gt;The right question is: &lt;strong&gt;"Which language actually gets used to build the things I care about?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For that question, Python keeps winning — over and over.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Where Python Actually Runs
&lt;/h2&gt;

&lt;p&gt;This isn't a "Python is nice" article. This is a "Python is literally running the world" article.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI and machine learning&lt;/strong&gt; — TensorFlow, PyTorch, scikit-learn. Almost every AI model you've heard of was trained with Python.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data science&lt;/strong&gt; — pandas, NumPy, Jupyter. If a company has data, someone is using Python to look at it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web backends&lt;/strong&gt; — Django, Flask, FastAPI. Instagram, Spotify, Reddit all use Python at scale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation and scripting&lt;/strong&gt; — The boring scripts that save companies hours. That's Python.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scientific research&lt;/strong&gt; — NASA, CERN, biotech labs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Education&lt;/strong&gt; — It's the #1 language taught in universities and bootcamps worldwide.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a field involves processing information, Python is probably already there.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Why It Keeps Winning
&lt;/h2&gt;

&lt;p&gt;Three reasons.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. It reads like English.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_admin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Welcome back!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don't need to be a programmer to guess what that does.&lt;/p&gt;

&lt;p&gt;That's not a small thing — it means beginners can start building real things in days, not months.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The library ecosystem is unmatched.&lt;/strong&gt;
Whatever you're trying to do — scrape a website, analyze a dataset, send an email, build a website — someone has already written a Python library for it. You don't start from scratch. You start from "already mostly done."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI made Python more important, not less.&lt;/strong&gt;
When people say "AI can write code," they usually mean "AI can write Python." That's the language every AI coding tool is best at. Which means if you know Python, you can read, debug, and direct the AI's output. That's a skill, not a replacement.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  5. The “AI Will Replace Coding” Argument
&lt;/h2&gt;

&lt;p&gt;I hear this constantly. Here's my honest take:&lt;/p&gt;

&lt;p&gt;AI is very good at writing code. It is not good at knowing what code should exist.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It can write a script. It can't tell you why your business needs one.&lt;/li&gt;
&lt;li&gt;It can fix a bug. It can't tell you which bug is worth fixing.&lt;/li&gt;
&lt;li&gt;It can generate a function. It can't tell you if the function should exist at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The people who will thrive in the AI era are the ones who can read, judge, and direct AI output. And Python is the language that output comes in most often.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Why I Chose Python
&lt;/h2&gt;

&lt;p&gt;I'm a beginner. I could have picked JavaScript, Rust, Go, or anything else.&lt;/p&gt;

&lt;p&gt;I picked Python because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The syntax let me focus on learning to think, not learning to fight the language.&lt;/li&gt;
&lt;li&gt;The community is enormous — every error I've hit has already been solved on Stack Overflow.&lt;/li&gt;
&lt;li&gt;It's the language of the fields I care about: AI, automation, and data.&lt;/li&gt;
&lt;li&gt;It's the language my AI tools write best. That's not cheating — that's strategy.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. The Honest Caveat
&lt;/h2&gt;

&lt;p&gt;Python isn't perfect.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's slower than C or Rust for heavy computation.&lt;/li&gt;
&lt;li&gt;It's not ideal for mobile apps.&lt;/li&gt;
&lt;li&gt;It's not the best choice for real-time systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But "not perfect" and "not important" are different things. Python isn't the right tool for every job. It's the right tool for the jobs that matter most right now.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. Conclusion
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“Python isn't the future because it's trendy. It's the future because it's honest — it lets you think about the problem, not the syntax.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;And in a world where AI writes more and more code, the language you can read, judge, and direct matters more than the language you can memorize.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>beginners</category>
      <category>career</category>
      <category>programming</category>
    </item>
    <item>
      <title>Python APIs: Making HTTP Requests for Beginners</title>
      <dc:creator>Sameer Qaiser</dc:creator>
      <pubDate>Fri, 02 Oct 2026 15:17:29 +0000</pubDate>
      <link>https://dev.to/sameerqaiser17/python-apis-making-http-requests-for-beginners-201d</link>
      <guid>https://dev.to/sameerqaiser17/python-apis-making-http-requests-for-beginners-201d</guid>
      <description>&lt;h2&gt;
  
  
  📌 Quick Info
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Topic:&lt;/strong&gt; Making HTTP requests in Python&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Target Audience:&lt;/strong&gt; Beginners who know functions and JSON&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Understand how to fetch data from the internet with Python&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Introduction
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Every app I used was pulling data from somewhere. Weather apps, social media, online stores — they all talk to servers. Then I learned about APIs and HTTP requests, and I could finally build programs that talk to the internet."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2. What Is an API?
&lt;/h2&gt;

&lt;p&gt;An API (Application Programming Interface) is a way for two programs to talk to each other.&lt;/p&gt;

&lt;p&gt;When you open a weather app, it doesn't know the weather itself. It asks a server: &lt;em&gt;"What's the weather in Karachi?"&lt;/em&gt; The server responds with data. That's an API.&lt;/p&gt;

&lt;p&gt;Think of it as a waiter in a restaurant — you don't walk into the kitchen. You tell the waiter what you want. The waiter brings it back.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. The Problem (Without APIs)
&lt;/h2&gt;

&lt;p&gt;Imagine trying to get the weather manually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open a browser&lt;/li&gt;
&lt;li&gt;Go to a weather site&lt;/li&gt;
&lt;li&gt;Read the temperature&lt;/li&gt;
&lt;li&gt;Copy it down&lt;/li&gt;
&lt;li&gt;Repeat every hour&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Not scalable.&lt;/strong&gt; &lt;strong&gt;Not automatable.&lt;/strong&gt; You need a way for code to ask for data directly.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. The Solution (Using &lt;code&gt;requests&lt;/code&gt;)
&lt;/h2&gt;



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

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;https://api.github.com/users/torvalds&amp;gt;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;public_repos&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Linus&lt;/span&gt; &lt;span class="nx"&gt;Torvalds&lt;/span&gt;
&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;You just fetched&lt;/strong&gt; live data from &lt;em&gt;Github’s API&lt;/em&gt; in &lt;strong&gt;4 lines&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. How It Works (Line By Line)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Line 1:&lt;/strong&gt; &lt;code&gt;import requests&lt;/code&gt; — Loads the requests library (you may need to install it first with &lt;code&gt;pip install requests&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Line 3:&lt;/strong&gt; &lt;code&gt;requests.get(url)&lt;/code&gt; — Sends an HTTP GET request to the URL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Line 4:&lt;/strong&gt; &lt;code&gt;.json()&lt;/code&gt; — Converts the response to a Python dictionary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Line 6:&lt;/strong&gt; &lt;code&gt;data["name"]&lt;/code&gt; — Accesses a specific field.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  6. HTTP Status Codes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The server always tells you what happened:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;OK- everything worked&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;404&lt;/td&gt;
&lt;td&gt;Not Found- The URL doesn't exist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;403&lt;/td&gt;
&lt;td&gt;Forbidden- you don’t have access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;Server error- the server broke&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Always check the status code:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error: {response.status_code}&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Real Example (Weather API)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;requests&lt;/span&gt;

&lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.open-meteo.com/v1/forecast&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;latitude&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;24.86&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;longitude&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;67.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;current_weather&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;True&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Temperature: {data['current_weather']['temperature']}°C&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;Temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;32.4&lt;/span&gt;&lt;span class="err"&gt;°&lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Common Mistakes Beginners Make
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Mistake 1: Not installing requests&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;requests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Mistake 2: Forgetting .json()&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
response is not the data — it's the response object. You need .json() to get the actual content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 3: Not handling errors&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Networks fail. URLs break. Always check status_code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistake 4: Hardcoding API keys&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If an API needs a key, store it in an environment variable, not in your code.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. What I learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;APIs let your code talk to the internet&lt;/li&gt;
&lt;li&gt;requests.get() sends a request&lt;/li&gt;
&lt;li&gt;.json() turns the response into a Python dictionary&lt;/li&gt;
&lt;li&gt;Status codes tell you what happened&lt;/li&gt;
&lt;li&gt;Always handle errors — networks are not reliable&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  10. Conclusion
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"APIs felt like magic when I first used one. Now they're just... tools. Small pieces of code that fetch data and give me back a dictionary. Once you build your first API call, you'll want to build twenty more.”&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>api</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
