Python Giai Đoạn 1: Nền Tảng - Bắt Đầu với Python

Python Giai Đoạn 1: Nền Tảng - Bắt Đầu với Python
Chào mừng bạn đến với Giai đoạn 1 của Lộ trình Học Python! Giai đoạn này sẽ đưa bạn từ con số không đến thành thạo cú pháp cốt lõi và các khái niệm lập trình cơ bản của Python. Dù bạn đến từ ngôn ngữ khác hay bắt đầu từ đầu, sau giai đoạn này bạn sẽ viết code Python một cách tự tin.
Những Gì Bạn Sẽ Học
✅ Cài đặt Python và thiết lập IDE
✅ Cú pháp cơ bản và kiểu dữ liệu của Python
✅ Luồng điều khiển với if/else, match/case, và vòng lặp
✅ Hàm với tham số (*args, **kwargs)
✅ Lists, tuples, dictionaries, và sets
✅ Xử lý chuỗi và f-strings
✅ Xử lý ngoại lệ cơ bản
✅ Môi trường ảo với venv
Yêu Cầu Trước
- Kinh nghiệm lập trình: Quen thuộc với biến, vòng lặp, và hàm trong bất kỳ ngôn ngữ nào
- Command line cơ bản: Thoải mái với terminal/command prompt
- Cam kết thời gian: 2 tuần, tổng cộng 10-15 giờ
Cài Đặt Python 3.10+
Tải và Cài Đặt
Python 3.10+ bao gồm các tính năng hiện đại như structural pattern matching (match/case) và type hints được cải thiện.
macOS/Linux:
# Kiểm tra xem Python đã được cài đặt chưa
python3 --version
# Cài đặt qua Homebrew (macOS)
brew install [email protected]
# Cài đặt qua apt (Ubuntu/Debian)
sudo apt update
sudo apt install python3.12Windows:
- Tải từ python.org
- Chạy installer và đánh dấu "Add Python to PATH"
- Xác minh:
python --version
Thiết Lập IDE
VS Code (Khuyến nghị):
# Cài đặt VS Code extensions
code --install-extension ms-python.python
code --install-extension ms-python.vscode-pylancePyCharm:
- Tải PyCharm Community Edition (miễn phí)
- Tuyệt vời cho người mới với type checking và debugging tích hợp
Cú Pháp Cơ Bản Python
Biến và Kiểu Dữ Liệu
Python sử dụng dynamic typing - không cần khai báo kiểu rõ ràng.
# Biến (đặt tên theo snake_case)
name: str = "Alice"
age: int = 30
height: float = 5.7
is_student: bool = False
# Type hints là tùy chọn nhưng được khuyến nghị
user_id: int = 12345
email: str = "[email protected]"
# Gán nhiều biến
x, y, z = 1, 2, 3Các Kiểu Dữ Liệu Cơ Bản
# Số nguyên
count: int = 100
negative: int = -50
# Số thực
price: float = 19.99
scientific: float = 1.5e-4
# Chuỗi
message: str = "Hello, Python!"
multiline: str = """
Đây là một
chuỗi nhiều dòng
"""
# Boolean
is_active: bool = True
has_permission: bool = False
# None (tương đương null)
result: str | None = NoneToán Tử
# Số học
x = 10 + 5 # 15
y = 10 - 5 # 5
z = 10 * 5 # 50
w = 10 / 5 # 2.0 (luôn trả về float)
q = 10 // 3 # 3 (chia lấy phần nguyên)
r = 10 % 3 # 1 (chia lấy dư)
p = 2 ** 3 # 8 (lũy thừa)
# So sánh
10 == 10 # True (bằng)
10 != 5 # True (không bằng)
10 > 5 # True
10 >= 10 # True
10 < 20 # True
10 <= 10 # True
# Logic
True and False # False
True or False # True
not True # False
# Nhận dạng
x is None # Kiểm tra x có phải None
x is not None # Kiểm tra x không phải NoneLuồng Điều Khiển
Câu Lệnh If/Else
age: int = 18
if age >= 18:
print("Người lớn")
elif age >= 13:
print("Thiếu niên")
else:
print("Trẻ em")
# Toán tử ba ngôi
status: str = "Người lớn" if age >= 18 else "Trẻ vị thành niên"
# Truthiness (giá trị đúng)
name: str = "Alice"
if name: # Chuỗi không rỗng là truthy
print(f"Xin chào, {name}")
# Kiểm tra None
result: str | None = None
if result is None:
print("Không có kết quả")Match/Case (Python 3.10+)
Structural pattern matching của Python mạnh mẽ hơn câu lệnh switch truyền thống.
def handle_status(status_code: int) -> str:
match status_code:
case 200:
return "Thành công"
case 404:
return "Không tìm thấy"
case 500:
return "Lỗi máy chủ"
case _: # Trường hợp mặc định
return "Không xác định"
# Pattern matching với giá trị
def describe_point(point: tuple[int, int]) -> str:
match point:
case (0, 0):
return "Gốc tọa độ"
case (0, y):
return f"Trên trục Y tại {y}"
case (x, 0):
return f"Trên trục X tại {x}"
case (x, y):
return f"Điểm tại ({x}, {y})"Vòng Lặp
Vòng lặp for:
# Lặp qua một dải
for i in range(5): # 0, 1, 2, 3, 4
print(i)
# Lặp qua một list
fruits: list[str] = ["táo", "chuối", "cherry"]
for fruit in fruits:
print(fruit)
# Enumerate (index + giá trị)
for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")
# Lặp với bước nhảy
for i in range(0, 10, 2): # 0, 2, 4, 6, 8
print(i)Vòng lặp while:
count: int = 0
while count < 5:
print(count)
count += 1
# Break và continue
for i in range(10):
if i == 3:
continue # Bỏ qua 3
if i == 7:
break # Dừng tại 7
print(i)Hàm
Hàm Cơ Bản
def greet(name: str) -> str:
"""Chào một người theo tên."""
return f"Xin chào, {name}!"
# Gọi hàm
message: str = greet("Alice")
print(message) # "Xin chào, Alice!"
# Hàm với tham số mặc định
def greet_with_title(name: str, title: str = "Ông") -> str:
return f"Xin chào, {title} {name}!"
print(greet_with_title("Smith")) # "Xin chào, Ông Smith!"
print(greet_with_title("Smith", "Tiến sĩ")) # "Xin chào, Tiến sĩ Smith!"Nhiều Giá Trị Trả Về
def get_user_info() -> tuple[str, int, str]:
"""Trả về nhiều giá trị dưới dạng tuple."""
return "Alice", 30, "[email protected]"
# Giải nén giá trị trả về
name, age, email = get_user_info()
print(f"{name} {age} tuổi")*args và **kwargs
# *args: Tham số vị trí biến đổi
def sum_numbers(*args: int) -> int:
"""Tính tổng bất kỳ số lượng số nguyên nào."""
return sum(args)
print(sum_numbers(1, 2, 3)) # 6
print(sum_numbers(1, 2, 3, 4, 5)) # 15
# **kwargs: Tham số từ khóa biến đổi
def print_user_info(**kwargs: str | int) -> None:
"""In thông tin người dùng."""
for key, value in kwargs.items():
print(f"{key}: {value}")
print_user_info(name="Alice", age=30, city="NYC")
# Sử dụng kết hợp
def create_user(name: str, *tags: str, **metadata: str | int) -> dict:
"""Tạo user với tags và metadata."""
return {
"name": name,
"tags": list(tags),
"metadata": metadata
}
user = create_user(
"Alice",
"developer",
"python",
age=30,
city="NYC"
)Cấu Trúc Dữ Liệu
Lists (Có Thể Thay Đổi, Có Thứ Tự)
# Tạo lists
numbers: list[int] = [1, 2, 3, 4, 5]
fruits: list[str] = ["táo", "chuối", "cherry"]
mixed: list[int | str] = [1, "hai", 3, "bốn"]
# Truy cập phần tử
first: str = fruits[0] # "táo"
last: str = fruits[-1] # "cherry"
# Slicing (cắt lát)
first_two: list[str] = fruits[0:2] # ["táo", "chuối"]
last_two: list[str] = fruits[-2:] # ["chuối", "cherry"]
# Sửa đổi lists
fruits.append("cam") # Thêm vào cuối
fruits.insert(1, "xoài") # Chèn tại index
fruits.remove("chuối") # Xóa lần xuất hiện đầu tiên
popped: str = fruits.pop() # Xóa và trả về phần tử cuối
# Các phương thức list
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
numbers.sort() # Sắp xếp tại chỗ
numbers.reverse() # Đảo ngược
count: int = numbers.count(1) # Đếm số lần xuất hiện
# Kiểm tra membership
if "táo" in fruits:
print("Tìm thấy táo!")Tuples (Không Thể Thay Đổi, Có Thứ Tự)
# Tạo tuples
point: tuple[int, int] = (10, 20)
rgb: tuple[int, int, int] = (255, 128, 0)
# Giải nén tuples
x, y = point
red, green, blue = rgb
# Named tuples (data classes nhẹ)
from typing import NamedTuple
class Point(NamedTuple):
x: int
y: int
p = Point(10, 20)
print(p.x, p.y) # 10 20Dictionaries (Cặp Key-Value)
# Tạo dictionaries
user: dict[str, str | int] = {
"name": "Alice",
"age": 30,
"email": "[email protected]"
}
# Truy cập giá trị
name: str = user["name"] # Gây KeyError nếu thiếu
age: int | None = user.get("age") # Trả về None nếu thiếu
age_default: int = user.get("age", 0) # Trả về mặc định
# Sửa đổi dictionaries
user["city"] = "NYC" # Thêm/cập nhật key
del user["email"] # Xóa key
popped_value = user.pop("age", None) # Xóa và trả về
# Lặp qua dictionaries
for key in user:
print(f"{key}: {user[key]}")
for key, value in user.items():
print(f"{key}: {value}")
# Dictionary comprehension
squares: dict[int, int] = {x: x**2 for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}Sets (Duy Nhất, Không Thứ Tự)
# Tạo sets
fruits: set[str] = {"táo", "chuối", "cherry"}
numbers: set[int] = {1, 2, 3, 4, 5}
# Sets tự động loại bỏ trùng lặp
numbers = {1, 2, 2, 3, 3, 3} # {1, 2, 3}
# Thêm và xóa
fruits.add("cam")
fruits.remove("chuối") # Gây KeyError nếu thiếu
fruits.discard("chuối") # Không lỗi nếu thiếu
# Các phép toán set
a: set[int] = {1, 2, 3, 4}
b: set[int] = {3, 4, 5, 6}
union: set[int] = a | b # {1, 2, 3, 4, 5, 6} (hợp)
intersection: set[int] = a & b # {3, 4} (giao)
difference: set[int] = a - b # {1, 2} (hiệu)
symmetric_diff: set[int] = a ^ b # {1, 2, 5, 6} (hiệu đối xứng)Xử Lý Chuỗi
Chuỗi Cơ Bản
# Tạo chuỗi
name: str = "Alice"
message: str = 'Xin chào, Thế giới!'
multiline: str = """
Dòng 1
Dòng 2
"""
# Nối chuỗi
full_name: str = "Alice" + " " + "Smith"
# Lặp lại chuỗi
separator: str = "-" * 20 # "--------------------"
# Các phương thức chuỗi
text: str = " Xin chào, Python! "
lower: str = text.lower() # " xin chào, python! "
upper: str = text.upper() # " XIN CHÀO, PYTHON! "
stripped: str = text.strip() # "Xin chào, Python!"
replaced: str = text.replace("Python", "World")F-Strings (Chuỗi Định Dạng)
name: str = "Alice"
age: int = 30
# F-string cơ bản
message: str = f"Tên tôi là {name} và tôi {age} tuổi"
# Biểu thức trong f-strings
result: str = f"Năm sau tôi sẽ {age + 1} tuổi"
# Định dạng số
price: float = 19.99
formatted: str = f"Giá: ${price:.2f}" # "Giá: $19.99"
# Căn chỉnh văn bản
item: str = "Táo"
count: int = 5
line: str = f"{item:<10} {count:>5}"
# Chế độ debug (Python 3.8+)
x: int = 10
debug: str = f"{x=}" # "x=10"Các Thao Tác Chuỗi
# Slicing
text: str = "Python"
first_three: str = text[:3] # "Pyt"
last_three: str = text[-3:] # "hon"
# Split và join
sentence: str = "Xin chào, Thế giới, Python"
words: list[str] = sentence.split(", ")
joined: str = " | ".join(words)
# Kiểm tra nội dung
text = "Hello123"
text.isalpha() # False (chứa số)
text.isdigit() # False (chứa chữ)
text.isalnum() # True (chữ và số)
# Startswith/Endswith
filename: str = "document.pdf"
if filename.endswith(".pdf"):
print("Đây là PDF!")File I/O Cơ Bản
Đọc Files
# Đọc toàn bộ file
with open("data.txt", "r") as file:
content: str = file.read()
print(content)
# Đọc từng dòng
with open("data.txt", "r") as file:
for line in file:
print(line.strip())
# Đọc tất cả các dòng vào list
with open("data.txt", "r") as file:
lines: list[str] = file.readlines()Ghi Files
# Ghi vào file (ghi đè)
with open("output.txt", "w") as file:
file.write("Xin chào, Thế giới!\n")
file.write("Dòng thứ hai\n")
# Thêm vào file
with open("output.txt", "a") as file:
file.write("Dòng được thêm\n")
# Ghi nhiều dòng
lines: list[str] = ["Dòng 1\n", "Dòng 2\n", "Dòng 3\n"]
with open("output.txt", "w") as file:
file.writelines(lines)Làm Việc với Paths
from pathlib import Path
# Tạo đối tượng Path
file_path = Path("data/input.txt")
# Kiểm tra tồn tại
if file_path.exists():
print("File tồn tại!")
# Đọc với Path
content: str = file_path.read_text()
# Ghi với Path
file_path.write_text("Xin chào, Thế giới!")
# Lấy thông tin file
print(file_path.name) # "input.txt"
print(file_path.stem) # "input"
print(file_path.suffix) # ".txt"
print(file_path.parent) # Path("data")Xử Lý Ngoại Lệ
Try/Except Cơ Bản
# Xử lý ngoại lệ cơ bản
try:
number: int = int("abc") # ValueError
except ValueError:
print("Số không hợp lệ!")
# Xử lý nhiều ngoại lệ
try:
result: int = 10 / 0
except ZeroDivisionError:
print("Không thể chia cho không!")
except ValueError:
print("Giá trị không hợp lệ!")
# Bắt tất cả ngoại lệ (sử dụng cẩn thận)
try:
# thao tác có rủi ro
pass
except Exception as e:
print(f"Đã xảy ra lỗi: {e}")Finally và Else
# Finally: Luôn thực thi
try:
file = open("data.txt", "r")
content = file.read()
except FileNotFoundError:
print("Không tìm thấy file!")
finally:
if 'file' in locals():
file.close()
# Else: Thực thi nếu không có ngoại lệ
try:
result: int = 10 / 2
except ZeroDivisionError:
print("Lỗi!")
else:
print(f"Kết quả: {result}") # Thực thi
finally:
print("Dọn dẹp") # Luôn thực thiRaise Exceptions
def divide(a: int, b: int) -> float:
"""Chia hai số."""
if b == 0:
raise ValueError("Không thể chia cho không!")
return a / b
# Custom exception
class InvalidAgeError(Exception):
"""Ném ra khi tuổi không hợp lệ."""
pass
def set_age(age: int) -> None:
if age < 0:
raise InvalidAgeError("Tuổi không thể âm!")
print(f"Đặt tuổi thành {age}")Môi Trường Ảo
Tại Sao Cần Môi Trường Ảo?
Môi trường ảo cô lập các dependency của dự án để tránh xung đột giữa các dự án.
Tạo và Sử Dụng venv
# Tạo môi trường ảo
python3 -m venv venv
# Kích hoạt (macOS/Linux)
source venv/bin/activate
# Kích hoạt (Windows)
venv\Scripts\activate
# Cài đặt packages
pip install requests
# Liệt kê packages đã cài
pip list
# Lưu dependencies
pip freeze > requirements.txt
# Cài đặt từ requirements
pip install -r requirements.txt
# Deactivate
deactivateCấu Trúc Dự Án
my-project/
├── venv/ # Môi trường ảo (không commit)
├── src/ # Source code
│ └── main.py
├── tests/ # Test files
├── requirements.txt # Dependencies
└── .gitignore # Ignore venv/Best Practices
Code Style
✅ Dùng snake_case cho biến và hàm
✅ Dùng PascalCase cho classes
✅ Dùng UPPERCASE cho hằng số
✅ Thêm type hints cho tham số và kiểu trả về
✅ Viết docstrings cho các hàm
# Tốt
def calculate_total_price(items: list[float]) -> float:
"""Tính tổng giá của các items."""
return sum(items)
# Không tốt
def CalculatePrice(x): # Đặt tên sai, không có types
return sum(x)Lỗi Thường Gặp
❌ Tham số mặc định có thể thay đổi:
# KHÔNG TỐT - list được chia sẻ giữa các lần gọi!
def add_item(item: str, items: list[str] = []) -> list[str]:
items.append(item)
return items
# TỐT
def add_item(item: str, items: list[str] | None = None) -> list[str]:
if items is None:
items = []
items.append(item)
return items❌ Sửa đổi list trong khi lặp:
# KHÔNG TỐT
numbers = [1, 2, 3, 4, 5]
for num in numbers:
if num % 2 == 0:
numbers.remove(num) # Gây ra bỏ qua!
# TỐT
numbers = [num for num in numbers if num % 2 != 0]Bài Tập Thực Hành
Bài tập 1: Chuyển Đổi Nhiệt Độ
def celsius_to_fahrenheit(celsius: float) -> float:
"""Chuyển đổi Celsius sang Fahrenheit."""
return (celsius * 9/5) + 32
def fahrenheit_to_celsius(fahrenheit: float) -> float:
"""Chuyển đổi Fahrenheit sang Celsius."""
return (fahrenheit - 32) * 5/9Bài tập 2: Đếm Từ
def count_words(text: str) -> dict[str, int]:
"""Đếm tần suất từ trong văn bản."""
words = text.lower().split()
word_counts: dict[str, int] = {}
for word in words:
word_counts[word] = word_counts.get(word, 0) + 1
return word_counts
# Ví dụ
text = "xin chào thế giới xin chào python thế giới"
print(count_words(text))
# {'xin': 2, 'chào': 2, 'thế': 2, 'giới': 2, 'python': 1}Bài tập 3: TODO List Đơn Giản
def todo_app() -> None:
"""Ứng dụng TODO list đơn giản."""
todos: list[str] = []
while True:
print("\n1. Thêm task")
print("2. Xem tasks")
print("3. Xóa task")
print("4. Thoát")
choice: str = input("Chọn tùy chọn: ")
match choice:
case "1":
task = input("Nhập task: ")
todos.append(task)
case "2":
for i, task in enumerate(todos, 1):
print(f"{i}. {task}")
case "3":
index = int(input("Số task: ")) - 1
if 0 <= index < len(todos):
todos.pop(index)
case "4":
breakTóm Tắt và Những Điểm Chính
✅ Python sử dụng dynamic typing nhưng type hints cải thiện chất lượng code
✅ Dùng f-strings cho định dạng chuỗi (hiện đại và dễ đọc)
✅ Match/case mạnh mẽ cho pattern matching (Python 3.10+)
✅ Lists có thể thay đổi, tuples không thể thay đổi
✅ Dictionaries ánh xạ keys tới values (tra cứu nhanh)
✅ Sets lưu trữ các phần tử duy nhất (tuyệt vời cho kiểm tra membership)
✅ Luôn sử dụng câu lệnh with cho các thao tác file
✅ Xử lý ngoại lệ một cách tốt đẹp với try/except
✅ Sử dụng môi trường ảo cho mọi dự án
✅ Tuân theo hướng dẫn style PEP 8 cho code dễ đọc
Các Bước Tiếp Theo
Bạn đã hoàn thành Giai đoạn 1! Bây giờ bạn hiểu cú pháp cốt lõi của Python và có thể viết các chương trình cơ bản. Sẵn sàng nâng cấp?
Tiếp tục: Giai Đoạn 2: OOP & Tính Năng Nâng Cao →
Quay lại roadmap: Lộ Trình Học Python →
Thực hành khuyến nghị: Xây dựng một công cụ CLI (máy tính, trình tổ chức file, hoặc trình tạo mật khẩu) để củng cố những nền tảng này trước khi tiếp tục!
📬 Đăng ký nhận bản tin
Nhận những bài viết mới nhất qua email mỗi tuần. Không spam, hủy đăng ký bất cứ lúc nào.
Chúng tôi tôn trọng quyền riêng tư của bạn. Hủy đăng ký bất cứ lúc nào.
💬 Comments
Đăng nhập để bình luận
Chúng tôi sẽ không đăng bất cứ điều gì mà không có sự cho phép của bạn.