Learn Python Programming

Start with getting started, installation, and core basics. Clear explanations and practical examples to help you learn faster.

Python Custom Exceptions

Custom exceptions let you define meaningful error types specific to your application. They make error handling clearer and help callers understand what went wrong.

Creating Basic Custom Exceptions

# Simplest custom exception — inherit from Exception
class ValidationError(Exception):
    pass

class NotFoundError(Exception):
    pass

# Raise and catch custom exceptions
def find_user(user_id):
    users = {1: "Alice", 2: "Bob"}
    if user_id not in users:
        raise NotFoundError(f"User {user_id} not found")
    return users[user_id]

try:
    user = find_user(99)
except NotFoundError as e:
    print(e)  # User 99 not found

Custom Exceptions with Extra Data

# Add attributes to carry context about the error
class ValidationError(Exception):
    def __init__(self, field, message, value=None):
        self.field = field
        self.message = message
        self.value = value
        super().__init__(f"{field}: {message}")

    def to_dict(self):
        return {"field": self.field, "error": self.message, "value": self.value}

# Usage
def validate_age(age):
    if not isinstance(age, int):
        raise ValidationError("age", "Must be an integer", age)
    if age < 0 or age > 150:
        raise ValidationError("age", "Must be between 0 and 150", age)
    return age

try:
    validate_age(-5)
except ValidationError as e:
    print(e)           # age: Must be between 0 and 150
    print(e.field)     # age
    print(e.value)     # -5
    print(e.to_dict()) # {"field": "age", "error": "Must be...", "value": -5}

Exception Hierarchies

# Create a hierarchy for your application
class AppError(Exception):
    """Base exception for the application."""
    pass

class DatabaseError(AppError):
    """Database-related errors."""
    pass

class ConnectionError(DatabaseError):
    """Cannot connect to database."""
    pass

class QueryError(DatabaseError):
    """Invalid or failed query."""
    pass

class AuthError(AppError):
    """Authentication/authorization errors."""
    pass

class InvalidCredentialsError(AuthError):
    pass

class PermissionDeniedError(AuthError):
    pass

# Catch at different levels of specificity
try:
    authenticate(user, password)
except InvalidCredentialsError:
    print("Wrong username or password")
except AuthError:
    print("Authentication failed")
except AppError:
    print("Application error occurred")

Practical Example: API Service

# Real-world pattern for a web service
class APIError(Exception):
    """Base API exception with HTTP status code."""
    status_code = 500

    def __init__(self, message, details=None):
        self.message = message
        self.details = details or {}
        super().__init__(message)

    def to_response(self):
        return {
            "error": type(self).__name__,
            "message": self.message,
            "details": self.details,
        }

class BadRequestError(APIError):
    status_code = 400

class UnauthorizedError(APIError):
    status_code = 401

class NotFoundError(APIError):
    status_code = 404

class RateLimitError(APIError):
    status_code = 429

    def __init__(self, retry_after=60):
        self.retry_after = retry_after
        super().__init__(f"Rate limit exceeded. Retry after {retry_after}s")

# Usage in request handler
def get_user(user_id):
    if not is_authenticated():
        raise UnauthorizedError("Login required")
    user = db.find_user(user_id)
    if user is None:
        raise NotFoundError(f"User {user_id} not found")
    return user

try:
    user = get_user(42)
except APIError as e:
    response = e.to_response()
    response["status"] = e.status_code
    print(response)

Exception Chaining

# Use "from" to chain exceptions — preserves the original cause
class ConfigError(Exception):
    pass

def load_config(path):
    try:
        with open(path) as f:
            import json
            return json.load(f)
    except FileNotFoundError as e:
        raise ConfigError(f"Config file missing: {path}") from e
    except json.JSONDecodeError as e:
        raise ConfigError(f"Invalid JSON in {path}") from e

try:
    config = load_config("settings.json")
except ConfigError as e:
    print(e)            # Config file missing: settings.json
    print(e.__cause__)  # [Errno 2] No such file or directory: ...
  • Always inherit from Exception (not BaseException) for custom exceptions.
  • Add attributes to carry context (field names, error codes, values) with the exception.
  • Create exception hierarchies so callers can catch at the appropriate level of specificity.
  • Use raise ... from original to chain exceptions and preserve the root cause.
  • Name exceptions ending in Error to follow Python conventions.

Frequently Asked Questions

Answers to common Python getting-started questions

You can use an online Python editor that runs in your browser. It provides a Python interpreter so you can execute code instantly without setup. This is ideal for quick practice and learning.

