<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Nicholus Gathirwa</title>
    <description>The latest articles on Forem by Nicholus Gathirwa (@gg001).</description>
    <link>https://forem.com/gg001</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3410090%2Ffab4403e-e6fe-486c-b188-3a6b61f76194.jpg</url>
      <title>Forem: Nicholus Gathirwa</title>
      <link>https://forem.com/gg001</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/gg001"/>
    <language>en</language>
    <item>
      <title>Parametric vs Non-Parametric Tests: A Beginner's Guide</title>
      <dc:creator>Nicholus Gathirwa</dc:creator>
      <pubDate>Sun, 09 Nov 2025 10:37:56 +0000</pubDate>
      <link>https://forem.com/gg001/parametric-vs-non-parametric-tests-a-beginners-guide-42la</link>
      <guid>https://forem.com/gg001/parametric-vs-non-parametric-tests-a-beginners-guide-42la</guid>
      <description>&lt;h2&gt;
  
  
  The Big Picture: What Are We Even Testing?
&lt;/h2&gt;

&lt;p&gt;When you're analyzing data and want to test hypotheses, you need to choose the right statistical test. But here's the thing: not all tests are created equal, and not all data fits the same mold.&lt;/p&gt;

&lt;p&gt;This is where the distinction between parametric and non-parametric tests becomes crucial. Think of it as choosing between two different toolkits ie one requires your data to meet certain conditions, the other is more flexible.&lt;/p&gt;

&lt;p&gt;Keep in mind these central questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"Does my data follow a specific distribution?"&lt;/strong&gt; ie This determines which approach you can use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"What assumptions am I willing to make about my data?"&lt;/strong&gt; ie This is the heart of the parametric vs non-parametric choice.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Okay we'll go through parametric tests, then non-parametric then we'll compare the two. We'll also go through when to use which which also includes common misconceptions, real-world application tips and finally wrap things up. Here we go!!!&lt;/p&gt;

&lt;h2&gt;
  
  
  Parametric Tests: The Assumption-Heavy Powerhouses
&lt;/h2&gt;

&lt;p&gt;Parametric tests are the "traditional" statistical tests you'll encounter first in most statistics courses. They're called "parametric" because they make assumptions about the &lt;strong&gt;parameters&lt;/strong&gt; of the population distribution.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Makes a Test Parametric?
&lt;/h3&gt;

&lt;p&gt;Parametric tests assume your data follows a specific probability distribution—usually the &lt;strong&gt;normal distribution&lt;/strong&gt; (bell curve). They also make assumptions about population parameters like mean and variance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Assumptions
&lt;/h3&gt;

&lt;p&gt;Parametric tests typically require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Normality&lt;/strong&gt;: Data follows a normal distribution (or approximately normal)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Homogeneity of variance&lt;/strong&gt;: Groups being compared have similar variances&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Independence&lt;/strong&gt;: Observations are independent of each other&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interval or ratio data&lt;/strong&gt;: Data measured on continuous scales&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Common Parametric Tests
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;T-test&lt;/strong&gt;: Compares means between two groups&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ANOVA (Analysis of Variance)&lt;/strong&gt;: Compares means across three or more groups&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pearson correlation&lt;/strong&gt;: Measures linear relationship between two continuous variables&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linear regression&lt;/strong&gt;: Models relationships between variables&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Strengths of Parametric Tests
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More powerful&lt;/strong&gt;: When assumptions are met, they're more likely to detect real effects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More precise&lt;/strong&gt;: Provide narrower confidence intervals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Well-established&lt;/strong&gt;: Widely understood and accepted&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use all information&lt;/strong&gt;: Make full use of the actual data values&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Limitations of Parametric Tests
&lt;/h3&gt;

&lt;p&gt;When assumptions are violated, parametric tests can give one &lt;strong&gt;misleading results&lt;/strong&gt;. If one's data isn't normally distributed or has outliers, these tests might tell one there's no effect when there really is one (or vice versa).&lt;/p&gt;

&lt;h2&gt;
  
  
  Non-Parametric Tests: The Distribution-Free Alternatives
&lt;/h2&gt;

&lt;p&gt;Non-parametric tests are sometimes called "distribution-free" tests because they don't assume your data follows any particular distribution. They're the flexible, robust alternatives.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Makes a Test Non-Parametric?
&lt;/h3&gt;

&lt;p&gt;Non-parametric tests make &lt;strong&gt;fewer and weaker assumptions&lt;/strong&gt; about the data. Instead of working with actual values, they often work with &lt;strong&gt;ranks&lt;/strong&gt; or &lt;strong&gt;signs&lt;/strong&gt; of the data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Characteristics
&lt;/h3&gt;

&lt;p&gt;Non-parametric tests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No distribution assumptions&lt;/strong&gt;: Don't require normal distribution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robust to outliers&lt;/strong&gt;: Extreme values have less influence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Work with ranks&lt;/strong&gt;: Often convert data to ranks, losing some information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible data types&lt;/strong&gt;: Can handle ordinal, interval, and ratio data&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Common Non-Parametric Tests (and Their Parametric Equivalents)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mann-Whitney U test&lt;/strong&gt; (Wilcoxon rank-sum test): Non-parametric version of independent t-test&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wilcoxon signed-rank test&lt;/strong&gt;: Non-parametric version of paired t-test&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kruskal-Wallis test&lt;/strong&gt;: Non-parametric version of one-way ANOVA&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spearman's rank correlation&lt;/strong&gt;: Non-parametric version of Pearson correlation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Friedman test&lt;/strong&gt;: Non-parametric version of repeated measures ANOVA&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chi-square test&lt;/strong&gt;: Tests relationships between categorical variables&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Strengths of Non-Parametric Tests
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fewer assumptions&lt;/strong&gt;: Work even when data isn't normally distributed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robust&lt;/strong&gt;: Less affected by outliers and skewed distributions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Versatile&lt;/strong&gt;: Can handle ordinal data and small sample sizes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safer choice&lt;/strong&gt;: When in doubt, they provide valid results&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Limitations of Non-Parametric Tests
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Less powerful&lt;/strong&gt;: When parametric assumptions ARE met, non-parametric tests are less likely to detect real effects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Less precise&lt;/strong&gt;: Generally produce wider confidence intervals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Information loss&lt;/strong&gt;: Converting to ranks throws away some information about actual values&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interpretation&lt;/strong&gt;: Sometimes harder to interpret (medians vs means)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Let's compare the two, parametic and non-parametric tests.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Assumptions&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parametric&lt;/strong&gt;: Assumes specific distribution (usually normal), equal variances&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-parametric&lt;/strong&gt;: Minimal assumptions about distribution&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Data Requirements&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parametric&lt;/strong&gt;: Continuous data (interval or ratio scales)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-parametric&lt;/strong&gt;: Ordinal, interval, or ratio data&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;What They Analyze&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parametric&lt;/strong&gt;: Work with actual data values (means, variances)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-parametric&lt;/strong&gt;: Often work with ranks or medians&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Sample Size&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parametric&lt;/strong&gt;: Generally need larger samples for normality assumption (though Central Limit Theorem helps)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-parametric&lt;/strong&gt;: Better for small sample sizes&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Power&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parametric&lt;/strong&gt;: More powerful when assumptions are met (95-100% efficiency)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-parametric&lt;/strong&gt;: Less powerful but more robust (typically 95% efficiency of parametric equivalent)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. &lt;strong&gt;Outliers&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parametric&lt;/strong&gt;: Sensitive to outliers and extreme values&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-parametric&lt;/strong&gt;: Resistant to outliers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The "When in Doubt" Rule
&lt;/h3&gt;

