Python Cơ Bản

1. Ngôn ngữ lập trình là gì?

1.1. Ngôn ngữ bậc cao (High-level Language)

Ngôn ngữ lập trình bậc cao là những ngôn ngữ được thiết kế để gần gũi với ngôn ngữ tự nhiên của con người hơn là mã máy (machine code). Đặc điểm chính:

  • Dễ đọc, dễ viết: Cú pháp giống tiếng Anh.
  • Trừu tượng hóa phần cứng: Lập trình viên không cần lo lắng về quản lý bộ nhớ hay thanh ghi CPU.
  • Đa năng: Dùng để viết web, app, xử lý dữ liệu, AI...

1.2. Giới thiệu về Python

Python là một ví dụ điển hình của ngôn ngữ bậc cao. Nó được Guido van Rossum ra mắt năm 1991 với triết lý: "Code phải dễ đọc".

# Python dễ đọc như tiếng Anh
print("Xin chào, thế giới!")

Python được dùng rộng rãi trong: Trí tuệ nhân tạo (AI) Phát triển Web Phân tích dữ liệu

2. Biến và Lệnh Gán

2.1. Biến là gì?

Hãy tưởng tượng biến giống như một chiếc hộp có dán nhãn để chứa dữ liệu. Bạn có thể cất dữ liệu vào đó và lấy ra sử dụng sau này thông qua tên nhãn.

2.2. Lệnh Gán (Assignment Statement)

Trong Python, chúng ta dùng dấu bằng = để gán giá trị cho biến.
Cú pháp: tên_biến = giá_trị

ten = "CodeHub"       # Gán chuỗi "CodeHub" cho biến 'ten'
tuoi = 20             # Gán số 20 cho biến 'tuoi'
diem_so = 8.5         # Gán số thực 8.5 cho biến 'diem_so'

# In giá trị ra màn hình
print(ten)            # Kết quả: CodeHub

2.3. Quy tắc đặt tên biến

  • Chỉ chứa chữ cái (a-z, A-Z), số (0-9) và dấu gạch dưới (_).
  • Không được bắt đầu bằng số. (Ví dụ: 1ten là sai).
  • Phân biệt chữ hoa chữ thường (age khác Age).
  • Nên dùng snake_case (viết thường, nối bằng gạch dưới) cho dễ đọc. Ví dụ: ho_va_ten.

2.4. Kiểu dữ liệu động (Dynamic Typing)

Khác với C++ hay Java, trong Python bạn không cần khai báo kiểu dữ liệu. Python tự hiểu kiểu dữ liệu dựa trên giá trị bạn gán.

3. Các lệnh Vào/Ra đơn giản

3.1. Lệnh Xuất (Output) - print()

Hàm `print()` dùng để in thông tin ra màn hình. Bạn có thể in chuỗi, số, hoặc giá trị của biến.

print("Xin chào!")        # In chuỗi
print(123)                # In số
print(ten_bien)           # In giá trị biến
print("Tuổi:", 20)        # In nhiều giá trị (cách nhau bởi dấu phẩy)

3.2. Lệnh Nhập (Input) - input()

Hàm `input()` dùng để lấy dữ liệu từ bàn phím. Nó luôn trả về dữ liệu kiểu chuỗi (string).
Mẹo: Nếu muốn nhập số, bạn cần chuyển đổi kiểu dữ liệu (ép kiểu).

# Nhập tên (Chuỗi)
ten = input("Nhập tên của bạn: ")
print("Xin chào " + ten)

# Nhập tuổi (Chuyển sang số nguyên)
tuoi = int(input("Nhập tuổi: ")) 
print("Năm sau bạn sẽ", tuoi + 1, "tuổi")

4. Câu lệnh rẽ nhánh (Conditionals)

Câu lệnh if giúp chương trình đưa ra quyết định dựa trên điều kiện đúng (True) hoặc sai (False).