Download the latest Python installer from the official Python website, run the installer, and select "Add python.exe to PATH" before clicking "Install Now". After installation, verify with the command: python --version.

Download the macOS installer from the Python website, run it, and follow the steps. Verify the installation with python3 --version in the Terminal. macOS often uses python3 to refer to Python 3.

Open your terminal or command prompt and run python --version (Windows) or python3 --version (macOS/Linux). If you see a version number, Python is installed correctly.

On macOS and Linux, python may refer to Python 2.x while python3 refers to Python 3.x. Use python3 to ensure you are running Python 3.

Yes. Python runs on Windows, macOS, and Linux. Code is generally portable across platforms, especially for beginner-level scripts.

Python Programming Tutorial — Learn Python from Scratch

Python is the world's most popular programming language for beginners, data science, AI/ML, web development, and automation. This tutorial teaches Python step-by-step with clear explanations and runnable code examples. You can try every example in our free Python Compiler without installing anything.

Each topic builds on the previous one, starting from installation and Hello World through advanced concepts like decorators, generators, and file I/O. Whether you are a complete beginner or refreshing specific skills, every page gives you immediately usable code.

What This Tutorial Covers

  • Getting Started: Install Python, run online, Hello World
  • Basics: Variables, data types, type conversion, input/output
  • Operators: Arithmetic, comparison, logical, assignment
  • Control Flow: if/elif/else, for loops, while, break/continue
  • Data Structures: Lists, tuples, sets, dictionaries
  • Strings: Methods, slicing, formatting, f-strings
  • Functions: Parameters, return values, *args, **kwargs, scope
  • OOP: Classes, objects, inheritance, polymorphism
  • File I/O: Reading, writing, CSV, JSON handling
  • Exceptions: try/except, custom exceptions, raise
  • Advanced: List comprehensions, lambda, generators, decorators
  • Modules: import, pip, packages, __name__ == "__main__"

Why Learn Python in 2026?

  • #1 most popular language: Ranked first on TIOBE, Stack Overflow, and GitHub for multiple years running.
  • AI and Data Science: The primary language for machine learning (TensorFlow, PyTorch, scikit-learn), data analysis (Pandas, NumPy), and AI development.
  • Web development: Django and Flask power backends at companies like Instagram, Spotify, and Pinterest.
  • Automation: Automate files, emails, web scraping, reports, and system administration tasks in minutes.
  • Beginner-friendly: Clean syntax with enforced indentation makes code readable from day one — no curly braces or semicolons.
  • Massive job market: Python developers are in high demand across tech, finance, healthcare, and research.

Python vs Other Languages

FeaturePythonJavaJavaScriptC++
SyntaxVery clean, readableVerboseModerateComplex
TypingDynamic, strongStatic, strongDynamic, weakStatic, strong
SpeedSlower (interpreted)Fast (JIT)Fast (V8 JIT)Fastest (native)
Best ForAI/ML, data, automationEnterprise, AndroidWeb frontend/backendSystems, games
Learning Time2–4 weeks basics4–6 weeks basics3–4 weeks basics8–12 weeks basics

How to Get Started

  1. Run Python online: Use our free Python Compiler — no installation needed.
  2. Install locally: Download Python 3 from python.org (Windows/Mac) or use apt install python3 (Linux).
  3. Verify: Run python3 --version in your terminal to confirm installation.
  4. Choose an editor: VS Code with Python extension (free), PyCharm Community (free), or Jupyter Notebook for data science.
  5. Follow this tutorial in order: Start from Introduction and work through each topic sequentially.

Frequently Asked Questions

Do I need prior programming experience?

No. Python is designed to be beginner-friendly. This tutorial starts from absolute zero and builds up gradually.

Which Python version should I use?

Python 3.10+ is recommended. Python 2 reached end-of-life in 2020. All examples in this tutorial use Python 3 syntax.

How long does it take to learn Python?

Basics (syntax, loops, functions) take 2–4 weeks. Intermediate (OOP, file I/O, modules) adds 3–4 weeks. Specialisation (Django, data science, ML) takes another 2–3 months.

Is this tutorial free?

Yes, completely free. No account, no sign-up. All topics and examples available without restriction.

Who Is This For?

Complete beginners choosing their first programming language. Students in CS courses needing a Python reference. Data analysts transitioning from Excel to Python (Pandas). Self-taught developers adding Python to their skill set. Professionals automating repetitive tasks. Anyone preparing for Python coding interviews.