Skip to main content

2.1 - Variables and Data Types

2.1.1 - Variables

In Python, variables are used to store and manipulate data. A variable is a named location in memory that can hold a value. You can assign a value to a variable using the assignment operator (=). For example:

x = 5

In this case, we have assigned the value 5 to the variable x. Variables can store different types of data, such as numbers, strings, booleans, and more.


2.1.2 - Data Types

Python supports various built-in data types that define the nature of the values stored in variables. Understanding these data types is essential for effective programming. The commonly used data types in Python can be categorized into primitive data types and sequence data types.

2.1.2.1 - Primitive Data Types

Primitive data types are basic data types that are not built from other data types. They represent fundamental values and are immutable, meaning their values cannot be changed after creation.

Data TypeExampleUsage
Integernum = 10Used to store whole numbers
Floatdecimal = 10.5Used to store decimal numbers
Stringmessage = "Hello World!"Used to store text
Booleanchecker = TrueUsed to store true or false values
Complexcomp_num = 1 + 2jUsed to store complex numbers

2.1.2.2 - Sequence Data Types

Sequence data types are used to store collections of items. They can be mutable or immutable, depending on whether their elements can be changed after creation. Sequence data types include lists, tuples, ranges, dictionaries, sets, and frozensets.

Sequence TypeExampleMutableOrderedAllows DuplicatesAllows Mixed TypesIndexingSlicingConcatenation
list[1, 2, 3]YesYesYesYesYesYesYes
tuple(1, 2, 3)NoYesYesYesYesYesYes
rangerange(0, 3)NoYesNoNoYesYesNo
set{1, 2, 3}YesNoNoYesNoNoNo
frozensetfrozenset([1, 2, 3])NoNoNoYesNoNoNo
dictionary{'a': 1, 'b': 2}YesYesNoNoYes (keys)NoNo

2.1.3 - Variable Naming Rules

When naming variables in Python, you need to follow certain rules:

  • Variable names must start with a letter or an underscore (_).
  • Variable names can contain letters, numbers, and underscores.
  • Variable names are case-sensitive, so age, Age, and AGE are different variables.
  • Avoid using reserved keywords, such as if, for, or while, as variable names.

2.1.4 - Constant Variables

In Python, unlike some other programming languages, there isn't a built-in type specifically designed for constant variables. Nevertheless, the use of constants—values that do not change during the program's execution—is a common and beneficial practice. This section explores various methods to define constants in Python and outlines some best practices for their usage.

2.1.4.1 - What is a Constant?

A constant is a variable with a value that remains unchanged throughout the lifetime of the program. Unlike languages such as C and Java, where constants are a core concept, Python requires developers to use conventions and external tools to manage constants effectively.

2.1.4.2 - Defining Constants in Python

Python does not provide built-in support for constants, so programmers typically use naming conventions and specific modules to designate and handle constants.

2.1.4.2.1 - Using Naming Conventions

The most widespread method to define constants in Python is by using all-uppercase letters for variable names. This convention signals that these variables are constants and should not be modified:

PI = 3.14159
MAX_SIZE = 100
URL = 'https://www.example.com'

Employing uppercase names is an effective strategy to indicate immutability in Python.

2.1.4.2.2 - Using the final Decorator in Typing (Python 3.8+)

Introduced in Python 3.8, the final decorator from the typing module is another tool for handling constants. It can prevent subclasses from overriding attributes or methods:

from typing import final

@final
class MyConstants:
PI = 3.14159
MAX_SIZE = 100

# Any attempt to override these in a subclass would raise a typing error (detected by type checkers, not at runtime)

It's important to note that final is a guideline enforced by static type checkers and does not prevent changes at runtime.

2.1.4.2.3 - Using External Libraries

For stricter enforcement of immutability, you can use libraries such as pydantic which provide options to ensure variables remain constant:

from pydantic import BaseModel, Field

class Config(BaseModel):
PI: float = Field(default=3.14159, const=True)
MAX_SIZE: int = Field(default=100, const=True)

config = Config()
# Attempting to change the value of PI would result in a validation error

2.1.4.3 - Best Practices for Using Constants in Python

  1. Descriptive Naming: Use clear, descriptive names for constants to improve code readability and maintainability.
  2. Centralize Constants: Store constants in a dedicated file, such as constants.py, to simplify modifications and usage across various parts of your project.
  3. Document Their Use: Provide comments or docstrings to explain the purpose of your constants, especially when their names do not convey enough information.
  4. Leverage Type Annotations: Specify types through annotations to enhance code quality and readability.
  5. Ensure Immutability: Prefer immutable data types for constants to avoid accidental changes and consider using defensive programming techniques to enforce immutability.
  6. Use Protective Libraries: When necessary, utilize libraries like pydantic to enforce non-modifiability of data structures at runtime.

Practical Example:

Here is an example demonstrating how to organize and use constants in a Python module:

# constants.py
from typing import final

@final
class AppSettings:
DEBUG_MODE = False
DB_CONNECTION_STRING = "dbname=myapp user=gouser password=secret host=127.0.0.1"
API_KEY = "abcdef123456"

# usage.py
from constants import AppSettings

def connect_to_database():
if AppSettings.DEBUG_MODE:
print("Debug mode is on. Using a safe test database.")
else:
print("Connecting to production database.")

connect_to_database()

By following these guidelines, you can manage constants in Python effectively, enhancing your code's security and maintainability.


2.1.5 - Type Conversion

Python provides built-in functions for converting variables from one data type to another. Here's a table showcasing some commonly used type conversion functions:

FunctionDescriptionExample
int()Converts a value to an integer.int(5.7) returns 5
float()Converts a value to a floating-point number.float(10) returns 10.0
str()Converts a value to a string.str(42) returns '42'
bool()Converts a value to a boolean.bool(0) returns False
list()Converts an iterable to a list.list((1, 2, 3)) returns [1, 2, 3]
tuple()Converts an iterable to a tuple.tuple([1, 2, 3]) returns (1, 2, 3)
set()Converts an iterable to a set.set([1, 2, 3]) returns {1, 2, 3}
dict()Converts a sequence of key-value pairs to a dictionary.dict([('name', 'John'), ('age', 25)]) returns {'name': 'John', 'age': 25}
frozenset()Converts an iterable to a frozenset.frozenset({1, 2, 3, 4, 5}) returns frozenset({1, 2, 3, 4, 5})

2.1.6 - Summary

Understanding variables and data types is fundamental in Python programming. Variables allow you to store and manipulate data, while data types define the nature of the values stored in those variables. Python provides various built-in data types, including primitive data types (such as integers, floats, strings, booleans, and complex numbers) and sequence data types (such as lists, tuples, ranges, dictionaries, sets, and frozensets). Each data type has its own characteristics and supports specific operations.

When naming variables, follow the naming rules and choose meaningful names that reflect the purpose of the variable. Additionally, Python offers type conversion functions to convert variables from one data type to another when necessary.

By mastering variables and data types in Python, you gain the ability to work with different kinds of data and harness the full power of the language in your coding endeavors.