Posted in

Python Type Promotion Explained (Implicit Type Conversion & Type Hierarchy)

Python type promotion explains how Python automatically converts data types during operations. In this lesson, you’ll learn implicit type conversion, type hierarchy, and how Python decides which data type to use—without writing any extra code.
Python Type Promotion showing implicit type conversion and type hierarchy in Python
Visual representation of Python Type Promotion and how implicit type conversion works across different data types

Introduction: Python Type Promotion

In the previous lessons, you built a strong foundation around type casting in Python—you learned how to manually convert data using functions like int(), float(), complex(), bool(), and even advanced ones like list(), tuple(), set(), and dict().

That gave you full control over how data changes.

But here’s where many beginners get confused…

Python doesn’t always wait for you to convert types manually.
Sometimes, it makes the decision on its own.

This automatic behavior is called Python type promotion (also known as implicit type conversion).

In simple terms, when different data types are used together, Python:

  • Decides which type should take priority
  • Automatically converts other values to match it
  • Ensures the operation works without breaking

Think of it like upgrading smaller containers into a bigger one so everything fits safely.

In this lesson, we’ll break down how this works, why Python does it, and where it can confuse you if you’re not careful.

What You’ll Learn in This Lesson

By the end of this guide on Python type promotion, you will understand:

  • What Python type promotion actually means
  • How implicit type conversion works in Python
  • The concept of type hierarchy (promotion order)
  • Why Python promotes some data types but not others
  • The difference between widening vs narrowing conversions
  • How Python handles mixed data type operations
  • Common confusion points (like True + 5 or int + str)
  • When to rely on promotion vs use explicit type casting

Before we dive deeper into Python type promotion, let’s quickly revisit type casting so everything connects clearly…


Quick Recap — Implicit vs Explicit Casting

Before we dive into Python type promotion, it’s important to quickly revisit the two core concepts you’ve already learned: implicit casting and explicit casting.

Think of this as a quick refresh so you can clearly see where type promotion fits in.


What is Explicit Casting? (Manual Control)

Explicit casting means you decide how a data type should be converted.

You use built-in functions like int(), float(), str(), etc., to force a conversion.

Example:

user_input_value = "25"
converted_number = int(user_input_value)

print(converted_number)        # 25
print(type(converted_number))  # <class 'int'>

Key Idea:

  • You are in control
  • Conversion is intentional and visible
  • Python does exactly what you tell it

This is useful when:

  • You know the data format
  • You want precise control over conversion

What is Implicit Casting? (Automatic Behavior)

Implicit casting happens when Python automatically converts one data type to another without your instruction.

Example:

integer_value = 5
float_value = 2.0

result_value = integer_value + float_value

print(result_value)        # 7.0
print(type(result_value))  # <class 'float'>

What Happened Here?

  • Python saw two different types: int and float
  • It automatically converted the int into a float
  • Then performed the operation

No float() function was used, yet conversion happened.


Implicit vs Explicit Casting (Quick Comparison)

FeatureImplicit CastingExplicit Casting
ControlPython decidesYou decide
ConversionAutomaticManual
Code VisibilityHidden (behind the scenes)Clearly written
RiskLow (safe conversions only)Depends on usage
Example5 + 2.0 → 7.0int("5") → 5

Why This Recap Matters

Up to this point:

  • You’ve learned how to manually convert data types
  • You’ve seen Python sometimes convert types automatically

But one important question still remains:

How does Python decide which type to convert into which?

That decision is not random—it follows a specific logic.

And that’s exactly what we’re going to explore next…

The logic behind Python’s automatic conversions is called Python type promotion.


The Problem — What Happens When Types Mix?

In real-world Python programs, you rarely work with just one data type.

You’ll often deal with mixed data—for example:

  • User input (usually strings)
  • Calculations (integers and floats)
  • Boolean values in conditions

So naturally, situations like this are very common:

total_score = 90 + 2.5

Now pause for a second and think:

These are two different data types

  • 90int
  • 2.5float

So what should Python do here?

There are a few possible options:

  • Convert 2.52 (float → int)
  • Convert 9090.0 (int → float)
  • Throw an error and stop execution

Each choice leads to a different outcome.


Why This Decision Matters

Let’s quickly analyze:

Option 1: Convert float → int (Narrowing)

90 + 2   # Result: 92