4.1. Cấu trúc if - else

diem = 8
if diem >= 5:
    print("Đậu")
else:
    print("Rớt")

4.2. Cấu trúc if - elif - else

Sử dụng elif (viết tắt của else if) khi có nhiều hơn 2 trường hợp.

diem = 7.5
if diem >= 9:
    print("Xuất sắc")
elif diem >= 7:
    print("Khá")
elif diem >= 5:
    print("Trung bình")
else:
    print("Yếu")

5. Vòng lặp For (For Loop)

Vòng lặp for dùng để lặp qua một tập hợp dữ liệu (như danh sách) hoặc một khoảng số nhất định.

5.1. Hàm range()

Hàm range(n) tạo ra một dãy số từ 0 đến n-1.

# In các số từ 0 đến 4
for i in range(5):
    print(i)

5.2. Lặp qua danh sách

trai_cay = ["Táo", "Chuối", "Cam"]

for qua in trai_cay:
    print("Tôi thích ăn " + qua)

6. Vòng lặp While (While Loop)

Vòng lặp while sẽ tiếp tục chạy miễn là điều kiện còn đúng (True).

dem = 0
while dem < 3:
    print("Đang chạy lần thứ", dem)
    dem = dem + 1  # Tăng biến đếm để tránh lặp vô hạn

7. Danh sách (List)

List là một kiểu dữ liệu dùng để lưu trữ nhiều giá trị trong một biến duy nhất. Các phần tử trong list được sắp xếp theo thứ tự và có thể thay đổi được.

7.1. Khởi tạo List

Sử dụng cặp ngoặc vuông [] để tạo list.

ds_so = [1, 2, 3, 4, 5]
ds_ten = ["An", "Bình", "Chi"]
ds_hon_hop = [1, "An", True, 3.14]

7.2. Truy cập phần tử

Các phần tử được đánh chỉ số từ 0.

trai_cay = ["Táo", "Cam", "Xoài"]
print(trai_cay[0])  # In ra "Táo"
print(trai_cay[2])  # In ra "Xoài"

7.3. Các thao tác cơ bản

  • Thêm phần tử: list.append(giá_trị)
  • Sửa phần tử: list[chỉ_số] = giá_trị_mới
  • Độ dài list: len(list)
ds_mon = ["Toán", "Lý"]
ds_mon.append("Hóa")      # Danh sách giờ là ["Toán", "Lý", "Hóa"]
ds_mon[0] = "Văn"         # Danh sách giờ là ["Văn", "Lý", "Hóa"]
print(len(ds_mon))        # In ra 3

7.4. Các phương thức phổ biến khác

Lệnh Mô tả Ví dụ
insert(i, x) Chèn x vào vị trí i list.insert(1, "Sử")
remove(x) Xóa phần tử mang giá trị x list.remove("Lý")
pop(i) Xóa và lấy phần tử ở vị trí i list.pop(0)
sort() Sắp xếp danh sách list.sort()
in Kiểm tra tồn tại if "Toán" in list:

8. Xâu ký tự (String)

String là một chuỗi các ký tự được bao quanh bởi dấu ngoặc đơn ' hoặc ngoặc kép ".

8.1. Khai báo và Truy cập

Tương tự như List, bạn có thể truy cập từng ký tự trong chuỗi bằng chỉ số (index).

chuoi = "Hello Python"
print(chuoi[0])      # In ra "H"
print(chuoi[6])      # In ra "P"
print(len(chuoi))    # Độ dài chuỗi là 12

8.2. Các phương thức phổ biến

Lệnh Mô tả Ví dụ (s = " Hello ")
lower() Chữ thường s.lower() -> " hello "
upper() Chữ hoa s.upper() -> " HELLO "
strip() Xóa khoảng trắng đầu/cuối s.strip() -> "Hello"
replace(old, new) Thay thế chuỗi s.replace("e", "a") -> " Hallo "
split(sep) Tách chuỗi thành List "a,b".split(",") -> ["a", "b"]
join(list) Nối List thành chuỗi "-".join(["a", "b"]) -> "a-b"
find(x) Tìm vị trí đầu tiên của x s.find("lo") -> 3
count(x) Đếm số lần xuất hiện của x s.count("l") -> 2

