Beginner basics β everything from your first print() to strings and f-strings. Copy-paste the examples and learn by doing.
Save a file as app.py, then run it. Python runs your code line by line, from the top.
print("Hello, world!")
print("My name is Mosh")
print("Hello") # text (a "string")
print("*" * 10) # ********** (repeat a string)
print("A", "B", "C") # A B C (multiple values)
A variable is a labelled box that stores a value in memory. = assigns a value.
price = 10 # create / set
price = 20 # reset to a new value
print(price) # 20
_ (e.g. first_name), and pick descriptive names. Python is case-sensitive (Price β price).| Type | Example | What it is |
|---|---|---|
int | age = 20 | Whole number |
float | rating = 4.9 | Number with a decimal |
str | name = "Mosh" | Text (a string) |
bool | is_new = True | True / False (capital T/F!) |
name = "Mosh"
age = 20
is_new = True
print(type(age)) # <class 'int'> β check a type
input() shows a prompt and returns whatever the user types β always as a string.
name = input("What is your name? ")
print("Hi " + name) # join strings with +
Because input() gives a string, convert it before doing math.
birth_year = input("Birth year: ")
age = 2026 - int(birth_year) # int() turns "1982" into 1982
print(age)
| Function | Converts to |
|---|---|
int(x) | integer |
float(x) | decimal number |
str(x) | string |
bool(x) | True / False |
"1982" (string) is not the same as 1982 (number). Mixing them gives a TypeError β convert first.| Op | Meaning | Example |
|---|---|---|
+ - * / | add, subtract, multiply, divide | 10 / 3 β 3.33 |
// | integer (floor) division | 10 // 3 β 3 |
% | remainder (modulus) | 10 % 3 β 1 |
** | power | 2 ** 3 β 8 |
Use single or double quotes. Use the other kind when your text contains a quote.
a = 'Python'
b = "Python's course" # ' inside, so use "
c = 'He said "hi"' # " inside, so use '
msg = """Hi John,
Thanks for joining.
The Team""" # triple quotes = multi-line
Characters are numbered from 0. Negative numbers count from the end.
course = "Python for Beginners"
course[0] # 'P' (first char)
course[-1] # 's' (last char)
course[0:3] # 'Pyt' (index 0,1,2 β stop is excluded)
course[1:] # 'ython for Beginners' (to the end)
course[:5] # 'Pytho' (from the start)
course[:] # a full copy of the string
[start:stop] slice includes start, excludes stop. This shows up on a lot of Python tests!Prefix with f and drop variables into { } β much cleaner than joining with +.
first = "John"
last = "Smith"
msg = f"{first} [{last}] is a coder"
print(msg) # John [Smith] is a coder
Methods belong to a value and are called with a dot: course.upper(). They return a new string (the original is unchanged).
course = "Python for Beginners"
len(course) # 20 (length β a general function)
course.upper() # 'PYTHON FOR BEGINNERS'
course.lower() # 'python for beginners'
course.title() # 'Python For Beginners'
course.strip() # remove spaces at the ends
course.find("o") # 4 (index of first match, -1 if none)
course.replace("Beginners", "Pros")
"Python" in course # True (does it contain this?)
These compare two values and produce a boolean (True/False).
| Op | Means | Example |
|---|---|---|
== | equal to | temp == 30 |
!= | not equal | name != "Mosh" |
> >= | greater / or equal | temp > 30 |
< <= | less / or equal | age <= 18 |
== compares, = assigns. temp = 30 sets a value; temp == 30 asks a question.Run code only when a condition is true. The indented block belongs to the if. elif = "otherwise if", else = "otherwise".
temp = 35
if temp > 30:
print("It's a hot day")
print("Drink water")
elif temp < 10:
print("It's a cold day")
else:
print("It's a lovely day")
# Example: down payment depends on credit
price = 1_000_000
has_good_credit = True
if has_good_credit:
down = 0.1 * price # 10%
else:
down = 0.2 * price # 20%
print(f"Down payment: ${down}")
Combine conditions: and (both true), or (at least one true), not (flips TrueβFalse).
if has_high_income and has_good_credit:
print("Eligible for a loan") # both must be True
if has_high_income or has_good_credit:
print("Eligible") # at least one True
if has_good_credit and not has_criminal_record:
print("Eligible") # not False -> True
Repeat a block while a condition stays true. Always change something inside, or you get an infinite loop.
i = 1
while i <= 5:
print(i)
i += 1 # same as i = i + 1
print("Done") # 1 2 3 4 5 Done
break jumps out of a loop early. A while β¦ else runs the else only if the loop finished without a break:
secret = 9
guess_count = 0
guess_limit = 3
while guess_count < guess_limit:
guess = int(input("Guess: "))
guess_count += 1
if guess == secret:
print("You won!")
break
else:
print("Sorry, you failed")
A for loop goes through each item in a collection (a string, a list, a rangeβ¦).
for letter in "Python":
print(letter) # P y t h o n (each on a line)
for name in ["Mosh", "John", "Sarah"]:
print(name)
for i in range(5): # 0 1 2 3 4 (stop excluded)
print(i)
| range() | Produces |
|---|---|
range(5) | 0, 1, 2, 3, 4 |
range(5, 10) | 5, 6, 7, 8, 9 |
range(5, 10, 2) | 5, 7, 9 (step of 2) |
A list holds many values in [ ]. Loop over it to process every item.
prices = [10, 20, 30]
total = 0
for price in prices:
total += price
print(total) # 60
numbers = [3, 6, 2, 8, 4, 10]
max = numbers[0]
for n in numbers:
if n > max:
max = n
print(max) # 10
Operations you can do on a list (call them with a dot):
numbers = [5, 2, 1, 7, 4]
numbers.append(20) # add to the end
numbers.insert(0, 10) # add at an index
numbers.remove(5) # remove a value
numbers.pop() # remove the last item
numbers.clear() # remove everything
numbers.index(7) # position of a value (error if missing)
7 in numbers # True/False β safer existence check
numbers.count(5) # how many times 5 appears
numbers.sort() # sort ascending (in place)
numbers.reverse() # reverse the order
copy = numbers.copy() # an independent copy
numbers = [2, 2, 4, 6, 6, 3, 1]
uniques = []
for n in numbers:
if n not in uniques:
uniques.append(n)
print(uniques) # [2, 4, 6, 3, 1]
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
matrix[0][1] # 2 (row 0, column 1)
matrix[0][1] = 20 # change a cell
for row in matrix: # nested loops
for item in row:
print(item)
Like a list, but immutable β you can't add, remove or change items. Use ( ).
point = (1, 2, 3)
point[0] # 1 (reading is fine)
point[0] = 10 # β TypeError β tuples can't change
# only .count() and .index() are available
Assign several variables from a list/tuple in one line.
coordinates = (1, 2, 3)
x, y, z = coordinates # x=1, y=2, z=3
print(x, y, z)
Store key β value pairs in { }. Keys must be unique.
customer = {
"name": "John Smith",
"age": 30,
"is_verified": True,
}
customer["name"] # 'John Smith'
customer.get("birthdate") # None if missing (no error)
customer.get("birthdate", "N/A") # a default value
customer["name"] = "Jack" # update
customer["phone"] = "1234" # add a new pair
dict[key] errors if the key is missing; dict.get(key, default) is safer. "good morning :)".split(" ") turns a string into a list of words β handy with dictionaries (emoji converters, phone-number spellers, etc.).Group reusable code with def. Define before you call. Parameters are the placeholders; arguments are the values you pass.
def greet_user(first_name, last_name):
print(f"Hi {first_name} {last_name}")
print("Welcome aboard")
greet_user("John", "Smith") # positional args
greet_user(last_name="Smith", first_name="John") # keyword args (order-free)
Use return to send a result back. A function with no return gives None.
def square(number):
return number * number
result = square(3)
print(result) # 9
calculate_cost.Lines starting with # are ignored by Python. Use them to explain why (not what) β and don't overdo it.
# Tax rate assumed at 10% for 2026
price = 100 # base price before tax
A class defines a new type (a blueprint). An object is an instance of it. Class names use PascalCase. Every method's first parameter is self (the current object).
class Point:
def move(self):
print("move")
def draw(self):
print("draw")
point1 = Point() # create an object (instance)
point1.draw() # call a method
point1.x = 10 # attributes = data on the object
print(point1.x) # 10
__init__ runs automatically when you create an object β use it to set up (initialize) attributes so they always exist.
class Person:
def __init__(self, name):
self.name = name # self = this object
def talk(self):
print(f"Hi, I am {self.name}")
john = Person("John Smith") # name is passed to __init__
john.talk() # Hi, I am John Smith
A class can reuse another class's methods by inheriting from it β avoids repeating code (DRY). Use pass for an empty body.
class Mammal:
def walk(self):
print("walk")
class Dog(Mammal): # Dog inherits walk()
def bark(self):
print("bark")
class Cat(Mammal): # Cat inherits walk() too
pass
dog1 = Dog()
dog1.walk() # inherited
dog1.bark() # Dog's own method
A module is just a .py file. Split related functions/classes into modules, then import them.
# converters.py has kg_to_lbs()
import converters
converters.kg_to_lbs(70)
# or import just what you need:
from converters import kg_to_lbs
kg_to_lbs(70) # no prefix needed
A package is a folder of modules (it contains an __init__.py file). Import using dots.
# ecommerce/shipping.py has calculate_shipping()
import ecommerce.shipping
ecommerce.shipping.calculate_shipping()
from ecommerce.shipping import calculate_shipping
from ecommerce import shipping # import the whole module
Python ships with a big standard library. random is one example β no install needed.
import random
random.random() # a float 0.0β1.0
random.randint(1, 6) # whole number 1β6 (like a die)
random.choice(["Jon", "Mary", "Bob"]) # pick a random item
# Dice class that rolls two dice -> a tuple
import random
class Dice:
def roll(self):
return random.randint(1, 6), random.randint(1, 6)
dice = Dice()
print(dice.roll()) # e.g. (3, 5)
Inside an f-string, add : and a format spec to control how a value looks.
pi = 3.14159
name = "Mosh"
f"{pi:.2f}" # '3.14' (2 decimal places)
f"{1000000:,}" # '1,000,000' (thousands commas)
f"{0.25:.0%}" # '25%' (percent)
f"{name:>10}" # right-align in 10 spaces
f"{name:^10}" # center-align
Give a parameter a default so callers can skip it. Pass by name for clarity.
def greet(name, greeting="Hello"): # greeting has a default
print(f"{greeting}, {name}")
greet("Mosh") # Hello, Mosh
greet("Mosh", "Hi") # Hi, Mosh
greet(greeting="Hey", name="Bob") # keyword args (any order)
def add(*numbers): # *args -> a tuple of all positional args
return sum(numbers)
add(1, 2, 3, 4) # 10
def profile(**info): # **kwargs -> a dict of keyword args
print(info)
profile(name="Mosh", age=30) # {'name': 'Mosh', 'age': 30}
Variables made inside a function are local (gone when it ends). Use global to change a top-level variable from inside a function.
total = 0 # global
def add():
global total # without this you'd make a NEW local 'total'
total += 1
A short way to build a list from another sequence β one line instead of a loop.
nums = [1, 2, 3, 4, 5]
squares = [n * n for n in nums] # [1, 4, 9, 16, 25]
evens = [n for n in nums if n % 2 == 0] # [2, 4]
An unordered collection of unique items, in { }. Great for removing duplicates.
s = {1, 2, 3, 3, 2} # {1, 2, 3} (dupes dropped)
s.add(4)
{1, 2, 3} & {2, 3, 4} # {2, 3} intersection
{1, 2} | {3, 4} # {1,2,3,4} union
{1, 2, 3} - {2} # {1, 3} difference
set([1, 1, 2]) # {1, 2} remove duplicates from a list
Catch errors so your program doesn't crash. else runs if there was no error; finally always runs.
try:
age = int(input("Age: "))
print(100 / age)
except ValueError:
print("Please enter a number")
except ZeroDivisionError:
print("Age can't be zero")
else:
print("No errors!")
finally:
print("Done") # always runs
Use with open(...) β it closes the file for you. Modes: "r" read, "w" write (overwrites), "a" append.
with open("notes.txt", "w") as f:
f.write("Hello\n")
f.write("Second line\n")
with open("notes.txt", "r") as f:
content = f.read() # whole file as one string
# for line in f: print(line) # or line by line
A clean alternative to a long if / elif chain.
command = "start"
match command:
case "start":
print("Startingβ¦")
case "stop":
print("Stoppingβ¦")
case _: # _ = anything else (default)
print("Unknown command")
Special methods named with double underscores let your objects work with built-in syntax (printing, ==, etc.).
class Point:
def __init__(self, x):
self.x = x
def __str__(self): # controls print(p)
return f"Point({self.x})"
def __eq__(self, other): # controls p1 == p2
return self.x == other.x
p = Point(5)
print(p) # Point(5)
print(p == Point(5)) # True
Beyond the standard library, install packages from PyPI with pip (run in your terminal, not in Python).
pip install openpyxl
pip install pandas scikit-learn jupyter
Read a spreadsheet, change values, and save β perfect for boring repetitive tasks across thousands of files.
import openpyxl as xl
from openpyxl.chart import BarChart, Reference
wb = xl.load_workbook("transactions.xlsx")
sheet = wb.active # or wb["Sheet1"]
cell = sheet.cell(1, 1) # row 1, col 1 (or sheet["a1"])
print(cell.value)
for row in range(2, sheet.max_row + 1): # skip header row 1
price = sheet.cell(row, 3).value
corrected = price * 0.9 # 10% off
sheet.cell(row, 4).value = corrected # write into a new column
wb.save("transactions2.xlsx")
values = Reference(sheet, min_row=2, max_row=sheet.max_row, min_col=4, max_col=4)
chart = BarChart()
chart.add_data(values)
sheet.add_chart(chart, "e2") # top-left corner of the chart
process_workbook(filename) function, then loop over every file in a folder to update thousands of spreadsheets in seconds.The ML workflow: import β prepare β train β predict. Example: predict the music genre someone likes from their age & gender.
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
# 1. import data (a CSV -> a DataFrame, like a spreadsheet)
music = pd.read_csv("music.csv")
music.shape # (rows, columns)
music.describe() # quick stats per column
# 2. prepare: split into input (X) and output (y)
X = music.drop(columns=["genre"]) # everything except the answer
y = music["genre"] # the answer column
# 3. build & train a model
model = DecisionTreeClassifier()
model.fit(X, y)
# 4. predict (21-yr-old male, 22-yr-old female)
predictions = model.predict([[21, 1], [22, 0]])
print(predictions) # e.g. ['HipHop' 'Dance']
print() to OOP, modules, automation and machine learning. You're ready to build real things! Bookmark this page and come back whenever you need a quick reminder.