Problem:

  • The decimal part (.5) is lost
  • This changes the actual value

Option 2: Convert int → float (Widening)

90.0 + 2.5   # Result: 92.5

Benefit:

  • No data is lost
  • Result stays accurate

Option 3: Throw an Error

# Program stops 

Problem:

  • Too strict
  • Makes coding less flexible

Python’s Approach

Python chooses the safest and most logical option:

It converts the int → float
Performs the operation
Returns a float result

total_score = 90 + 2.5

print(total_score)        # 92.5
print(type(total_score))  # <class 'float'>

The Real Question

This example reveals something important:

Python is making a decision for you.

But based on what?

  • Why did it convert intfloat and not the other way?
  • How does it decide which type is “better” or “safer”?
  • Does this behavior stay the same for all data types?

The Hidden Challenge

As you start writing more complex programs, this becomes critical:

  • Mixing multiple data types in calculations
  • Unexpected result types
  • Confusion when results don’t match expectations

Without understanding this behavior, it can feel like:

“Python is randomly changing my data types.”

But Python is not random at all.

It follows a clear internal logic to handle mixed data types safely and consistently.

That logic is called Python type promotion.

Let’s understand what that really means…


What Is Python Type Promotion?

Now that you’ve seen the problem—mixed data types in a single operation—let’s understand how Python actually solves it.


Definition (Simple & Clear)

Python type promotion is the process where Python:

  • Automatically converts one data type into another
  • Chooses a common data type for an operation
  • Ensures the result is accurate and safe

In simple terms:

When different data types are used together, Python “promotes” the smaller type to a higher, more capable type.


Let’s Revisit the Example

number_value = 5
decimal_value = 2.0

result_value = number_value + decimal_value

What Python Does Internally:

  • Detects two different types → int and float
  • Decides a common type → float
  • Converts 55.0
  • Performs the operation
print(result_value)        # 7.0
print(type(result_value))  # <class 'float'>

This automatic conversion is Python type promotion in action.


Why Does Python Use Type Promotion?

Python follows this approach for three important reasons:

1. To Prevent Data Loss

Converting float → int would remove decimal values.

2. To Maintain Precision

Higher data types can store more detailed information.

3. To Keep Code Simple

You don’t need to manually convert types every time.


The Core Idea Behind Type Promotion

Python doesn’t randomly convert types.
It follows a simple principle:

Always move toward a safer and more expressive data type.

This means:

  • Smaller types are upgraded
  • Larger types remain unchanged
  • Risky conversions are avoided

A Quick Mental Model

Think of data types like containers:

  • int → small container
  • float → medium container
  • complex → large container

When combining them, Python picks a container that can hold everything safely.


Important Clarification

  • Type Promotion is automatic
  • You don’t write any conversion code
  • It only happens during operations involving multiple types

If Python cannot find a safe conversion, it will raise an error instead of guessing


Visual Guide: Python Type Promotion Explained

A quick visual overview of Python type promotion to help you understand how implicit type conversion works step by step.

Python Type Promotion showing implicit type conversion and type hierarchy with example

This visual simplifies how Python automatically promotes data types to ensure safe and accurate operations.

Now that you understand what Python type promotion is, the next question is:

How does Python decide which data type is “higher” or “safer”?

To answer that, we need to explore Python’s internal structure called the Numeric Tower (Type Hierarchy).


Python’s Numeric Tower (Type Hierarchy)

Now that you understand what Python type promotion is, the next step is to understand how Python decides which data type is “higher” or “safer.”

Python doesn’t guess randomly.
It follows a structured system known as the Numeric Tower.


What is the Numeric Tower?

The Numeric Tower is a conceptual hierarchy that defines how numeric data types are related and how they grow in capability.

In simple terms:

It’s the order Python follows to decide which type should dominate during an operation.


The Type Promotion Order

Here’s the core hierarchy used in Python type promotion:

bool → int → float → complex

Understanding Each Level

Let’s break this down step by step:

1. bool (Lowest Level)

  • Represents: True or False
  • Internally behaves like:
    • True → 1
    • False → 0

That’s why:

print(True + 5)  # 6

2. int

  • Represents whole numbers
  • Example: 10, -3, 1000

More powerful than bool, but limited to integers.

3. float

  • Represents decimal numbers
  • Example: 2.5, 3.14