8.3. Cắt chuỗi (Slicing)

Bạn có thể lấy một phần của chuỗi bằng cú pháp [start:end:step].

s = "Hello Python"
print(s[0:5])    # Lấy từ 0 đến sát 5 -> "Hello"
print(s[6:])     # Lấy từ 6 đến hết -> "Python"
print(s[::-1])   # Đảo ngược chuỗi -> "nohtyP olleH"

9. Hàm (Functions)

Hàm là một khối mã lệnh được đặt tên, dùng để thực hiện một tác vụ cụ thể. Hàm giúp tái sử dụng mã và làm chương trình gọn gàng hơn.

9.1. Định nghĩa và Gọi hàm

Sử dụng từ khóa def để định nghĩa hàm.

def xin_chao():
    print("Xin chào các bạn!")

# Gọi hàm
xin_chao()

9.2. Tham số và Đối số

Bạn có thể truyền giá trị vào hàm thông qua tham số.

def chao_ten(ten):
    print("Xin chào " + ten)

chao_ten("An")   # In ra "Xin chào An"
chao_ten("Bình") # In ra "Xin chào Bình"

9.3. Giá trị trả về (Return)

Sử dụng return để trả về kết quả từ hàm.

def tinh_tong(a, b):
    ket_qua = a + b
    return ket_qua

tong = tinh_tong(5, 3)
print(tong)  # In ra 8

9.4. Tham số mặc định (Default Parameters)

Bạn có thể gán giá trị mặc định cho tham số. Nếu người dùng không truyền giá trị, giá trị mặc định sẽ được sử dụng.

def chao(ten="Bạn"):
    print("Chào " + ten)

chao()        # In ra "Chào Bạn"
chao("Hùng")  # In ra "Chào Hùng"

9.5. Tham số từ khóa (Keyword Arguments)

Khi gọi hàm, bạn có thể chỉ định rõ tên tham số để không cần quan tâm đến thứ tự.

def mo_ta_pet(loai, ten):
    print(f"Tôi có một con {loai} tên là {ten}")

# Gọi theo thứ tự
mo_ta_pet("chó", "Mực")

# Gọi theo từ khóa (thứ tự không quan trọng)
mo_ta_pet(ten="Miu", loai="mèo")

9.6. Phạm vi của biến (Variable Scope)

Biến được tạo ra trong hàm chỉ có thể được sử dụng bên trong hàm đó (Local). Biến tạo bên ngoài hàm có thể được sử dụng ở mọi nơi (Global).

x = "Global"  # Biến toàn cục

def my_func():
    y = "Local"  # Biến cục bộ
    print(x)     # Có thể truy cập biến Global
    print(y)     # Có thể truy cập biến Local

my_func()
print(x)  # OK
# print(y)  # Lỗi! Không thể truy cập y ở ngoài hàm

10. Lỗi chương trình và Gỡ lỗi

Việc gặp lỗi là một phần tự nhiên của lập trình. Hiểu các loại lỗi sẽ giúp bạn sửa chúng nhanh hơn.

10.1. Lỗi cú pháp (Syntax Errors)

Xảy ra khi bạn viết sai quy tắc ngôn ngữ. Python sẽ không chạy chương trình.

# Thiếu dấu hai chấm :
if 5 > 3
    print("Lớn hơn")

# SyntaxError: expected ':'

10.2. Ngoại lệ (Exceptions / Runtime Errors)

Xảy ra khi chương trình đang chạy nhưng gặp một lệnh không thể thực thi.

