This blog explains the Python basics every fresher should understand: variables, readability, operators, data types, loops, functions, collections, and object-oriented programming. It is written in a simple learning path, with theory first and a practical Python example after each concept
What Is a Programming Language?
A programming language is a language used to give instructions to a computer. The computer converts those instructions into actions such as displaying output, storing data, or controlling hardware.
Why Python?
- Python is easy to read and learn.
- It is a high-level, general-purpose language.
- It supports web apps, desktop apps, automation, data science, AI, and ML.
- It has many built-in libraries and a large community.
Variables and Readability
A variable is a named container used to store a value.
age = 25
name = "Arun"
price = 99.50
is_active = True
Readability means writing code that another person can easily understand.
# Bad
x = 25
# Good
student_age = 25
Use meaningful names, lowercase words with underscores, and avoid single-letter names except in small loops.
_name vs __name
Python does not have true private variables like Java or C++. Instead, underscores communicate intent.
| Syntax | Name | Meaning |
|---|---|---|
| name | Public | Anyone can use it |
| _name | Protected / internal | “Do not use this outside the class”; only a convention |
| __name | Name-mangled | Python changes it internally to ClassName_name |
| name | Dunder | Reserved for Python’s special methods, such as init |
class Student:
def __init__(self):
self.name = "Arun" # public
self._marks = 90 # internal use
self.__password = "1234" # name-mangled
s = Student()
print(s.name) # Arun
print(s._marks) # 90
# print(s.__password) # AttributeError
print(s._Student__password) # 1234
__name is not ** “strictly private”** in the security sense. Python performs name mangling, making accidental access harder, but the value can still be reached using the changed name.
Reserved Words
Reserved words are words already used by Python for a special meaning. You cannot use them as variable names.
Examples: if, else, while, for, def, class, return, import, True, False, None.
- if means: run this block only when a condition is true
- while means: repeat this block while a condition is true
if age >= 18:
print("Adult")
while count < 5:
print(count)
count += 1
Operators
Operators perform operations on values.
| Operator | Example | Result |
|---|---|---|
| + | 5 + 2 | 7 |
| - | 5 - 2 | 3 |
| * | 5 * 2 | 10 |
| / | 5 / 2 | 2.5 |
| // | 5 // 2 | 2 |
| % | 5 % 2 | 1 |
| ** | 5 ** 2 | 25 |
- Floor division (//) removes the decimal part.
- Exponential operator (*) means power: 5 * 2 is =25.
- Python does not have a separate “concat operator”; + is used to join strings.
print(7 // 2) # 3
print(7 % 2) # 1
print(2 ** 3) # 8
print("Py" + "thon") # Python
Data Types
Python has built-in data types such as:
age = 25 # int
price = 99.5 # float
name = "Python" # str
is_active = True # bool
items = [1, 2, 3] # list
point = (10, 20) # tuple
ids = {1, 2, 3} # set
user = {"name": "Arun"} # dictionary
Why Python Does Not Use “Primitive” and “Non-Primitive” Like Java
In languages such as Java, int, char, and boolean are primitive types, while objects are non-primitive.
In Python, everything is an object, including numbers and strings. So Python does not separate data into primitive and non-primitive types in the same way as Java.
print(type(10)) # <class 'int'>
print(type("hello")) # <class 'str'>
Collections: List, Tuple, Set, Dictionary
| Collection | Syntax | Ordered? | Mutable? | Allows duplicates? |
|---|---|---|---|---|
| List | [1, 2, 3] | Yes | Yes | Yes |
| Tuple | (1, 2, 3) | Yes | No | Yes |
| Set | {1, 2, 3} | No | Yes | No |
| Dictionary | {"a": 1} | Insertion order | Yes | Keys must be unique |
fruits = ["apple", "banana", "mango"]
fruits.append("orange")
print(fruits)
coordinates = (10, 20)
# coordinates[0] = 30 # Error: tuple cannot change
unique_ids = {101, 102, 103}
unique_ids.add(104)
student = {"name": "Arun", "age": 21}
print(student["name"])
Useful List Methods
numbers = [10, 20, 30]
numbers.append(40) # Add at end
numbers.insert(1, 15) # Add at index 1
numbers.remove(20) # Remove value 20
numbers.pop() # Remove last item
numbers.sort() # Sort ascending
numbers.reverse() # Reverse order
print(len(numbers)) # Count items
Set pop() and Ordering
A set is unordered, so it does not maintain index positions like a list. pop() removes and returns an arbitrary element; you cannot reliably predict which one it removes.
numbers = {10, 20, 30}
removed = numbers.pop()
print(removed)
print(numbers)
range() Function
range() generates a sequence of numbers. It is commonly used with for loops.
for i in range(5):
print(i) # 0 1 2 3 4
for i in range(2, 10, 2):
print(i) # 2 4 6 8
range(start, stop, step) starts at start, stops before stop, and increases by step.
Logic: print(0 > -1)
print(0 > -1)
Output:
True
Why? On the number line, 0 is greater than -1. Python compares the values and returns a Boolean result: True or False.
Bitwise Operators
Bitwise operators work directly on the binary representation of integers.
| Operator | Name | Example |
|---|---|---|
| & | AND | 5 & 3 |
| \\ | OR | |
| ^ | XOR | 5 ^ 3 |
| ~ | NOT / complement | ~5 |
| << | Left shift | 5 << 1 |
| >> | Right shift | 5 >> 1 |
print(bin(5)) # 0b101
print(5 & 3) # 1
print(5 | 3) # 7
print(5 ^ 3) # 6
print(5 << 1) # 10
print(5 >> 1) # 2
bin() **converts an integer into its binary string form. It is useful when learning bits, masks, permissions, and low-level logic.
**MSB, Signed, and Unsigned Integers
- MSB means Most Significant Bit.
- In binary, the leftmost bit is usually the MSB.
- In signed integers, the MSB can represent the sign: 0 for positive and 1 for negative in fixed-width systems.
- Unsigned integers use all bits for value, so they cannot represent negative numbers.
Example using 4 bits:
0111 = 7
1111 = 15 in unsigned
1111 = -1 in signed two's complement
Two’s Complement
Two’s complement is the common method computers use to store negative integers.
To get -5 in 8-bit two’s complement:
5 = 00000101
Invert = 11111010
Add 1 = 11111011
So -5 is stored as 11111011.
User Input and Casting
input() always returns a string. Casting means converting one data type into another.
age = input("Enter your age: ") # String
age = int(age) # Convert to integer
price = float("99.5")
number = str(100)
Casting is needed because you cannot perform mathematical operations directly on string input.
# Wrong
# age = input("Age: ")
# print(age + 1) # Error
# Correct
age = int(input("Age: "))
print(age + 1)
Conditional Statements
marks = 75
if marks >= 90:
print("Grade A")
elif marks >= 75:
print("Grade B")
else:
print("Need improvement")
Loops: for, while, break, continue, pass
Python has for and while loops. It does not have a traditional do-while loop.
# for loop
for i in range(1, 6):
print(i)
# while loop
count = 1
while count <= 5:
print(count)
count += 1
- break stops the loop immediately.
- continue skips the current iteration and moves to the next one.
- pass does nothing; it is used as a placeholder.
for i in range(1, 6):
if i == 3:
continue # Skip 3
if i == 5:
break # Stop at 5
print(i)
Even or Odd Logic
number = int(input("Enter a number: "))
if number % 2 == 0:
print("Even number")
else:
print("Odd number")
% gives the remainder. If a number divided by 2 has remainder 0, it is even.
Functions: Parameters, Arguments, Return
A parameter is the variable in the function definition. An argument is the actual value passed when calling the function.
def add(a, b): # a and b are parameters
return a + b
result = add(5, 3) # 5 and 3 are arguments
print(result) # 8
return sends a value back to the caller and ends the function.
Method Overloading vs Method Overriding
| Concept | Meaning |
|---|---|
| Method overloading | Same method name with different parameter versions |
| Method overriding | Child class replaces a method inherited from the parent class |
Python** does not support traditional method overloading** directly. The last defined method with the same name replaces the previous one. You can handle different argument counts using default values.
class Animal:
def sound(self):
print("Some sound")
class Dog(Animal):
def sound(self): # Overriding
print("Bark")
Dog().sound() # Bark
Classes and Objects
A class is a blueprint. An object is a real instance created from that blueprint.
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print(f"My name is {self.name} and I am {self.age} years old.")
s1 = Student("Arun", 21)
s1.introduce()
Why self Is Used
self represents the current object. When you call s1.introduce(), Python automatically passes s1 as self.
If you forget self in an instance method, Python will treat the first argument as the object, causing an error when you pass arguments.
# Wrong
# def introduce(name):
# print(name)
# Correct
def introduce(self):
print(self.name)
Constructor and Destructor
A constructor is a special method that runs automatically when an object is created. In Python, it is init().
class Student:
def __init__(self, name):
print("Constructor called")
self.name = name
s = Student("Arun") # Constructor runs here
A destructor is del(). It is called when an object is about to be destroyed, but Python manages object cleanup automatically, so beginners should not depend on it for important work.
class Student:
def __del__(self):
print("Object deleted")
Instance Variable vs Class Variable
| Type | Defined using | Belongs to |
|---|---|---|
| Instance variable | self.variable | One object |
| Class variable | Directly inside class | All objects of the class |
class Student:
school = "ABC School" # Class variable
def __init__(self, name):
self.name = name # Instance variable
s1 = Student("Arun")
s2 = Student("Bala")
print(s1.school) # ABC School
print(s2.school) # ABC School
print(s1.name) # Arun
print(s2.name) # Bala
Types of Class Methods
Python has three common method types:
| Method type | Decorator | First argument | Used for |
|---|---|---|---|
| Instance method | None | self | Work with object data |
| Class method | @classmethod | cls | Work with class-level data |
| Static method | @staticmethod | No automatic first argument | Utility logic |
class Student:
school = "ABC School"
def instance_method(self):
print("Uses object:", self.name)
@classmethod
def class_method(cls):
print("Uses class:", cls.school)
@staticmethod
def static_method(a, b):
return a + b
Exception Handling
Exception handling prevents a program from crashing when an error occurs.
try:
number = int(input("Enter a number: "))
print(10 / number)
except ZeroDivisionError:
print("Cannot divide by zero")
except ValueError:
print("Please enter a valid number")
finally:
print("Program finished")
- try contains risky code.
- except handles the error.
- finally always runs.
Top comments (0)