Can store everything an int can, plus fractional values.

4. complex (Highest Level)

  • Represents numbers with real + imaginary parts
  • Example: 3 + 4j

Most expressive numeric type in Python.

Why This Order Matters

This hierarchy defines how Python type promotion works:

  • Python always moves from left → right
  • Lower types are promoted to higher types
  • Higher types are never reduced automatically

Examples in Action

Example 1: int + float

result_value = 5 + 2.5
print(type(result_value))  # float

int is promoted to float

Example 2: int + complex

result_value = 3 + 4j
print(type(result_value))  # complex

int is promoted to complex

Example 3: bool + int

result_value = True + 10
print(result_value)  # 11

bool is promoted to int


Key Insight

Each step in the numeric tower represents:

  • More precision
  • More capability
  • More storage complexity

That’s why Python always promotes upward—it preserves information.


Important Note

This hierarchy applies only to numeric types.

Types like:

  • str
  • list
  • dict

Are not part of the numeric tower
And are not automatically promoted

Example:

5 + "5"  # TypeError 

Mental Model (Easy Way to Remember)

Think of the numeric tower like upgrading tools:

  • bool → basic switch
  • int → simple calculator
  • float → scientific calculator
  • complex → advanced math system

When combining tools, Python picks the one that can handle everything safely.


Visual Guide: Python Type Promotion and Numeric Tower

This visual breaks down Python type promotion using the numeric tower to show how data types are structured and promoted.

Python Type Promotion numeric tower showing type hierarchy from bool to complex

Use this hierarchy to quickly understand how Python decides which data type to use during mixed-type operations.

Now that you understand the Numeric Tower, the next step is to clearly understand:

Why Python allows some conversions automatically but blocks others

Let’s break that down using the concept of Widening vs Narrowing.


Widening vs Narrowing (The Real Confusion Breaker)

Now that you understand the Numeric Tower, we can finally answer an important question:

Why does Python allow some conversions automatically but not others?

The answer lies in two key concepts:

  • Widening
  • Narrowing

These are not Python-specific terms, but they explain Python Type Promotion very clearly.


What is Widening?

Widening means converting a smaller data type into a larger, more capable data type.

This is exactly what Python type promotion does.

Example:

integer_value = 5
result_value = integer_value + 2.5

What Happens:

  • int → promoted to float
  • No information is lost
  • Result is accurate
print(result_value)        # 7.5
print(type(result_value))  # float

Why Widening is Safe

  • Larger types can store everything smaller types can
  • No precision is lost
  • Results remain meaningful

That’s why Python allows widening automatically.


What is Narrowing?

Narrowing means converting a larger data type into a smaller one.

Example:

float_value = 5.9
converted_value = int(float_value)
print(converted_value)  # 5

What Happened:

  • Decimal part .9 is lost
  • Data is changed permanently

Why Narrowing is Risky

  • Loss of precision
  • Possible incorrect results
  • Hidden bugs in calculations

Because of this, Python never performs narrowing automatically.

Why Python Avoids Automatic Narrowing

Python follows a strict safety principle:

“Only perform conversions that do not lose information.”

If Python allowed automatic narrowing:

  • 5.9 + 2 could become 7 instead of 7.9
  • Results would silently change
  • Debugging would become difficult

So Python avoids this completely.


Widening vs Narrowing (Quick Comparison)

FeatureWideningNarrowing
DirectionSmaller → LargerLarger → Smaller
Data LossNoPossible
Automatic in PythonYesNo
SafetyHighRisky
Exampleint → floatfloat → int

How This Connects to Python Type Promotion

Now everything clicks together:

  • Python Type Promotion = Widening
  • It always moves up the numeric tower.
  • It never goes downward automatically

That’s why:

5 + 2.0   # → 7.0

But not:

# Python will NOT do this:
2.0 → 2

Visual Guide: Python Type Promotion (Widening vs Narrowing)

This visual explains Python type promotion by comparing widening (safe conversion) and narrowing (risky conversion) in a simple, easy-to-understand format.

Python Type Promotion widening vs narrowing showing implicit type conversion and safe vs risky conversions

Use this comparison to clearly understand why Python allows widening automatically but avoids narrowing conversions.

At this point, you understand:

  • How Python promotes types
  • Why it only allows safe conversions

But there’s still one major confusion…