print(10 / 0)    # ZeroDivisionError: division by zero
print(bien_la)   # NameError: name 'bien_la' is not defined
int("abc")       # ValueError: invalid literal for int()

10.3. Lỗi logic (Logical Errors)

Chương trình chạy bình thường nhưng ra kết quả sai. Đây là loại lỗi khó tìm nhất.

# Muốn tính trung bình của 2 và 4 (kết quả phải là 3)
tb = 2 + 4 / 2
print(tb)  # In ra 4.0 -> Sai quy tắc toán học!
# Sửa: tb = (2 + 4) / 2

10.4. Cách đọc thông báo lỗi

  • Đọc dòng cuối cùng trước: Nó cho biết loại lỗi (vd: ZeroDivisionError).
  • Đọc thông báo chi tiết ngay sau loại lỗi.
  • Quan sát số dòng (Line number) để biết lỗi ở đâu.

10.5. Kỹ thuật Gỡ lỗi (Debugging Tips)

Khi gặp lỗi logic, hãy sử dụng print() để kiểm tra giá trị của biến tại các bước quan trọng.

def tinh_dien_tich(a, b):
    print(f"Kiểm tra: a={a}, b={b}")  # Dòng này giúp gỡ lỗi
    return a * b

print(tinh_dien_tich(5, 10))

10.6. Kiểm thử cơ bản (Basic Testing)

Bạn có thể dùng từ khóa assert để tự động kiểm tra xem hàm có hoạt động đúng không. Nếu điều kiện sai, chương trình sẽ báo lỗi.

def cong(a, b):
    return a + b

# Test cases
assert cong(1, 1) == 2   # Đúng, không có gì xảy ra
assert cong(2, 3) == 5   # Đúng
# assert cong(2, 2) == 5 # Sai -> AssertionError
print("Tất cả các test đều đúng!")

11. Thực hành: Viết chương trình đơn giản

Hãy áp dụng kiến thức đã học để viết các ứng dụng nhỏ sau đây.

11.1. Tính chỉ số BMI

Chương trình yêu cầu nhập cân nặng (kg) và chiều cao (m), sau đó tính BMI và đánh giá.

def tinh_bmi(can_nang, chieu_cao):
    bmi = can_nang / (chieu_cao ** 2)
    return bmi

# Nhập dữ liệu
w = float(input("Nhập cân nặng (kg): "))
h = float(input("Nhập chiều cao (m): "))

bmi = tinh_bmi(w, h)
print(f"Chỉ số BMI của bạn là: {bmi:.2f}")

if bmi < 18.5:
    print("Bạn bị thiếu cân")
elif bmi < 25:
    print("Bạn bình thường")
else:
    print("Bạn bị thừa cân")

11.2. Tính tổng dãy số

Tính tổng các số từ 1 đến N (do người dùng nhập).

n = int(input("Nhập số N: "))
tong = 0

for i in range(1, n + 1):
    tong += i

print(f"Tổng từ 1 đến {n} là: {tong}")

11.3. Trò chơi đoán số

Máy tính chọn một số ngẫu nhiên từ 1 đến 100. Bạn phải đoán xem đó là số nào.

import random

bi_mat = random.randint(1, 100)
doan = 0
so_lan = 0

print("Chào mừng đến với trò chơi đoán số!")

while doan != bi_mat:
    doan = int(input("Nhập dự đoán của bạn: "))
    so_lan += 1
    
    if doan < bi_mat:
        print("Lớn hơn nữa đi!")
    elif doan > bi_mat:
        print("Nhỏ hơn chút nữa!")
    else:
        print(f"Chúc mừng! Bạn đã đoán đúng số {bi_mat} trong {so_lan} lần.")

Ôn Tập Kiến Thức

Hãy thử sức với bài kiểm tra trắc nghiệm để củng cố lại những gì đã học nhé!

Làm bài kiểm tra ngay

Bài tập nhanh

Từ khóa nào dùng để định nghĩa hàm trong Python?