&lt;p&gt;If you're unsure whether parametric assumptions are met, here's a practical approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check your assumptions&lt;/strong&gt; (normality tests, plots, variance tests)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If in doubt, use non-parametric&lt;/strong&gt; ie you'll lose a bit of power but won't get invalid results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If sample size is large&lt;/strong&gt; (n&amp;gt;100), parametric tests are often robust even with mild violations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consider running both&lt;/strong&gt; and see if conclusions differ (if they agree, you're on solid ground)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Common Misconceptions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "Non-parametric tests are always safer"
&lt;/h3&gt;

&lt;p&gt;Not quite. If your data meets parametric assumptions, parametric tests are better—they're more powerful and precise.&lt;/p&gt;

&lt;h3&gt;
  
  
  "You should always check normality before choosing a test"
&lt;/h3&gt;

&lt;p&gt;Yes and no. With large samples (n&amp;gt;100), parametric tests are robust to normality violations due to the Central Limit Theorem. Focus more on outliers and extreme skewness.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Non-parametric tests don't have assumptions"
&lt;/h3&gt;

&lt;p&gt;Wrong! They have fewer assumptions, but they still assume independence and, for some tests, similar distributions across groups.&lt;/p&gt;

&lt;h3&gt;
  
  
  "Parametric tests require perfect normality"
&lt;/h3&gt;

&lt;p&gt;False. They require &lt;em&gt;approximate&lt;/em&gt; normality, and they're quite forgiving, especially with larger samples.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Application Tips
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Check Your Data First&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Always visualize your data with histograms, boxplots, and Q-Q plots before choosing a test.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Sample Size Matters&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Small samples (n&amp;lt;30): Lean toward non-parametric unless you're confident about normality&lt;/li&gt;
&lt;li&gt;Large samples (n&amp;gt;100): Parametric tests are usually fine even with mild violations&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Subject Matter Context&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sometimes the nature of your variable tells you what to expect. Height, weight, and many biological measurements tend toward normality. Reaction times, income, and count data often don't.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Report What You Did&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Always report which test you used and why. If you chose non-parametric due to assumption violations, mention it.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Transformation Option&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Sometimes you can transform skewed data (log transformation, square root) to make it more normal, allowing use of parametric tests. But be careful about interpretation!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;The choice between parametric and non-parametric tests isn't about one being "better" than the other—it's about matching the right tool to your data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Parametric tests&lt;/strong&gt; are like precision instruments: powerful and efficient when conditions are right, but give misleading results when assumptions are violated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non-parametric tests&lt;/strong&gt; are like all-weather tools: they work in almost any condition, but they're slightly less efficient when conditions are ideal.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hope you've understood dear reader and leave a comment if you have any concern&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>Bayesians vs Frequentists: A Beginner's Guide</title>
      <dc:creator>Nicholus Gathirwa</dc:creator>
      <pubDate>Fri, 07 Nov 2025 23:36:45 +0000</pubDate>
      <link>https://forem.com/gg001/bayesians-vs-frequentists-a-beginners-guide-593c</link>
      <guid>https://forem.com/gg001/bayesians-vs-frequentists-a-beginners-guide-593c</guid>
      <description>&lt;p&gt;At their core, both approaches want to help us understand uncertainty and make decisions based on data. But they go about it in fundamentally different ways.&lt;/p&gt;

&lt;p&gt;Both want to answer the question,  &lt;strong&gt;"What does probability mean, and how do we use data to make inferences?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Keep in mind these central questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"What does probability represent?"&lt;/strong&gt;  Bayesians and Frequentists answer this differently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"How do we update our knowledge with new data?"&lt;/strong&gt; This is where the approaches diverge most clearly.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Frequentist Statistics: The Long-Run Frequency Approach
&lt;/h2&gt;

&lt;p&gt;Frequentist statistics is the traditional approach you'll encounter in most introductory statistics courses.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Probability Means to Frequentists
&lt;/h3&gt;

&lt;p&gt;To a Frequentist, probability is about &lt;strong&gt;long-run frequency&lt;/strong&gt;. If you flip a coin infinitely many times, the proportion of heads approaches 0.5. That's probability ie what happens in the long run if you repeat an experiment over and over.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Principle
&lt;/h3&gt;

&lt;p&gt;Frequentists treat &lt;strong&gt;parameters as fixed but unknown&lt;/strong&gt;. For example, a population mean exists as one true value. We just don't know it. The job is to use sample data to estimate it.&lt;/p&gt;

&lt;h3&gt;
  
  
  How They Work with Data
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No prior beliefs&lt;/strong&gt;: Frequentists don't incorporate prior knowledge or beliefs into their analysis. The data speaks for itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;P-values and confidence intervals&lt;/strong&gt;: These are core in Frequentist inference. A 95% confidence interval means "if we repeated this sampling process infinitely, 95% of such intervals would contain the true parameter."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hypothesis testing&lt;/strong&gt;: You set up a null hypothesis and calculate the probability of seeing your data (or more extreme data) if the null is true. That's your p-value.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What Frequentists CANNOT Say
&lt;/h3&gt;

&lt;p&gt;Here's the tricky part: Frequentists &lt;strong&gt;cannot&lt;/strong&gt; make probability statements about parameters. They can't say "there's a 95% probability the true mean is between 10 and 20." Why? Because to them, the parameter is fixed ie it either is or isn't in that interval. The randomness is in the sampling process, not the parameter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bayesian Statistics: The Belief Update Approach
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What Probability Means to Bayesians
&lt;/h3&gt;

&lt;p&gt;To a Bayesian, probability represents &lt;strong&gt;degree of belief&lt;/strong&gt; or uncertainty. It's subjective and personal. Probability quantifies what we believe about something, given all available information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Principle
&lt;/h3&gt;

&lt;p&gt;Bayesians treat &lt;strong&gt;parameters as random variables&lt;/strong&gt; with probability distributions. There's no single "true" value we're trying to estimate instead, we describe our uncertainty about the parameter with a distribution.&lt;/p&gt;

&lt;h3&gt;
  
  
  How bayesians Work with Data
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prior beliefs&lt;/strong&gt;: Bayesians start with a &lt;strong&gt;prior distribution&lt;/strong&gt; that represents what they believe before seeing the data. This could be based on previous studies, expert opinion, or even complete ignorance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Likelihood&lt;/strong&gt;: This is the probability of observing the data given different parameter values (both approaches use this).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Posterior distribution&lt;/strong&gt;: Using Bayes' Theorem, they combine the prior and likelihood to get a &lt;strong&gt;posterior distribution&lt;/strong&gt;—what they believe after seeing the data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fundamental equation:&lt;br&gt;
&lt;strong&gt;Posterior is directly proportional to  Prior x Likelihood&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What Bayesians CAN Say
&lt;/h3&gt;

&lt;p&gt;Bayesians &lt;strong&gt;can&lt;/strong&gt; make probability statements about parameters! They can say "there's a 95% probability the true mean is between 10 and 20" because they treat the parameter as having a probability distribution.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;refer back to what frequentists cannot say&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Key Differences at a Glance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Interpretation of Probability&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frequentist&lt;/strong&gt;: Long-run frequency (objective)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bayesian&lt;/strong&gt;: Degree of belief (subjective)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Treatment of Parameters&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frequentist&lt;/strong&gt;: Fixed but unknown values&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bayesian&lt;/strong&gt;: Random variables with distributions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Use of Prior Information&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frequentist&lt;/strong&gt;: Not incorporated (only data matters)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bayesian&lt;/strong&gt;: Explicitly incorporated through prior distributions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Type of Results&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frequentist&lt;/strong&gt;: Point estimates, confidence intervals, p-values&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bayesian&lt;/strong&gt;: Probability distributions (posterior distributions), credible intervals&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. &lt;strong&gt;Interpretation of Intervals&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frequentist&lt;/strong&gt;: "95% of such intervals would contain the true parameter if we repeated sampling infinitely"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bayesian&lt;/strong&gt;: "There's a 95% probability the parameter lies in this interval"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. &lt;strong&gt;Flexibility&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frequentist&lt;/strong&gt;: Simpler for standard problems, well-established methods&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bayesian&lt;/strong&gt;: More flexible for complex models, but computationally intensive&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Practical Example: Coin Flipping
&lt;/h2&gt;

&lt;p&gt;Imagine you flip a coin 10 times and get 7 heads. You want to know if the coin is fair.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frequentist Approach&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Null hypothesis: The coin is fair (p = 0.5)&lt;/li&gt;
&lt;li&gt;Calculate: What's the probability of getting 7 or more heads if the coin is actually fair?&lt;/li&gt;
&lt;li&gt;P-value = 0.34 (not unusual)&lt;/li&gt;
&lt;li&gt;Conclusion: "We fail to reject the null hypothesis. The data is consistent with a fair coin."&lt;/li&gt;
&lt;li&gt;Note: They &lt;strong&gt;cannot&lt;/strong&gt; say "there's a 34% chance the coin is fair"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bayesian Approach&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prior: Maybe you believe the coin is probably fair, but you're open to it being biased&lt;/li&gt;
&lt;li&gt;Likelihood: The probability of 7 heads in 10 flips for different values of p&lt;/li&gt;
&lt;li&gt;Posterior: Combine prior and likelihood using Bayes' Theorem&lt;/li&gt;
&lt;li&gt;Conclusion: "Given the data and my prior beliefs, I now believe there's an 85% probability that p is between 0.45 and 0.85"&lt;/li&gt;
&lt;li&gt;They &lt;strong&gt;can&lt;/strong&gt; make probability statements about the parameter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note that most of "basic" statistics we do, we use frequentists approaches. By basic I mean this is the one mostly used in introductory statistics courses and right to do so as this is the traditional approach and has been the dominant paradigm.&lt;/p&gt;

&lt;h2&gt;
  
  
  Strengths and weaknesses.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Frequentist Strengths
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Objective doesn't depend on subjective priors&lt;/li&gt;
&lt;li&gt;Well-established with clear procedures&lt;/li&gt;
&lt;li&gt;Computationally simpler for many problems&lt;/li&gt;
&lt;li&gt;Widely accepted in scientific publications&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Frequentist weaknesses
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Confidence intervals are often misinterpreted as Bayesian credible intervals&lt;/li&gt;
&lt;li&gt;P-values are frequently misused and misunderstood&lt;/li&gt;
&lt;li&gt;Ignores prior knowledge that might be valuable&lt;/li&gt;
&lt;li&gt;Long-run frequency interpretation can be unintuitive&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bayesian Strengths
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Intuitive interpretation (directly answers "what do we believe?")&lt;/li&gt;
&lt;li&gt;Naturally incorporates prior information&lt;/li&gt;
&lt;li&gt;Excellent for complex models and hierarchical structures&lt;/li&gt;
&lt;li&gt;Provides full probability distributions, not just point estimates&lt;/li&gt;
&lt;li&gt;Updates naturally as new data arrives&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Bayesian weaknesses
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Results depend on choice of prior (though this can also be a strength)&lt;/li&gt;
&lt;li&gt;Computationally intensive (requires specialized software and techniques)&lt;/li&gt;
&lt;li&gt;Less standardized ie many choices to make&lt;/li&gt;
&lt;li&gt;"Subjective" nature makes some scientists uncomfortable&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to Use Which?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use Frequentist methods when&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want objective, widely-accepted standard procedures&lt;/li&gt;
&lt;li&gt;You have no reliable prior information&lt;/li&gt;
&lt;li&gt;You're working with simple, standard statistical tests&lt;/li&gt;
&lt;li&gt;You need computational efficiency&lt;/li&gt;
&lt;li&gt;You're publishing in fields that require Frequentist approaches&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Bayesian methods when&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have valuable prior information to incorporate&lt;/li&gt;
&lt;li&gt;You want intuitive probability statements about parameters&lt;/li&gt;
&lt;li&gt;You're working with complex hierarchical models&lt;/li&gt;
&lt;li&gt;You want to update beliefs as new data arrives&lt;/li&gt;
&lt;li&gt;You need to make decisions under uncertainty&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;The difference between Bayesian and Frequentist statistics boils down to fundamentally different answers to "What is probability?"&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frequentists&lt;/strong&gt; say: "Probability is long-run frequency. Parameters are fixed. Data is random."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bayesians&lt;/strong&gt; say: "Probability is degree of belief. Parameters are uncertain. Everything has a distribution."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither is inherently "better" as they are different tools for different situations&lt;/p&gt;

&lt;p&gt;The important thing is understanding what each approach assumes and what it can (and cannot) tell you. That way, you can interpret results correctly and choose the right tool for your problem.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Hope you've understood dear reader and leave a comment if you have any concern&lt;/em&gt;.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>datascience</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Correlation vs Regression Coefficients: A Beginner's Guide.</title>
      <dc:creator>Nicholus Gathirwa</dc:creator>
      <pubDate>Thu, 06 Nov 2025 15:59:51 +0000</pubDate>
      <link>https://forem.com/gg001/correlation-vs-regression-coefficients-a-beginners-guide-1ik4</link>
      <guid>https://forem.com/gg001/correlation-vs-regression-coefficients-a-beginners-guide-1ik4</guid>
      <description>&lt;h2&gt;
  
  
  The Big Picture: What Are We Even Measuring?
&lt;/h2&gt;

&lt;p&gt;Just keep in mind the following questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;"Are these two things related?"&lt;/strong&gt; – This is where correlation comes in.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"If I change one thing, how much does the other thing change?"&lt;/strong&gt; – This is where regression comes in.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Correlation Coefficient: The Relationship Detective
&lt;/h2&gt;

&lt;p&gt;The correlation coefficient (usually represented as 'r') tells us whether two variables move together and how strongly they're associated.&lt;/p&gt;

&lt;h3&gt;
  
  
  What It Measures
&lt;/h3&gt;

&lt;p&gt;Correlation measures the &lt;strong&gt;strength and direction&lt;/strong&gt; of a linear relationship between two variables. It answers: "Do these variables tend to increase or decrease together?"&lt;/p&gt;

&lt;h3&gt;
  
  
  The Scale
&lt;/h3&gt;

&lt;p&gt;The value always falls between -1 and +1:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;+1&lt;/strong&gt;: Perfect positive correlation (as one goes up, the other goes up perfectly)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0&lt;/strong&gt;: No linear relationship (they're doing their own thing)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;-1&lt;/strong&gt;: Perfect negative correlation (as one goes up, the other goes down perfectly)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What correlation does not tell.
&lt;/h3&gt;

&lt;p&gt;And here's the crucial part: correlation doesn't tell you &lt;strong&gt;how much&lt;/strong&gt; one variable changes when the other changes. It just says they move together. &lt;/p&gt;

&lt;p&gt;It's not about the units or the actual change it's about the pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Regression Coefficient: The Prediction Machine
&lt;/h2&gt;

&lt;p&gt;Regression coefficients (often represented as 'b' ie beta) is a different thing entirely. Here we're talking about prediction and quantifying change.&lt;/p&gt;

&lt;h3&gt;
  
  
  What It Measures
&lt;/h3&gt;

&lt;p&gt;A regression coefficient tells you &lt;strong&gt;how much&lt;/strong&gt; the dependent variable (the outcome) changes when the independent variable (the predictor) changes by one unit, while holding everything else constant.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Scale
&lt;/h3&gt;

&lt;p&gt;Regression coefficients are &lt;strong&gt;NOT&lt;/strong&gt; standardized. They're in the units of your variables! &lt;/p&gt;

&lt;p&gt;This means they can be any value: 0.5, 50, -200, whatever makes sense for your data.&lt;/p&gt;

&lt;h3&gt;
  
  
  What It DOES Tell You
&lt;/h3&gt;

&lt;p&gt;Regression coefficients give you a formula to predict outcomes. If you have the equation:&lt;/p&gt;

&lt;p&gt;y = mx + c&lt;/p&gt;

&lt;p&gt;You can plug in any x and estimate y.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Key Differences at a Glance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Purpose&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Correlation&lt;/strong&gt;: Describes the strength of association&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regression&lt;/strong&gt;: Predicts and quantifies change&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Units&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Correlation&lt;/strong&gt;: No units! It's standardized (always between -1 and +1)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regression&lt;/strong&gt;: Has units! Depends on what you're measuring&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Symmetry&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Correlation&lt;/strong&gt;: Symmetric (correlation between X and Y equals correlation between Y and X)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regression&lt;/strong&gt;: Asymmetric (regressing Y on X is different from regressing X on Y)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;What They Tell You&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Correlation&lt;/strong&gt;: "These variables move together with this strength"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regression&lt;/strong&gt;: "When X increases by 1, Y changes by this amount"&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to Use Which?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use correlation when&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want to know if two things are related&lt;/li&gt;
&lt;li&gt;You're exploring data and looking for patterns&lt;/li&gt;
&lt;li&gt;You want to compare relationship strengths across different variable pairs&lt;/li&gt;
&lt;li&gt;You don't have a clear cause-effect hypothesis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use regression when&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want to predict outcomes&lt;/li&gt;
&lt;li&gt;You need to know the magnitude of change&lt;/li&gt;
&lt;li&gt;You're testing specific hypotheses about how variables affect each other&lt;/li&gt;
&lt;li&gt;You want to control for multiple variables at once&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Connection Between Them
&lt;/h2&gt;

&lt;p&gt;Note that in simple linear regression (with just one predictor), correlation and regression are mathematically related! The standardized regression coefficient (called beta in some contexts) actually equals the correlation coefficient. But in their raw forms, they're giving you different information.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hope you've understood dear reader and leave a comment if you have any concern&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>datascience</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Understanding Skewness and Kurtosis in Statistics</title>
      <dc:creator>Nicholus Gathirwa</dc:creator>
      <pubDate>Sat, 27 Sep 2025 09:17:37 +0000</pubDate>
      <link>https://forem.com/gg001/understanding-skewness-and-kurtosis-in-statistics-4php</link>
      <guid>https://forem.com/gg001/understanding-skewness-and-kurtosis-in-statistics-4php</guid>
      <description>&lt;h2&gt;
  
  
  Understanding Skewness and Kurtosis in Statistics
&lt;/h2&gt;

&lt;p&gt;When analyzing data distributions, two crucial statistical measures help us understand the shape and characteristics of our data: &lt;strong&gt;skewness&lt;/strong&gt; and &lt;strong&gt;kurtosis&lt;/strong&gt;. These measures go beyond simple central tendency (mean, median, mode) and dispersion (variance, standard deviation) to provide deeper insights into how our data is distributed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Skewness?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Skewness&lt;/strong&gt; measures the asymmetry of a probability distribution around its mean. It tells us whether the data is symmetrically distributed or if it has a longer tail on one side.&lt;/p&gt;

&lt;h3&gt;
  
  
  Types of Skewness
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5zqsnt52jegmijaiv0pq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5zqsnt52jegmijaiv0pq.jpg" alt="Image showing the 3 types of skewness" width="600" height="231"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;Symmetric Distribution (Zero Skewness)&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Skewness ≈ 0&lt;/li&gt;
&lt;li&gt;The distribution is perfectly balanced around the mean&lt;/li&gt;
&lt;li&gt;Mean = Median = Mode&lt;/li&gt;
&lt;li&gt;Both tails are equal in length&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. &lt;strong&gt;Right Skewed (Positive Skewness)&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Skewness &amp;gt; 0&lt;/li&gt;
&lt;li&gt;The right tail is longer than the left tail&lt;/li&gt;
&lt;li&gt;Mean &amp;gt; Median &amp;gt; Mode&lt;/li&gt;
&lt;li&gt;Most data points are concentrated on the left side&lt;/li&gt;
&lt;li&gt;Also called "positively skewed"&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. &lt;strong&gt;Left Skewed (Negative Skewness)&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Skewness &amp;lt; 0&lt;/li&gt;
&lt;li&gt;The left tail is longer than the right tail&lt;/li&gt;
&lt;li&gt;Mode &amp;gt; Median &amp;gt; Mean&lt;/li&gt;
&lt;li&gt;Most data points are concentrated on the right side&lt;/li&gt;
&lt;li&gt;Also called "negatively skewed"&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Calculating Skewness
&lt;/h3&gt;

&lt;p&gt;The formula for sample skewness is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Skewness = (n / ((n-1)(n-2))) × Σ((xi - x̄) / s)³
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;n = sample size&lt;/li&gt;
&lt;li&gt;xi = each data point&lt;/li&gt;
&lt;li&gt;x̄ = sample mean&lt;/li&gt;
&lt;li&gt;s = sample standard deviation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Interpreting Skewness Values
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;-0.5 to 0.5&lt;/strong&gt;: Approximately symmetric&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;-1 to -0.5&lt;/strong&gt; or &lt;strong&gt;0.5 to 1&lt;/strong&gt;: Moderately skewed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&amp;lt; -1&lt;/strong&gt; or &lt;strong&gt;&amp;gt; 1&lt;/strong&gt;: Highly skewed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is Kurtosis?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Kurtosis&lt;/strong&gt; measures the "tailedness" of a distribution - how heavy or light the tails are compared to a normal distribution. It also indicates how peaked or flat the distribution is around the mean.&lt;/p&gt;

&lt;h3&gt;
  
  
  Types of Kurtosis
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcutelpq878s6uj8n79by.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcutelpq878s6uj8n79by.webp" alt="Image showing the 3 types of kurtosis" width="494" height="188"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  1. &lt;strong&gt;Mesokurtic (Normal Kurtosis)&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Kurtosis = 3 (or excess kurtosis = 0)&lt;/li&gt;
&lt;li&gt;Similar to a normal distribution&lt;/li&gt;
&lt;li&gt;Moderate tail thickness and peak height&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  2. &lt;strong&gt;Leptokurtic (High Kurtosis)&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Kurtosis &amp;gt; 3 (or excess kurtosis &amp;gt; 0)&lt;/li&gt;
&lt;li&gt;Heavy tails and sharp peak&lt;/li&gt;
&lt;li&gt;More data concentrated around the mean&lt;/li&gt;
&lt;li&gt;Higher probability of extreme values&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  3. &lt;strong&gt;Platykurtic (Low Kurtosis)&lt;/strong&gt;
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Kurtosis &amp;lt; 3 (or excess kurtosis &amp;lt; 0)&lt;/li&gt;
&lt;li&gt;Light tails and flat peak&lt;/li&gt;
&lt;li&gt;Data is more spread out&lt;/li&gt;
&lt;li&gt;Lower probability of extreme values&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Calculating Kurtosis
&lt;/h3&gt;

&lt;p&gt;The formula for sample kurtosis is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Kurtosis = (n(n+1) / ((n-1)(n-2)(n-3))) × 
Σ((xi - x̄) / s)⁴ - (3(n-1)² / ((n-2)(n-3)))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This formula gives &lt;strong&gt;excess kurtosis&lt;/strong&gt; (kurtosis - 3).&lt;/p&gt;

&lt;h3&gt;
  
  
  Interpreting Kurtosis Values
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kurtosis = 0&lt;/strong&gt;: Normal distribution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kurtosis &amp;gt; 0&lt;/strong&gt;: Heavier tails than normal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kurtosis &amp;lt; 0&lt;/strong&gt;: Lighter tails than normal&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Skewness and Kurtosis Matter
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Data Quality Assessment&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Understanding these measures helps identify outliers and data quality issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Statistical Test Selection&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Many statistical tests assume normality. Skewness and kurtosis help determine if transformations are needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Risk Assessment&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In finance, high kurtosis indicates higher probability of extreme events (fat tails).&lt;/p&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Model Selection&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Different distributions may be more appropriate based on skewness and kurtosis values.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Income Distribution (Right Skewed)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Most people earn moderate incomes&lt;/li&gt;
&lt;li&gt;Few people earn extremely high incomes&lt;/li&gt;
&lt;li&gt;Results in a long right tail&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Test Scores (Left Skewed)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Most students score well on an easy test&lt;/li&gt;
&lt;li&gt;Few students score poorly&lt;/li&gt;
&lt;li&gt;Results in a long left tail&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stock Returns (High Kurtosis)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Most days show small price changes&lt;/li&gt;
&lt;li&gt;Occasional days show extreme changes (crashes or rallies)&lt;/li&gt;
&lt;li&gt;Results in heavy tails&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Computing Skewness and Kurtosis
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Python Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;scipy&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;stats&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;

&lt;span class="c1"&gt;# Generate sample data
&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;normal_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;normal&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;skewed_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exponential&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;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Calculate skewness and kurtosis
&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;Normal Data:&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;Skewness: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;skew&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;normal_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;f&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="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;Kurtosis: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;kurtosis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;normal_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;f&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="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;Skewed Data:&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;Skewness: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;skew&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skewed_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;f&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="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;Kurtosis: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;kurtosis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skewed_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Common Misconceptions
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Skewness doesn't always indicate outliers&lt;/strong&gt; - it measures asymmetry, not necessarily extreme values&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High kurtosis doesn't mean bimodality&lt;/strong&gt; - it refers to tail behavior, not multiple peaks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero skewness doesn't guarantee normality&lt;/strong&gt; - a distribution can be symmetric but not normal&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Equip yourself, find out how to address different types of skewness (overview).
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For Right Skewed Data:
&lt;/h3&gt;

&lt;p&gt;You can use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Log transformation&lt;/strong&gt;: log(x)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Square root transformation&lt;/strong&gt;: √x&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Box-Cox transformation&lt;/strong&gt;: (x^λ - 1) / λ&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For Left Skewed Data:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reflection then transformation&lt;/strong&gt;: Apply right-skew transformations to (max(x) + 1 - x)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  To take home:
&lt;/h2&gt;

&lt;p&gt;Skewness and kurtosis provide valuable insights that complement basic descriptive statistics and help in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choosing appropriate statistical methods&lt;/li&gt;
&lt;li&gt;Identifying data anomalies&lt;/li&gt;
&lt;li&gt;Understanding risk profiles&lt;/li&gt;
&lt;li&gt;Making informed decisions about data transformations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When combined with visual tools like histograms and Q-Q plots, these measures form a comprehensive toolkit for distribution analysis.&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>beginners</category>
      <category>datascience</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>List Comprehension vs Dictionary Comprehension in Python and how to come up with dictionary comprehensions from 2 lists.</title>
      <dc:creator>Nicholus Gathirwa</dc:creator>
      <pubDate>Sat, 27 Sep 2025 07:55:54 +0000</pubDate>
      <link>https://forem.com/gg001/list-comprehension-vs-dictionary-comprehension-in-python-and-how-to-come-up-with-dictionary-4hef</link>
      <guid>https://forem.com/gg001/list-comprehension-vs-dictionary-comprehension-in-python-and-how-to-come-up-with-dictionary-4hef</guid>
      <description>&lt;h1&gt;
  
  
  List Comprehension vs Dictionary Comprehension in Python
&lt;/h1&gt;

&lt;p&gt;Python provides &lt;strong&gt;comprehensions&lt;/strong&gt; as a concise way to create lists, dictionaries, and even sets. Two of the most common are &lt;strong&gt;list comprehension&lt;/strong&gt; and &lt;strong&gt;dictionary comprehension&lt;/strong&gt;. Let's explore their differences and how to use them — including combining two lists into a dictionary.&lt;/p&gt;

&lt;h2&gt;
  
  
  List Comprehension
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;list comprehension&lt;/strong&gt; creates a list by iterating over an iterable and applying an expression.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Syntax:&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;expression&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;iterable&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&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;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="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;squares&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;squares&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="c1"&gt;# [1, 4, 9, 16, 25]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;squares&lt;/code&gt; is a list where each number is squared.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dictionary Comprehension
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;dictionary comprehension&lt;/strong&gt; creates a dictionary with key–value pairs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Syntax:&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="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key_expr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;value_expr&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;iterable&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;condition&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;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="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;square_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;square_dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="c1"&gt;# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, each number is used as a key, and its square is the value.&lt;/p&gt;

&lt;h2&gt;
  
  
  Combining Two Lists into a Dictionary
&lt;/h2&gt;

&lt;p&gt;Suppose you have two lists:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;c&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can combine them into a dictionary using &lt;strong&gt;dictionary comprehension&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Using &lt;code&gt;zip()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The most Pythonic way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;my_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;values&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;my_dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="c1"&gt;# {'a': 1, 'b': 2, 'c': 3}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;zip()&lt;/code&gt; pairs elements from both lists until the shortest list ends.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Using Indexing with &lt;code&gt;range()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;If both lists are the same length:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;my_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keys&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;my_dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="c1"&gt;# {'a': 1, 'b': 2, 'c': 3}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Using &lt;code&gt;enumerate()&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;By enumerating one list and indexing the other:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;my_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&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;keys&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;my_dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="c1"&gt;# {'a': 1, 'b': 2, 'c': 3}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Adding Conditions
&lt;/h3&gt;

&lt;p&gt;You can filter while combining. For example, include only values greater than &lt;code&gt;1&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;my_dict&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;keys&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;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;my_dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="c1"&gt;# {'b': 2, 'c': 3}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Basically, just keep these points in mind:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;List comprehension&lt;/strong&gt; → creates a list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dictionary comprehension&lt;/strong&gt; → creates a dictionary (key–value pairs).&lt;/li&gt;
&lt;li&gt;You can combine two lists into a dictionary using:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;zip()&lt;/code&gt; (most common)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;range()&lt;/code&gt; with indexing&lt;/li&gt;
&lt;li&gt;&lt;code&gt;enumerate()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Filtering with conditions&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;If you have any questions, please let me know in the comment section, have a good day!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Stored Procedures vs Python Functions: Surprising Similarities</title>
      <dc:creator>Nicholus Gathirwa</dc:creator>
      <pubDate>Mon, 08 Sep 2025 06:49:41 +0000</pubDate>
      <link>https://forem.com/gg001/stored-procedures-vs-python-functions-surprising-similarities-5bc3</link>
      <guid>https://forem.com/gg001/stored-procedures-vs-python-functions-surprising-similarities-5bc3</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;While SQL stored procedures and Python functions operate in different environments, they share remarkable conceptual similarities. Understanding these parallels can help developers leverage their knowledge across both domains.&lt;/p&gt;

&lt;h2&gt;
  
  
  Core Similarities
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Encapsulation and Reusability
&lt;/h3&gt;

&lt;p&gt;Both stored procedures and Python functions encapsulate logic into reusable blocks of code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQL Stored Procedure:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;CalculateBonus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;EmployeeID&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;PerformanceRating&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
    &lt;span class="k"&gt;DECLARE&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Bonus&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Bonus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;salary&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;PerformanceRating&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; 
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;employee_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;EmployeeID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Bonus&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&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;Python Function:&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;def&lt;/span&gt; &lt;span class="nf"&gt;calculate_bonus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employee_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;performance_rating&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Simulating database lookup
&lt;/span&gt;    &lt;span class="n"&gt;salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_employee_salary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employee_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;bonus&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;salary&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;performance_rating&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;bonus&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Parameter Handling
&lt;/h3&gt;

&lt;p&gt;Both support various parameter types and default values.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQL Stored Procedure:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;GetEmployees&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;DepartmentID&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;MinSalary&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;MaxResults&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;TOP&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;MaxResults&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;DepartmentID&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="n"&gt;department_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;DepartmentID&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;salary&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;MinSalary&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&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;Python Function:&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;def&lt;/span&gt; &lt;span class="nf"&gt;get_employees&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;min_salary&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_results&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SELECT * FROM employees WHERE salary &amp;gt;= %s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;min_salary&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;department_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; AND department_id = %s&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; LIMIT &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;max_results&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;execute_query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Control Flow and Logic
&lt;/h3&gt;

&lt;p&gt;Both support conditional logic, loops, and error handling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQL Stored Procedure:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;ProcessPayroll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;PayPeriod&lt;/span&gt; &lt;span class="nb"&gt;DATE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
    &lt;span class="k"&gt;DECLARE&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;EmployeeID&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Salary&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;DECLARE&lt;/span&gt; &lt;span class="n"&gt;employee_cursor&lt;/span&gt; &lt;span class="k"&gt;CURSOR&lt;/span&gt; &lt;span class="k"&gt;FOR&lt;/span&gt;
        &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;employee_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;salary&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;BEGIN&lt;/span&gt; &lt;span class="n"&gt;TRY&lt;/span&gt;
        &lt;span class="k"&gt;OPEN&lt;/span&gt; &lt;span class="n"&gt;employee_cursor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;FETCH&lt;/span&gt; &lt;span class="k"&gt;NEXT&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employee_cursor&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;EmployeeID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Salary&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="n"&gt;WHILE&lt;/span&gt; &lt;span class="o"&gt;@@&lt;/span&gt;&lt;span class="n"&gt;FETCH_STATUS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="k"&gt;BEGIN&lt;/span&gt;
            &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Salary&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
                &lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;payroll&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employee_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pay_date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;EmployeeID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Salary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;PayPeriod&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;FETCH&lt;/span&gt; &lt;span class="k"&gt;NEXT&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employee_cursor&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;EmployeeID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Salary&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;CLOSE&lt;/span&gt; &lt;span class="n"&gt;employee_cursor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;DEALLOCATE&lt;/span&gt; &lt;span class="n"&gt;employee_cursor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="n"&gt;TRY&lt;/span&gt;
    &lt;span class="k"&gt;BEGIN&lt;/span&gt; &lt;span class="n"&gt;CATCH&lt;/span&gt;
        &lt;span class="c1"&gt;-- Error handling&lt;/span&gt;
        &lt;span class="k"&gt;ROLLBACK&lt;/span&gt; &lt;span class="n"&gt;TRANSACTION&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;THROW&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;END&lt;/span&gt; &lt;span class="n"&gt;CATCH&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&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;Python Function:&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;def&lt;/span&gt; &lt;span class="nf"&gt;process_payroll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pay_period&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;active_employees&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_active_employees&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;employee&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;active_employees&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;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;salary&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;insert_payroll_record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;employee_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;employee&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;salary&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                    &lt;span class="n"&gt;pay_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;pay_period&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;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Error handling
&lt;/span&gt;        &lt;span class="nf"&gt;rollback_transaction&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Return Values and Output
&lt;/h3&gt;

&lt;p&gt;Both can return single values, multiple values, or complex data structures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SQL Stored Procedure:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;GetDepartmentStats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;DepartmentID&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;EmployeeCount&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;AvgSalary&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;OUTPUT&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; 
        &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;EmployeeCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;AvgSalary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;department_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;DepartmentID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;-- Also return result set&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;salary&lt;/span&gt; 
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; 
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;department_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;DepartmentID&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&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;Python Function:&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;def&lt;/span&gt; &lt;span class="nf"&gt;get_department_stats&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_employees_by_department&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;employee_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;avg_salary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;salary&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;emp&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employees&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;employees&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="c1"&gt;# Return tuple (similar to OUTPUT parameters)
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;employee_count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;avg_salary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Key Parallels
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Performance Optimization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stored Procedures&lt;/strong&gt;: Precompiled and cached by database engine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python Functions&lt;/strong&gt;: Can be optimized with caching decorators, compiled with tools like Cython&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Modularity and Organization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stored Procedures&lt;/strong&gt;: Group related database operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python Functions&lt;/strong&gt;: Organize code into logical, testable units&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Security and Access Control
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stored Procedures&lt;/strong&gt;: Control data access through procedure permissions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python Functions&lt;/strong&gt;: Implement validation and authorization logic&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Testing and Debugging
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Both&lt;/strong&gt;: Can be tested independently with mock data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Both&lt;/strong&gt;: Support debugging with breakpoints and logging&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Practical Example: User Authentication
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SQL Stored Procedure:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;AuthenticateUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Username&lt;/span&gt; &lt;span class="n"&gt;NVARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Password&lt;/span&gt; &lt;span class="n"&gt;NVARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;IsValid&lt;/span&gt; &lt;span class="nb"&gt;BIT&lt;/span&gt; &lt;span class="k"&gt;OUTPUT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;UserRole&lt;/span&gt; &lt;span class="n"&gt;NVARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;OUTPUT&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
    &lt;span class="k"&gt;DECLARE&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;StoredHash&lt;/span&gt; &lt;span class="n"&gt;NVARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;StoredHash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;password_hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;UserRole&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;role&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Username&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;StoredHash&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;StoredHash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HASHBYTES&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'SHA2_256'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;Password&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;'salt'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;IsValid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;ELSE&lt;/span&gt;
        &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;IsValid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&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;Python Function:&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;hashlib&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;authenticate_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_user_by_username&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;active&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="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;

    &lt;span class="c1"&gt;# Hash the provided password
&lt;/span&gt;    &lt;span class="n"&gt;password_hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sha256&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;salt&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&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;password_hash&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;password_hash&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="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;role&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="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Key Differences to Consider
&lt;/h2&gt;

&lt;p&gt;While similar in concept, important differences exist:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Stored Procedures&lt;/th&gt;
&lt;th&gt;Python Functions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Execution Environment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Database server&lt;/td&gt;
&lt;td&gt;Application server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Language Features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SQL-specific&lt;/td&gt;
&lt;td&gt;Full programming language&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Direct database access&lt;/td&gt;
&lt;td&gt;Through connectors/ORMs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deployment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Database-specific&lt;/td&gt;
&lt;td&gt;Cross-platform&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Version Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Challenging&lt;/td&gt;
&lt;td&gt;Native support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unit Testing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited tools&lt;/td&gt;
&lt;td&gt;Rich ecosystem&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Keep in mind:
&lt;/h2&gt;

&lt;p&gt;The similarities between stored procedures and Python functions highlight fundamental programming concepts that transcend specific technologies. Both serve as building blocks for creating maintainable, reusable, and efficient code. Understanding these parallels helps developers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Transfer knowledge between database and application development&lt;/li&gt;
&lt;li&gt;Make informed decisions about where to implement business logic&lt;/li&gt;
&lt;li&gt;Appreciate the universal principles of good software design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you're working with SQL stored procedures or Python functions, the core principles of modularity, reusability, and clear interfaces remain constant.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>SQL Query techniques and their differences ie Subqueries, CTEs and stored procedures.</title>
      <dc:creator>Nicholus Gathirwa</dc:creator>
      <pubDate>Mon, 08 Sep 2025 06:46:17 +0000</pubDate>
      <link>https://forem.com/gg001/sql-query-techniques-and-their-differences-ie-subqueries-ctes-and-stored-procedures-4eli</link>
      <guid>https://forem.com/gg001/sql-query-techniques-and-their-differences-ie-subqueries-ctes-and-stored-procedures-4eli</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;SQL offers multiple approaches for complex data operations. Understanding the differences between subqueries, Common Table Expressions (CTEs), and stored procedures is crucial for writing efficient and maintainable database code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subqueries
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definition
&lt;/h3&gt;

&lt;p&gt;A subquery is a query nested inside another SQL statement. It executes first and passes its result to the outer query.&lt;/p&gt;

&lt;h3&gt;
  
  
  Characteristics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Execution&lt;/strong&gt;: Runs once or multiple times depending on context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scope&lt;/strong&gt;: Limited to the statement where it's defined&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reusability&lt;/strong&gt;: Cannot be reused across different queries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Can be less efficient for complex operations&lt;/li&gt;
&lt;/ul&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Find employees earning more than average salary&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;salary&lt;/span&gt; 
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; 
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;salary&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Correlated subquery&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;e1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="n"&gt;e1&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;e1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;AVG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="n"&gt;e2&lt;/span&gt; 
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;e2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;e1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Best Use Cases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Simple filtering conditions&lt;/li&gt;
&lt;li&gt;One-time calculations&lt;/li&gt;
&lt;li&gt;EXISTS/NOT EXISTS operations&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Common Table Expressions (CTEs)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definition
&lt;/h3&gt;

&lt;p&gt;CTEs are temporary named result sets that exist only during query execution. They improve readability and can be referenced multiple times within a single statement.&lt;/p&gt;

&lt;h3&gt;
  
  
  Characteristics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Readability&lt;/strong&gt;: Makes complex queries more readable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reusability&lt;/strong&gt;: Can be referenced multiple times in the same query&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recursion&lt;/strong&gt;: Supports recursive operations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Similar to subqueries but more maintainable&lt;/li&gt;
&lt;/ul&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Basic CTE&lt;/span&gt;
&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;high_earners&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;salary&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;75000&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;high_earner_count&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;high_earners&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;department&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Recursive CTE for hierarchical data&lt;/span&gt;
&lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="k"&gt;RECURSIVE&lt;/span&gt; &lt;span class="n"&gt;employee_hierarchy&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;-- Base case&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;employee_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;manager_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="k"&gt;level&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;manager_id&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;

    &lt;span class="k"&gt;UNION&lt;/span&gt; &lt;span class="k"&gt;ALL&lt;/span&gt;

    &lt;span class="c1"&gt;-- Recursive case&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;employee_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;manager_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eh&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;level&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
    &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;employee_hierarchy&lt;/span&gt; &lt;span class="n"&gt;eh&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;manager_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;eh&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;employee_id&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employee_hierarchy&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="k"&gt;level&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Best Use Cases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Complex queries requiring multiple references to the same result set&lt;/li&gt;
&lt;li&gt;Recursive operations (organizational charts, bill of materials)&lt;/li&gt;
&lt;li&gt;Improving query readability&lt;/li&gt;
&lt;li&gt;Window function operations&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Stored Procedures
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Definition
&lt;/h3&gt;

&lt;p&gt;Stored procedures are precompiled SQL code blocks stored in the database that can accept parameters and return results.&lt;/p&gt;

&lt;h3&gt;
  
  
  Characteristics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Persistence&lt;/strong&gt;: Stored permanently in the database&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Precompiled and cached for faster execution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reusability&lt;/strong&gt;: Can be called from multiple applications&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Provide controlled access to data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logic&lt;/strong&gt;: Can contain complex business logic with control structures&lt;/li&gt;
&lt;/ul&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Creating a stored procedure&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;PROCEDURE&lt;/span&gt; &lt;span class="n"&gt;GetEmployeesByDepartment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;DepartmentName&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;MinSalary&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AS&lt;/span&gt;
&lt;span class="k"&gt;BEGIN&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt; 
        &lt;span class="n"&gt;employee_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;salary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;hire_date&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;employees&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;
    &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;departments&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department_id&lt;/span&gt;
    &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;department_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;DepartmentName&lt;/span&gt;
    &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;MinSalary&lt;/span&gt;
    &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;salary&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;END&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Calling the stored procedure&lt;/span&gt;
&lt;span class="k"&gt;EXEC&lt;/span&gt; &lt;span class="n"&gt;GetEmployeesByDepartment&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;DepartmentName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Engineering'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;MinSalary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;60000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Best Use Cases
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Frequently executed operations&lt;/li&gt;
&lt;li&gt;Complex business logic requiring multiple steps&lt;/li&gt;
&lt;li&gt;Data validation and transformation&lt;/li&gt;
&lt;li&gt;Batch processing operations&lt;/li&gt;
&lt;li&gt;Enforcing business rules at the database level&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Differences Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Subqueries&lt;/th&gt;
&lt;th&gt;CTEs&lt;/th&gt;
&lt;th&gt;Stored Procedures&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Single statement&lt;/td&gt;
&lt;td&gt;Single statement&lt;/td&gt;
&lt;td&gt;Database-wide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reusability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Within same query&lt;/td&gt;
&lt;td&gt;Across applications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Variable&lt;/td&gt;
&lt;td&gt;Similar to subqueries&lt;/td&gt;
&lt;td&gt;Optimized (precompiled)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Moderate&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maintenance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Inline only&lt;/td&gt;
&lt;td&gt;Inline only&lt;/td&gt;
&lt;td&gt;Centralized&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Parameters&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Business Logic&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  When to Choose What
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Use Subqueries When:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need a simple, one-time filtering condition&lt;/li&gt;
&lt;li&gt;The logic is straightforward and won't be reused&lt;/li&gt;
&lt;li&gt;Working with small datasets&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use CTEs When:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You need to reference the same result set multiple times&lt;/li&gt;
&lt;li&gt;Working with recursive data structures&lt;/li&gt;
&lt;li&gt;You want to improve query readability&lt;/li&gt;
&lt;li&gt;Breaking down complex queries into logical steps&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Stored Procedures When:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The operation will be called frequently&lt;/li&gt;
&lt;li&gt;You need to implement complex business logic&lt;/li&gt;
&lt;li&gt;Multiple applications need the same functionality&lt;/li&gt;
&lt;li&gt;You want centralized control over data access&lt;/li&gt;
&lt;li&gt;Performance optimization is critical&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Things to remember:
&lt;/h2&gt;

&lt;p&gt;Each approach serves different purposes in database development. Subqueries are great for simple operations, CTEs excel at making complex queries readable and handling recursive scenarios, while stored procedures provide robust, reusable solutions for complex business logic. Choose based on your specific requirements for performance, maintainability, and complexity.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Lamda functions and decorators: A developer's guide.</title>
      <dc:creator>Nicholus Gathirwa</dc:creator>
      <pubDate>Mon, 08 Sep 2025 06:42:05 +0000</pubDate>
      <link>https://forem.com/gg001/lamda-functions-and-decorators-a-developers-guide-1ok0</link>
      <guid>https://forem.com/gg001/lamda-functions-and-decorators-a-developers-guide-1ok0</guid>
      <description>&lt;h2&gt;
  
  
  Lambda Functions: Anonymous Functions Made Simple
&lt;/h2&gt;

&lt;p&gt;Lambda functions are anonymous functions that can be defined inline without a formal &lt;code&gt;def&lt;/code&gt; statement. They're particularly useful for short, simple operations that don't warrant a full function definition.&lt;/p&gt;

&lt;h3&gt;
  
  
  Syntax and Basic Usage
&lt;/h3&gt;

&lt;p&gt;The basic syntax follows the pattern: &lt;code&gt;lambda arguments: expression&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Traditional function
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;square&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="c1"&gt;# Lambda equivalent
&lt;/span&gt;&lt;span class="n"&gt;square_lambda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="c1"&gt;# Usage
&lt;/span&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;square_lambda&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Output: 25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Common Use Cases
&lt;/h3&gt;

&lt;p&gt;Lambda functions shine in functional programming contexts, especially with built-in functions like &lt;code&gt;map()&lt;/code&gt;, &lt;code&gt;filter()&lt;/code&gt;, and &lt;code&gt;sorted()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Filtering even numbers
&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;evens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# Result: [2, 4, 6, 8, 10]
&lt;/span&gt;
&lt;span class="c1"&gt;# Sorting by custom criteria
&lt;/span&gt;&lt;span class="n"&gt;students&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Alice&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Bob&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;92&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Charlie&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;78&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="n"&gt;sorted_students&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;students&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;student&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="c1"&gt;# Result: [('Charlie', 78), ('Alice', 85), ('Bob', 92)]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  When to Use Lambda Functions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Short, simple operations&lt;/strong&gt; that fit on one line&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Temporary functions&lt;/strong&gt; needed for a specific context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Functional programming&lt;/strong&gt; with &lt;code&gt;map()&lt;/code&gt;, &lt;code&gt;filter()&lt;/code&gt;, &lt;code&gt;reduce()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event handling&lt;/strong&gt; in GUI applications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Lambda functions are limited to expressions only—no statements like &lt;code&gt;print()&lt;/code&gt; or assignments.&lt;/p&gt;




&lt;h2&gt;
  
  
  Decorators: Enhancing Functions with Style
&lt;/h2&gt;

&lt;p&gt;Decorators are a powerful Python feature that allows you to modify or extend the behavior of functions or classes without permanently modifying their code. They implement the decorator pattern and are a prime example of higher-order functions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding the Basics
&lt;/h3&gt;

&lt;p&gt;At its core, a decorator is a function that takes another function as input and returns a modified version of that function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;my_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="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;Something before the function&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nf"&gt;func&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;Something after the function&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;wrapper&lt;/span&gt;

&lt;span class="nd"&gt;@my_decorator&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;say_hello&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;Hello!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Equivalent to: say_hello = my_decorator(say_hello)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Decorators with Arguments
&lt;/h3&gt;

&lt;p&gt;Real-world decorators often need to handle functions with various arguments:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;timing_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
        &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; took &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; seconds&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;

&lt;span class="nd"&gt;@timing_decorator&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate_sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Practical Examples
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Logging Decorator:&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;def&lt;/span&gt; &lt;span class="nf"&gt;log_calls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="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;Calling &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; with args: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, kwargs: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;kwargs&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="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;

&lt;span class="nd"&gt;@log_calls&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Authentication Decorator:&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;def&lt;/span&gt; &lt;span class="nf"&gt;require_auth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;user_is_authenticated&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;PermissionError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authentication required&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="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;

&lt;span class="nd"&gt;@require_auth&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sensitive_operation&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Top secret data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Higher-Order Functions: The Foundation
&lt;/h2&gt;

&lt;p&gt;Higher-order functions are functions that either:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Take one or more functions as arguments&lt;/li&gt;
&lt;li&gt;Return a function as their result&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both decorators and many uses of lambda functions are examples of higher-order functions in action.&lt;/p&gt;

&lt;h3&gt;
  
  
  Built-in Higher-Order Functions
&lt;/h3&gt;

&lt;p&gt;Python provides several built-in higher-order functions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;map()&lt;/code&gt;&lt;/strong&gt; - Applies a function to every item in an iterable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;filter()&lt;/code&gt;&lt;/strong&gt; - Filters items based on a function's return value&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;reduce()&lt;/code&gt;&lt;/strong&gt; - Applies a function cumulatively to items in a sequence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;sorted()&lt;/code&gt;&lt;/strong&gt; - Sorts items using a custom key function&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Creating Custom Higher-Order Functions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;apply_operation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;operation&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;operate_on_list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;numbers&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;operate_on_list&lt;/span&gt;

&lt;span class="c1"&gt;# Usage
&lt;/span&gt;&lt;span class="n"&gt;double&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;apply_operation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;double&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;  &lt;span class="c1"&gt;# [2, 4, 6, 8, 10]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Best Practices and Tips
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Lambda Functions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Keep them simple and readable&lt;/li&gt;
&lt;li&gt;Use meaningful variable names even in short lambdas&lt;/li&gt;
&lt;li&gt;Consider regular functions for complex logic&lt;/li&gt;
&lt;li&gt;Avoid nested lambdas for better readability&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Decorators
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;functools.wraps()&lt;/code&gt; to preserve function metadata:
&lt;/li&gt;
&lt;/ul&gt;

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

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;my_decorator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
      &lt;span class="nd"&gt;@wraps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;func&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
          &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Document what your decorators do&lt;/li&gt;
&lt;li&gt;Keep decorator logic separate from business logic&lt;/li&gt;
&lt;li&gt;Consider using classes for complex decorators with state&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  General Guidelines
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Favor clarity over cleverness&lt;/li&gt;
&lt;li&gt;Test decorated functions thoroughly&lt;/li&gt;
&lt;li&gt;Be mindful of performance implications&lt;/li&gt;
&lt;li&gt;Use type hints when possible for better code documentation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Basically,
&lt;/h2&gt;

&lt;p&gt;Lambda functions, decorators, and higher-order functions are powerful tools in Python's functional programming toolkit. Lambda functions provide quick, anonymous function definitions for simple operations. Decorators offer an elegant way to extend function behavior without modifying the original code. Higher-order functions enable flexible, reusable code patterns.&lt;/p&gt;

&lt;p&gt;Mastering these concepts will make your Python code more expressive, maintainable, and Pythonic. Start with simple examples and gradually work your way up to more complex implementations as you become comfortable with these patterns.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>PostgreSQL Installation and Setup on Linux Server: A Complete Guide by Nicholus Gathirwa.</title>
      <dc:creator>Nicholus Gathirwa</dc:creator>
      <pubDate>Sun, 03 Aug 2025 19:37:34 +0000</pubDate>
      <link>https://forem.com/gg001/postgresql-installation-and-setup-on-linux-server-a-complete-guide-by-nicholus-gathirwa-264k</link>
      <guid>https://forem.com/gg001/postgresql-installation-and-setup-on-linux-server-a-complete-guide-by-nicholus-gathirwa-264k</guid>
      <description>&lt;h1&gt;
  
  
  PostgreSQL Installation and Setup on Linux Server: A Complete Guide
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before we begin, you'll need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An Azure account (free tier works fine)&lt;/li&gt;
&lt;li&gt;A terminal application (Git Bash, PowerShell for Windows, or Terminal for Mac)&lt;/li&gt;
&lt;li&gt;Basic knowledge of Linux command line&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Creating an Azure Virtual Machine
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1 Creating Your Azure Account
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Visit Azure Portal&lt;/strong&gt; at &lt;a href="https://portal.azure.com" rel="noopener noreferrer"&gt;portal.azure.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sign up for a free account&lt;/strong&gt; - Azure provides $200 in free credits for new users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Student Account Benefits&lt;/strong&gt;: If you have a student email, use &lt;a href="https://azure.microsoft.com/en-us/free/students/" rel="noopener noreferrer"&gt;Azure for Students&lt;/a&gt; to get:

&lt;ul&gt;
&lt;li&gt;$100 in free Azure credits (no credit card required)&lt;/li&gt;
&lt;li&gt;Access to free services for 12 months&lt;/li&gt;
&lt;li&gt;Additional student-specific resources&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1.2 Setting Up Your VM
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Log into Azure Portal&lt;/strong&gt; and navigate to Virtual Machines&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Click "Create"&lt;/strong&gt; to start the VM creation process&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose your region&lt;/strong&gt; - Select a region close to your users (e.g., West US 2)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Select VM specifications&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Choose an appropriate image (Ubuntu Server recommended)&lt;/li&gt;
&lt;li&gt;Select VM size based on your needs&lt;/li&gt;
&lt;li&gt;Set up authentication&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  VM Configuration
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Example VM settings&lt;/span&gt;
Username: luxStudent
Password: developer@123
Region: West US 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Review and Create&lt;/strong&gt; your virtual machine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Go to Resource&lt;/strong&gt; once deployment is complete&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy the Public IP address&lt;/strong&gt; for SSH access&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 2: Connecting to Your Linux Server
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 SSH Connection
&lt;/h3&gt;

&lt;p&gt;SSH (Secure Shell) operates on port 22 by default and provides secure remote access to your server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Basic SSH connection syntax&lt;/span&gt;
ssh username@ip_address

&lt;span class="c"&gt;# Example connection&lt;/span&gt;
ssh luxStudent@102.37.147.102
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.2 First Login
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Enter your password&lt;/strong&gt; when prompted&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test your connection&lt;/strong&gt; by creating a directory:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a test directory&lt;/span&gt;
&lt;span class="nb"&gt;mkdir &lt;/span&gt;mercy

&lt;span class="c"&gt;# List contents to verify&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.3 Basic File Operations
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a file&lt;/span&gt;
&lt;span class="nb"&gt;touch &lt;/span&gt;script.sql

&lt;span class="c"&gt;# Edit the file using vim&lt;/span&gt;
vim script.sql

&lt;span class="c"&gt;# Exit vim without saving&lt;/span&gt;
:q!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Installing PostgreSQL
&lt;/h2&gt;

&lt;h3&gt;
  
  
  3.1 System Preparation
&lt;/h3&gt;

&lt;p&gt;Before installing PostgreSQL, update your system packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Update package lists&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2 PostgreSQL Installation
&lt;/h3&gt;

&lt;p&gt;Install PostgreSQL along with additional contrib packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install PostgreSQL and additional tools&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;postgresql postgresql-contrib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;postgresql-contrib&lt;/code&gt; package includes useful additional utilities and extensions.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.3 Verify Installation
&lt;/h3&gt;

&lt;p&gt;Check if PostgreSQL service is running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check PostgreSQL service status&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status postgresql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see the service as "active" if installation was successful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: PostgreSQL Initial Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  4.1 Accessing PostgreSQL
&lt;/h3&gt;

&lt;p&gt;Switch to the postgres user and access the PostgreSQL prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Switch to postgres user&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; postgres

&lt;span class="c"&gt;# Access PostgreSQL command line&lt;/span&gt;
psql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.2 Database Operations
&lt;/h3&gt;

&lt;p&gt;Once in the PostgreSQL prompt, you can perform various operations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- List all databases&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;

&lt;span class="c1"&gt;-- Create a new database&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="n"&gt;luxStudent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Verify database creation&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.3 User Management
&lt;/h3&gt;

&lt;p&gt;Create a new user and assign privileges:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Create a new user with password&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="nv"&gt;"username"&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;PASSWORD&lt;/span&gt; &lt;span class="nv"&gt;"password"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Grant superuser privileges&lt;/span&gt;
&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;USER&lt;/span&gt; &lt;span class="nv"&gt;"username"&lt;/span&gt; &lt;span class="k"&gt;WITH&lt;/span&gt; &lt;span class="n"&gt;SUPERUSER&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Exit PostgreSQL prompt&lt;/span&gt;
&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then exit from postgres user:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5: Configuring PostgreSQL for Remote Access
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 PostgreSQL Configuration Files
&lt;/h3&gt;

&lt;p&gt;Navigate to the PostgreSQL configuration directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Go to PostgreSQL configuration directory&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /etc/postgresql

&lt;span class="c"&gt;# List PostgreSQL versions&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt;

&lt;span class="c"&gt;# Navigate to version directory (e.g., 16)&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;16

&lt;span class="c"&gt;# Go to main configuration directory&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;main

&lt;span class="c"&gt;# List configuration files&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.2 Editing postgresql.conf
&lt;/h3&gt;

&lt;p&gt;Edit the main PostgreSQL configuration file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Edit PostgreSQL configuration&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;vim postgresql.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Find and modify the &lt;code&gt;listen_addresses&lt;/code&gt; setting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change from:&lt;/span&gt;
&lt;span class="c"&gt;# listen_addresses = 'localhost'&lt;/span&gt;

&lt;span class="c"&gt;# To:&lt;/span&gt;
listen_addresses &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'*'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save and exit vim (&lt;code&gt;:wq&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  5.3 Configuring Client Authentication
&lt;/h3&gt;

&lt;p&gt;Edit the pg_hba.conf file to allow remote connections:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Edit authentication configuration&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;vim pg_hba.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the following line to allow connections from any IP address:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Allow all connections (use with caution in production)&lt;/span&gt;
host all all 0.0.0.0/0 md5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save and exit vim.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.4 Restart PostgreSQL Service
&lt;/h3&gt;

&lt;p&gt;Apply the configuration changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Restart PostgreSQL service&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart postgresql

&lt;span class="c"&gt;# Verify service status&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status postgresql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6: Azure Network Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 Configure Inbound Port Rules
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Go to Azure Portal&lt;/strong&gt; → Your VM → Networking&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Click "Add inbound port rule"&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configure the rule&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Destination port ranges: &lt;code&gt;5432&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Protocol: TCP&lt;/li&gt;
&lt;li&gt;Action: Allow&lt;/li&gt;
&lt;li&gt;Name: PostgreSQL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Click "Add"&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 7: Testing Remote Connection
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7.1 Using DBeaver
&lt;/h3&gt;

&lt;p&gt;To test your PostgreSQL setup with a database client like DBeaver:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Host&lt;/strong&gt;: Your VM's public IP address eg 192.168.90.1&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Port&lt;/strong&gt;: 5432&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: The database name you created&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Username&lt;/strong&gt;: The username you created&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password&lt;/strong&gt;: The corresponding password&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  7.2 Connection Troubleshooting
&lt;/h3&gt;

&lt;p&gt;During installation and setup, one might face a couple of issues. Follow the steps below, Generally applicable to most situations, which may include but not limited to potential issues faced during installation and setup: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Verify PostgreSQL is running&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status postgresql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check if port 5432 is listening&lt;/strong&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;netstat &lt;span class="nt"&gt;-tlnp&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;5432
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Verify Azure firewall rules&lt;/strong&gt; are properly configured&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check authentication settings&lt;/strong&gt; in pg_hba.conf&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Keep in mind
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Important Security Notes:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Never use weak passwords&lt;/strong&gt; in production environments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restrict IP access&lt;/strong&gt; instead of allowing 0.0.0.0/0 in production&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use SSL/TLS encryption&lt;/strong&gt; for remote connections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regularly update&lt;/strong&gt; your PostgreSQL installation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implement proper backup strategies&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Production-Ready Security:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Example of restricting access to specific IP ranges&lt;/span&gt;
host all all 192.168.1.0/24 md5
host all all 10.0.0.0/8 md5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Additional Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/" rel="noopener noreferrer"&gt;Official PostgreSQL Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.postgresql.org/wiki/Performance_Optimization" rel="noopener noreferrer"&gt;PostgreSQL Performance Tuning Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.microsoft.com/en-us/azure/virtual-machines/" rel="noopener noreferrer"&gt;Azure Virtual Machines Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This guide provides a comprehensive walkthrough for setting up PostgreSQL on a Linux server deployed on microsoft azure, connecting to the server locally using dbeaver and other configurations that may be required. Remember to always follow security best practices and regularly update your systems. Have a good one!!!&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