Why do different tutorials use different names for the same concept?

Let’s clear that up in the next section: The Name Confusion — A Reference Table.


The Name Confusion — A Reference Table

If you’ve explored different tutorials, blogs, or videos, you’ve probably noticed something confusing:

The same concept is explained using different names.

This creates a lot of unnecessary confusion—especially for beginners trying to build a clear mental model.


Why Does This Confusion Happen?

Different sources:

  • Come from different programming backgrounds (C, Java, JavaScript, etc.)
  • Use academic vs practical terminology
  • Simplify concepts differently for teaching

As a result, one concept gets multiple labels.


Common Terms You’ll See Online

Here’s a clear reference table to decode everything:

Term UsedWhat It MeansWhere You’ll See It
Python Type PromotionAutomatic upgrading of a data type during operationsPython-focused explanations
Implicit Type ConversionAutomatic conversion without writing codeBeginner tutorials
Type CoercionSystem-enforced conversion between typesGeneral programming
Type HierarchyOrder of data types based on capabilityConcept explanations
Data Type OrderInformal way to describe hierarchyBlogs / articles
Widening ConversionSafe conversion to a larger typeTheory-based discussions
Narrowing ConversionRisky conversion to a smaller typeAdvanced topics
Numeric TowerPython’s internal type hierarchy modelPython documentation concepts

What You Should Focus On

Instead of getting stuck in terminology, focus on the core idea:

Python automatically converts data types in a safe direction using a defined hierarchy.

You can mentally map everything like this:

  • Python Type Promotion = What Python does
  • Implicit Type Conversion = How it happens
  • Numeric Tower / Type Hierarchy = The structure it follows
  • Widening = The direction it moves

Once you understand this mapping, all terms become easy to connect.


Important Clarification

Even though these terms are related:

  • They are not always used consistently across tutorials
  • Some sources may mix or misuse them
  • Python itself doesn’t strictly enforce all these names

That’s why focusing on the behavior is more important than memorizing terms.


Now that the terminology confusion is clear, let’s take a broader perspective:

How does Python Type Promotion compare with other programming languages?

In the next section, we’ll explore how different languages handle type conversion and where Python stands.


How Other Languages Handle Type Order (Quick View)

Now that the terminology confusion is clear, let’s step outside Python for a moment.

You might be wondering:

Do other programming languages also follow something like Python Type Promotion?

The answer is yes—but with important differences.


The Common Idea Across Languages

Most programming languages:

  • Have some form of type hierarchy
  • Perform automatic conversions in mixed-type operations
  • Try to balance flexibility vs safety

But the way they implement this can vary a lot.


Quick Examples from Other Languages

C / C++

  • Uses type promotion rules
  • Allows both safe and sometimes risky conversions
int number_value = 5;
float decimal_value = 2.5;

float result_value = number_value + decimal_value;  // int → float

Similar to Python, but:

  • Can allow unsafe conversions in some cases
  • Less strict compared to Python

Java

  • Follows strict widening rules
  • Requires explicit casting for narrowing
int numberValue = 5;
double decimalValue = 2.5;

double resultValue = numberValue + decimalValue;

Key point:

  • Safe conversions → automatic
  • Risky conversions → must be written manually

JavaScript

  • Very flexible (sometimes too flexible)
"5" + 2   // "52"

Here:

  • Number is converted into a string
  • Result becomes string concatenation

This can easily lead to confusion and bugs

Key Observation

All these languages:

  • Handle mixed types
  • Perform conversions

But they differ in:

  • Strictness
  • Safety
  • Predictability

Python vs Other Languages (Type Promotion Comparison)

Here’s where Python Type Promotion stands out:

FeaturePythonC/C++JavaJavaScript
Automatic ConversionYesYesYesYes
Safe Promotion (Widening)StrongModerateStrongWeak
Implicit String ConversionNoNoNoYes
Automatic NarrowingNoSometimesNoYes
PredictabilityHighMediumHighLow (sometimes confusing)
Beginner-FriendlyYesNoModerateConfusing

Why Python’s Approach is Different

Python is designed with a clear philosophy:

“Explicit is better than implicit—but safe implicit behavior is allowed.”

That’s why:

  • It allows Python Type Promotion (safe widening)
  • It avoids automatic narrowing
  • It rejects unsafe operations like int + str

Final Insight

Compared to other languages:

  • Python is stricter than JavaScript
  • Safer than C/C++ in many cases
  • Similar to Java, but more readable and beginner-friendly

This makes Python Type Promotion:

  • Predictable
  • Safe
  • Easy to understand once the hierarchy is clear

Now that you understand how Python compares with other languages, let’s bring the focus back:

What are the situations where Python Type Promotion does NOT work?

In the next section, we’ll explore Where Type Promotion Breaks Down.


Where Python Type Promotion Breaks Down

So far, Python Type Promotion looks smooth and reliable.

  • It automatically converts types
  • It avoids data loss
  • It follows a clear hierarchy

But here’s the reality:

Type promotion does NOT work in every situation.

There are clear boundaries where Python stops and throws an error instead of guessing.


Case 1: Mixing Numeric and Non-Numeric Types

Python’s numeric tower only applies to:

  • bool
  • int
  • float
  • complex

It does not include types like:

  • str
  • list
  • dict

Example:

result_value = 5 + "5"

Output:

TypeError: unsupported operand type(s)

Why It Fails:

  • No safe conversion between int and str
  • Python refuses to guess your intention

Case 2: Operations with Incompatible Types

Even within non-numeric types, not all combinations make sense.

Example:

result_value = [1, 2] + 5

Python doesn’t know:

  • Should it convert 5 into a list?
  • Or convert the list into a number?

So it raises an error.


Case 3: Ambiguous Intent

Sometimes Python could convert—but the result may be misleading.

Example:

value_one = "10"
value_two = "20"

result_value = value_one + value_two
print(result_value)  # "1020"

Here:

  • Python performs string concatenation, not numeric addition

Confusion:

  • You expected 30
  • Python gives "1020"

Why?
Because both values are already strings—no promotion needed.


Case 4: No Logical “Higher Type”

Python Type Promotion only works when:

  • A clear hierarchy exists
  • A safe conversion is possible

If not → Error

Example:

result_value = {1, 2} + {3, 4}

Sets don’t support + operator → no promotion possible


Key Insight

Python type promotion works only when:

Types belong to the numeric hierarchy
A safe widening conversion exists
The operation is logically valid

Otherwise, Python stops execution instead of making unsafe assumptions.


Important Takeaway

Python prefers to throw an error rather than silently do the wrong thing.

This makes Python:

  • More predictable
  • Easier to debug
  • Safer for real-world applications

What Should You Do When Promotion Fails?

Whenever Python cannot promote types:

You must take control using explicit casting

Now that you know where Python Type Promotion breaks down, the next step is:

How to handle these situations properly?

Let’s explore: When You Must Step In With Explicit Casting.


When You Must Step In With Explicit Casting

Now you’ve seen that Python Type Promotion works well—but only within safe and clear boundaries.

When those boundaries are crossed, Python stops and throws an error.

At that point, you must take control.


What Does “Stepping In” Mean?

It means using explicit casting to tell Python exactly:

  • What type you want
  • How the conversion should happen
  • What your intention is

Instead of Python guessing, you define the behavior.


Situation 1: Mixing Numbers with Strings

Problem:

result_value = 5 + "5"

Python cannot promote int and str

Solution:

result_value = 5 + int("5")
print(result_value)  # 10

Why This Works:

  • You explicitly convert "5"5
  • Now both values are numeric
  • Python Type Promotion can proceed normally

Situation 2: Unexpected String Behavior

Problem:

value_one = "10"
value_two = "20"

result_value = value_one + value_two
print(result_value)  # "1020"

Python performs concatenation, not addition

Solution:

result_value = int(value_one) + int(value_two)
print(result_value)  # 30

Why This Works:

  • You convert both values into integers
  • Now Python performs numeric addition

Situation 3: Controlling Precision

Sometimes Python promotes types correctly—but you may want a specific result type.

Example:

result_value = 5 + 2.5
print(type(result_value))  # float

Python promotes to float (correct behavior)

But if you want an integer:

result_value = int(5 + 2.5)
print(result_value)  # 7

You control the final output type


Situation 4: Working with User Input

User input is always received as a string.

Problem:

user_value = input("Enter a number: ")
result_value = user_value + 5

This will cause an error

Solution:

user_value = int(input("Enter a number: "))
result_value = user_value + 5

Explicit casting ensures correct behavior


Key Rule to Remember

Use explicit casting whenever Python cannot safely decide—or when you need full control.


When to Rely on Promotion vs Casting

ScenarioUse Python Type PromotionUse Explicit Casting
Numeric operations (int + float)YesNo need
Mixed numeric & stringNoRequired
User input handlingNoRequired
Precision controlSometimesRecommended
Complex data transformationsNoRequired

Pro Insight

A good Python programmer:

  • Trusts Python Type Promotion for safe operations
  • Uses explicit casting when clarity or control is needed

This balance makes your code:

  • More readable
  • More predictable
  • Easier to debug

Now that you know when to rely on Python Type Promotion and when to use explicit casting, let’s wrap everything up.

Next, we’ll summarize all key concepts in a Quick Recap.


Quick Recap — Python Type Promotion

Let’s quickly summarize everything you’ve learned about Python Type Promotion:

  • Python Type Promotion is the automatic conversion of data types during operations
  • It happens when mixed numeric types are used together
  • Python follows a numeric hierarchy (Numeric Tower)
    • bool → int → float → complex
  • Lower types are promoted to higher types for safe execution
  • This process is also known as implicit type conversion
  • Python only performs widening (safe) conversions
  • Python never performs narrowing automatically to avoid data loss
  • Type promotion works only within numeric types
  • It fails when no safe conversion exists (like int + str)
  • In such cases, you must use explicit casting

One-Line Mental Model

Python Type Promotion always moves data toward a safer, more expressive type—never the other way around.


Visual Summary: Python Type Promotion Quick Recap

A complete visual summary of Python Type Promotion to quickly revise key concepts, hierarchy, and real-world usage.

Python Type Promotion quick recap infographic showing implicit type conversion, numeric hierarchy, and widening behavior

Use this quick recap to reinforce your understanding of Python Type Promotion before applying it in real code.


Conclusion

Python doesn’t promote types randomly. It follows a clear numeric hierarchy — and once you understand that, type conversion stops feeling confusing.

You now know that when int meets float, Python widens. When float meets complex, it widens again. Every automatic conversion you’ve seen is Python trying to preserve information, not guessing behind the scenes.

That’s not magic. That’s smart design.

Unlike stricter languages that force constant manual conversions, Python handles safe promotions quietly and only stops when precision could be lost.

The real skill isn’t memorizing the numeric tower.

It’s knowing when Python handles conversion for you — and when it expects you to step in with explicit casting.

You walked away with:

  • The difference between implicit and explicit conversion
  • Python’s Numeric Tower and type hierarchy
  • Why widening is safe but narrowing needs caution
  • Where Python’s automatic promotion breaks down
  • When explicit casting becomes necessary

The one thing to remember: Python promotes upward to preserve precision. If mixed types ever confuse you, trace them up the numeric tower — the answer is usually there.

Until the next lesson — keep coding, keep questioning, and don’t let implicit behavior stay implicit in your understanding. 🐍


What’s Next?

Now that you’ve understood how Python automatically promotes and converts data types during operations, you can better predict how different types interact behind the scenes.

In the next lesson, you’ll explore Python’s type casting rules in depth. You’ll learn which conversions are safe, which ones can cause data loss or errors, and how to perform predictable type conversions confidently in real programs.

👉 Continue your learning here: Python Type Casting Rules: Complete Guide to Safe and Predictable Conversions



Suggested Posts

  1. Python Type Casting Explained (Type Conversion for Beginners)
  2. Python Type Casting Functions Explained (int, float, complex, bool, str)
  3. Advanced Python Type Casting Functions Explained (list, tuple, set, dict & More)
  4. Python Type Casting Rules: Complete Guide to Safe and Predictable Conversions
  5. Python Type Casting in Real-World Applications: Truthiness, Data Conversion & Safe Casting
  6. Python Type Casting Best Practices: Write Safe, Predictable & Bug-Free Code
  7. Python Type Casting FAQs: Common Conversion Questions, Errors & Confusions Explained

Hi, I’m Ankur, the creator of PyCoderHub. I document my Python learning journey in a structured, beginner-friendly way to make concepts clear and easy to follow.

Each post is carefully researched, cross-checked, and simplified to ensure accurate explanations. If you’re learning Python, you can follow along step by step—and if you’re experienced, your feedback is always welcome.