MinAI - Về trang chủ
Lý thuyết
2/153 giờ
Đang tải...

Python Cơ Bản - Phần 2

Control Flow, Collections, Functions, Decorators và Error Handling

0

🎯 Mục tiêu bài học

TB5 min

Sau bài học này, bạn sẽ:

✅ Thành thạo Control Flow: if/elif/else, for, while, list comprehension

✅ Sử dụng được Collections: List, Dictionary, Set, Tuple

✅ Viết Functions với parameters, *args, **kwargs, return values

✅ Hiểu Lambda, Decorators và Error Handling

Thời gian: 3 giờ | Độ khó: Beginner | Yêu cầu: Hoàn thành Bài 1

1

📖 Bảng Thuật Ngữ Quan Trọng

TB5 min
Thuật ngữTiếng ViệtGiải thích đơn giản
Control FlowLuồng điều khiểnQuyết định code nào chạy dựa trên điều kiện
LoopVòng lặpLặp lại một đoạn code nhiều lần
List ComprehensionTạo list rút gọnCách viết ngắn gọn tạo list: [x**2 for x in range(5)]
DictionaryTừ điểnCấu trúc lưu cặp key-value: {"name": "Alice"}
FunctionHàmKhối code tái sử dụng, nhận input trả output
LambdaHàm ẩn danhFunction không tên, viết trên 1 dòng
DecoratorBộ trang tríFunction bọc function khác để thêm chức năng
ExceptionNgoại lệLỗi xảy ra khi chạy chương trình
try-exceptXử lý lỗiBắt và xử lý lỗi thay vì crash chương trình
ModuleMô-đunFile Python chứa code có thể import và tái sử dụng

Checkpoint

Bạn đã đọc qua bảng thuật ngữ chưa? Hãy quay lại đây khi gặp thuật ngữ lạ trong bài!

2

🔀 Control Flow

TB5 min

Control Flow (Luồng điều khiển) là gì? Bình thường Python chạy code từ trên xuống dưới, tuần tự. Nhưng trong thực tế, bạn cần:

  • Ra quyết định: "Nếu khách VIP thì giảm 20%, không thì giảm 5%" → dùng if/else
  • Lặp lại: "Tính tổng doanh thu cho từng tháng" → dùng for loop
  • Chờ điều kiện: "Tiếp tục hỏi password cho đến khi đúng" → dùng while loop

If-Elif-Else

Câu lệnh điều kiện cho phép chương trình ra quyết định — giống như chọn đường đi dựa trên thời tiết: trời mưa → mang ô, trời nắng → đội mũ, bình thường → đi tay không.

Cú pháp: if kiểm tra điều kiện → đúng thì chạy code bên trong, sai thì bỏ qua. elif kiểm tra điều kiện tiếp. else chạy khi tất cả điều kiện trên đều sai.

Python
1score = 85
2
3if score >= 90:
4 grade = "A"
5elif score >= 80:
6 grade = "B"
7elif score >= 70:
8 grade = "C"
9else:
10 grade = "F"
11
12print(f"Grade: {grade}") # Grade: B
13
14# Ternary operator (one-line if)
15status = "Pass" if score >= 60 else "Fail"

For Loop

Vòng lặp for là gì? Vòng lặp cho phép bạn lặp lại một thao tác cho nhiều phần tử — giống như đi chợ với danh sách mua sắm: lần lượt đi qua từng món, cho vào giỏ, rồi qua món tiếp theo.

Tại sao cần vòng lặp? Thay vì viết 1000 dòng print() riêng biệt, bạn chỉ cần 2 dòng for loop. Trong DS: duyệt từng file CSV, xử lý từng cột, tính toán cho từng nhóm khách hàng...

Python
1# Iterate over list
2fruits = ["apple", "banana", "cherry"]
3for fruit in fruits:
4 print(fruit)
5
6# Range
7for i in range(5): # 0, 1, 2, 3, 4
8 print(i)
9for i in range(1, 6): # 1, 2, 3, 4, 5
10 print(i)
11for i in range(0, 10, 2): # 0, 2, 4, 6, 8
12 print(i)
13
14# Enumerate (index + value)
15for idx, fruit in enumerate(fruits):
16 print(f"{idx}: {fruit}")
17
18# Zip (parallel iteration)
19names = ["Alice", "Bob"]
20ages = [25, 30]
21for name, age in zip(names, ages):
22 print(f"{name} is {age}")

Giải thích các pattern quan trọng:

  • range(n): Tạo dãy số từ 0 đến n-1. Dùng khi biết chính xác cần lặp bao nhiêu lần.
  • enumerate(): Lấy cả index lẫn giá trị — rất hữu ích khi cần biết đang ở vị trí thứ mấy.
  • zip(): Duyệt song song 2+ list — ví dụ: ghép tên sinh viên với điểm số.

While Loop

Vòng lặp while chạy liên tục cho đến khi điều kiện sai. Khác với for (biết trước số lần lặp), while dùng khi không biết cần lặp bao nhiêu lần — ví dụ: yêu cầu nhập lại password cho đến khi đúng, tải dữ liệu cho đến khi hết trang.

Python
1count = 0
2while count < 5:
3 print(count)
4 count += 1
5
6# break và continue
7while True:
8 user_input = input("Enter 'q' to quit: ")
9 if user_input == 'q':
10 break # Thoát vòng lặp
11 if user_input == '':
12 continue # Bỏ qua, lặp tiếp
13 print(f"You entered: {user_input}")

breakcontinue:

  • break: Dừng hẳn vòng lặp — ví dụ: tìm thấy kết quả rồi, không cần tìm tiếp.
  • continue: Bỏ qua lần lặp hiện tại, nhảy sang lần tiếp — ví dụ: bỏ qua dữ liệu trống.

List Comprehension

List Comprehension là cách viết "Pythonic" — ngắn gọn và nhanh hơn vòng for thông thường. Đây là pattern rất phổ biến trong Data Science!

Python
1# Basic
2squares = [x**2 for x in range(10)]
3# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
4
5# With condition (filter)
6evens = [x for x in range(20) if x % 2 == 0]
7# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
8
9# Nested
10matrix = [[i*j for j in range(3)] for i in range(3)]
11# [[0,0,0], [0,1,2], [0,2,4]]
12
13# Dict comprehension
14squares_dict = {x: x**2 for x in range(5)}
15# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
16
17# Set comprehension
18unique_lengths = {len(word) for word in ["hello", "world", "hi"]}
19# {2, 5}

Checkpoint

Viết list comprehension tạo danh sách các số chia hết cho 3 trong khoảng 1-50. Kết quả bao nhiêu phần tử?

3

📚 Collections

TB5 min

Collections là các cấu trúc dữ liệu dùng để lưu nhiều giá trị trong một biến. Python có 4 loại chính — mỗi loại phù hợp với mục đích khác nhau:

CollectionĐặc điểmKhi nào dùng?Ví dụ
List []Có thứ tự, thay đổi đượcDanh sách dữ liệu chungĐiểm các bài thi, sản phẩm
Dict {}Cặp key-valueTra cứu nhanh theo tênThông tin khách hàng, config
Set {}Không trùng lặpTìm giá trị duy nhấtDanh sách thành phố, tags
Tuple ()Không thay đổi đượcDữ liệu cố địnhTọa độ (x, y), return nhiều giá trị

List

List (danh sách) là collection phổ biến nhất — giống như một hàng đợi có thể thêm, xóa, sắp xếp tùy ý:

Python
1# Create
2fruits = ["apple", "banana", "cherry"]
3numbers = list(range(1, 6))
4
5# Access
6fruits[0] # "apple"
7fruits[-1] # "cherry"
8fruits[1:3] # ["banana", "cherry"]
9
10# Modify
11fruits.append("orange") # Add to end
12fruits.insert(1, "grape") # Insert at index
13fruits.extend(["kiwi"]) # Add multiple items
14fruits.remove("banana") # Remove by value
15fruits.pop() # Remove & return last
16fruits.pop(0) # Remove & return by index
17
18# Other methods
19fruits.sort() # Sort in place
20fruits.reverse() # Reverse in place
21fruits.index("apple") # Find index
22fruits.count("apple") # Count occurrences
23len(fruits) # Length

Dictionary

Python
1# Create
2person = {
3 "name": "Alice",
4 "age": 25,
5 "city": "Hanoi"
6}
7
8# Access
9person["name"] # "Alice"
10person.get("name") # "Alice"
11person.get("job", "N/A") # "N/A" (default if key missing)
12
13# Modify
14person["age"] = 26 # Update
15person["job"] = "Data Scientist" # Add new key
16
17# Methods
18person.keys() # dict_keys(['name', 'age', 'city', 'job'])
19person.values() # dict_values(['Alice', 26, 'Hanoi', 'Data Scientist'])
20person.items() # dict_items([('name', 'Alice'), ...])
21
22# Iterate
23for key, value in person.items():
24 print(f"{key}: {value}")

Dictionary là cấu trúc dữ liệu quan trọng nhất trong Python — dùng khắp nơi: JSON data, function kwargs, config, API responses...

Set & Tuple

Set chỉ chứa giá trị không trùng lặp — rất hữu ích khi muốn tìm "có bao nhiêu giá trị khác nhau?" (ví dụ: bao nhiêu thành phố trong dataset?).

Tuple giống List nhưng không thể thay đổi sau khi tạo — dùng khi dữ liệu không nên bị sửa (tọa độ GPS, return nhiều giá trị từ function).

Python
1# Set - Unique values, unordered
2colors = {"red", "green", "blue"}
3colors.add("yellow")
4colors.remove("red")
5
6# Set operations (rất hữu ích cho Data Science!)
7a = {1, 2, 3}
8b = {2, 3, 4}
9print(a | b) # Union: {1, 2, 3, 4}
10print(a & b) # Intersection: {2, 3}
11print(a - b) # Difference: {1}
12
13# Tuple - Immutable list (không thể thay đổi)
14point = (10, 20)
15x, y = point # Unpacking
16
17# Practical: return multiple values
18def get_min_max(numbers):
19 return min(numbers), max(numbers) # Returns tuple
20
21lo, hi = get_min_max([3, 1, 4, 1, 5])

Checkpoint

Tạo một dictionary chứa thông tin 3 sinh viên (tên, điểm). Dùng dict comprehension để lọc ra sinh viên có điểm >= 8.

4

🔧 Functions

TB5 min

Function (hàm) là gì? Function là một khối code có tên, nhận input → xử lý → trả output. Hãy tưởng tượng function như một công thức nấu ăn: đưa nguyên liệu vào (parameters), làm theo các bước (code), và nhận món ăn hoàn chỉnh (return value).

Tại sao cần function?

  • Tái sử dụng: Viết 1 lần, dùng nhiều lần — không cần copy-paste
  • Dễ đọc: calculate_bmi(70, 1.75) rõ ràng hơn 10 dòng tính toán
  • Dễ sửa: Sửa 1 chỗ, áp dụng cho mọi nơi gọi function
  • DRY Principle: Don't Repeat Yourself — nguyên tắc vàng trong lập trình

Basic Function

Python
1def greet(name):
2 """Chào người dùng - đây là docstring"""
3 return f"Hello, {name}!"
4
5message = greet("MinAI")
6print(message) # Hello, MinAI!

Parameters

Python
1# Default parameters
2def greet(name, greeting="Hello"):
3 return f"{greeting}, {name}!"
4
5greet("Alice") # "Hello, Alice!"
6greet("Alice", "Hi") # "Hi, Alice!"
7
8# Keyword arguments (gọi theo bất kỳ thứ tự)
9def create_profile(name, age, city):
10 return {"name": name, "age": age, "city": city}
11
12profile = create_profile(age=25, city="Hanoi", name="Bob")
13
14# *args - Nhận số lượng arguments KHÔNG CỐ ĐỊNH
15# Ví dụ: sum_all(1, 2) hoặc sum_all(1, 2, 3, 4, 5) — đều được!
16def sum_all(*args):
17 return sum(args)
18
19sum_all(1, 2, 3, 4, 5) # 15
20
21# **kwargs - Nhận keyword arguments KHÔNG CỐ ĐỊNH
22# Ví dụ: build_dict(name="Alice", age=25) — gọi với bất kỳ keyword nào
23def build_dict(**kwargs):
24 return kwargs
25
26build_dict(a=1, b=2, c=3) # {'a': 1, 'b': 2, 'c': 3}
27
28# Kết hợp tất cả
29def func(a, b, *args, **kwargs):
30 print(f"a={a}, b={b}")
31 print(f"args={args}")
32 print(f"kwargs={kwargs}")
33
34func(1, 2, 3, 4, x=10, y=20)
35# a=1, b=2 | args=(3, 4) | kwargs={'x': 10, 'y': 20}

Return Multiple Values

Python
1def get_stats(numbers):
2 """Tính các thống kê cơ bản"""
3 return min(numbers), max(numbers), sum(numbers)/len(numbers)
4
5# Unpacking
6min_val, max_val, avg = get_stats([1, 2, 3, 4, 5])
7print(f"Min: {min_val}, Max: {max_val}, Avg: {avg}")

Checkpoint

Viết function calculate_bmi(weight, height) nhận cân nặng (kg) và chiều cao (m), trả về BMI và phân loại ("Gầy"/"Bình thường"/"Thừa cân").

5

⚡ Lambda và Built-in Functions

TB5 min

Lambda Functions

Lambda là anonymous function — function không tên, viết trên 1 dòng.

Python
1# Function thường vs Lambda
2def square(x):
3 return x ** 2
4
5square = lambda x: x ** 2 # Tương đương
6
7# Lambda với nhiều arguments
8add = lambda x, y: x + y

Ứng dụng với map, filter, sorted

Ba built-in functions này kết hợp với lambda tạo thành pattern rất mạnh:

  • map(func, list): Áp dụng func cho từng phần tử → list mới (ví dụ: đổi đơn vị cho cả cột)
  • filter(func, list): Lọc chỉ giữ phần tử thỏa điều kiện (ví dụ: lọc khách có đơn hàng)
  • sorted(list, key=func): Sắp xếp theo tiêu chí tùy chọn (ví dụ: sắp theo điểm cao → thấp)
Python
1numbers = [1, 2, 3, 4, 5]
2
3# map - áp dụng function cho từng phần tử
4squares = list(map(lambda x: x**2, numbers))
5# [1, 4, 9, 16, 25]
6
7# filter - lọc phần tử
8evens = list(filter(lambda x: x % 2 == 0, numbers))
9# [2, 4]
10
11# sorted - sắp xếp với key
12students = [
13 {"name": "Alice", "score": 85},
14 {"name": "Bob", "score": 92},
15 {"name": "Charlie", "score": 78}
16]
17sorted_students = sorted(students, key=lambda x: x["score"], reverse=True)
18# Bob (92), Alice (85), Charlie (78)

Built-in Functions hữu ích

Python
1numbers = [3, 1, 4, 1, 5, 9, 2, 6]
2
3# Aggregation
4len(numbers) # 8
5sum(numbers) # 31
6min(numbers) # 1
7max(numbers) # 9
8sorted(numbers) # [1, 1, 2, 3, 4, 5, 6, 9]
9
10# Logic
11any([False, True, False]) # True (ít nhất 1 True)
12all([True, True, False]) # False (không phải tất cả)
13
14# Math
15abs(-5) # 5
16round(3.14159, 2) # 3.14
17pow(2, 10) # 1024
18
19# reduce - aggregate tuần tự
20from functools import reduce
21total = reduce(lambda x, y: x + y, numbers) # 31

Trong Data Science, bạn sẽ dùng lambda rất nhiều với Pandas: df['col'].apply(lambda x: x * 2), df.sort_values(key=lambda x: ...).

Checkpoint

Dùng filter + lambda để lọc ra các từ có độ dài > 4 từ list ["hi", "hello", "world", "ok", "python"].

6

🎨 Decorators

TB5 min

Decorator là function "bọc" function khác để thêm chức năng — rất phổ biến trong Python.

Basic Decorator

Python
1def timer(func):
2 """Decorator đo thời gian chạy"""
3 import time
4 def wrapper(*args, **kwargs):
5 start = time.time()
6 result = func(*args, **kwargs)
7 end = time.time()
8 print(f"{func.__name__} took {end-start:.4f} seconds")
9 return result
10 return wrapper
11
12@timer
13def slow_function():
14 import time
15 time.sleep(1)
16 return "Done!"
17
18slow_function()
19# slow_function took 1.0012 seconds

Decorator với parameters

Python
1def repeat(times):
2 """Decorator chạy function nhiều lần"""
3 def decorator(func):
4 def wrapper(*args, **kwargs):
5 for _ in range(times):
6 result = func(*args, **kwargs)
7 return result
8 return wrapper
9 return decorator
10
11@repeat(times=3)
12def say_hello(name):
13 print(f"Hello, {name}!")
14
15say_hello("World")
16# Hello, World! (3 lần)

Common Decorators

Python
1from functools import lru_cache
2
3# Caching - Lưu kết quả để không tính lại
4@lru_cache(maxsize=128)
5def fibonacci(n):
6 if n < 2:
7 return n
8 return fibonacci(n-1) + fibonacci(n-2)
9
10print(fibonacci(100)) # Rất nhanh nhờ cache!
11
12# Property decorator
13class Circle:
14 def __init__(self, radius):
15 self._radius = radius
16
17 @property
18 def area(self):
19 import math
20 return math.pi * self._radius ** 2
21
22circle = Circle(5)
23print(circle.area) # 78.539...

Decorator bạn sẽ gặp thường xuyên khi làm việc với Flask/FastAPI (@app.route), testing (@pytest.fixture), và caching (@lru_cache).

Checkpoint

@timer decorator hoạt động ra sao? Nó nhận function gốc, bọc trong wrapper, đo thời gian trước/sau khi gọi function gốc.

7

🛡️ Error Handling

TB5 min

Try-Except

Python
1# Basic
2try:
3 result = 10 / 0
4except ZeroDivisionError:
5 print("Cannot divide by zero!")
6
7# Multiple exceptions
8try:
9 num = int(input("Enter a number: "))
10 result = 10 / num
11except ValueError:
12 print("Invalid input - not a number!")
13except ZeroDivisionError:
14 print("Cannot divide by zero!")
15
16# Catch all + else + finally
17try:
18 file = open("data.txt", "r")
19 content = file.read()
20except FileNotFoundError:
21 print("File not found!")
22else:
23 print(f"File content: {content}") # Chạy nếu KHÔNG có lỗi
24finally:
25 print("Cleanup done") # LUÔN LUÔN chạy

Raise & Custom Exceptions

Python
1def validate_age(age):
2 if age < 0:
3 raise ValueError("Age cannot be negative")
4 if age > 150:
5 raise ValueError("Age seems unrealistic")
6 return True
7
8# Custom Exception
9class InvalidDataError(Exception):
10 def __init__(self, message, error_code=None):
11 super().__init__(message)
12 self.error_code = error_code
13
14def process_data(data):
15 if not data:
16 raise InvalidDataError("Data is empty", error_code=1001)
17 return data

Context Manager (with)

Python
1# File handling — tự động đóng file
2with open("data.txt", "r") as file:
3 content = file.read()
4# File tự động đóng khi ra khỏi with block
5
6# Custom context manager
7class Timer:
8 def __enter__(self):
9 import time
10 self.start = time.time()
11 return self
12
13 def __exit__(self, *args):
14 import time
15 self.end = time.time()
16 print(f"Elapsed: {self.end - self.start:.4f}s")
17
18with Timer():
19 sum([i**2 for i in range(1000000)])

Quan trọng: Luôn dùng with khi làm việc với file. Nếu không, file có thể không được đóng đúng cách, gây rò rỉ tài nguyên.

Checkpoint

Viết function an toàn: nhận string, trả về int — nếu không convert được thì trả về 0. Dùng try-except.

8

📦 Modules và Imports

TB5 min

Import Methods

Python
1# Import toàn bộ module
2import math
3print(math.sqrt(16)) # 4.0
4
5# Import với alias (rất phổ biến trong Data Science)
6import pandas as pd
7import numpy as np
8import matplotlib.pyplot as plt
9
10# Import specific functions
11from math import sqrt, pi
12print(sqrt(16)) # 4.0

Tạo Module riêng

Python
1# utils.py
2def calculate_mean(numbers):
3 return sum(numbers) / len(numbers)
4
5def calculate_std(numbers):
6 mean = calculate_mean(numbers)
7 variance = sum((x - mean)**2 for x in numbers) / len(numbers)
8 return variance ** 0.5
9
10# main.py
11from utils import calculate_mean, calculate_std
12data = [1, 2, 3, 4, 5]
13print(calculate_mean(data)) # 3.0

__name__ == "__main__"

Python
1# my_module.py
2def main():
3 print("Running as main script")
4
5if __name__ == "__main__":
6 main() # Chỉ chạy khi execute trực tiếp, không chạy khi import

Checkpoint

Tại sao Data Science luôn dùng alias import pandas as pd? Để code ngắn gọn hơn: pd.read_csv() thay vì pandas.read_csv().

9

📝 Tổng Kết

TB5 min

Câu hỏi tự kiểm tra

  1. List comprehension khác gì so với vòng lặp for thông thường? Khi nào nên dùng list comprehension?
  2. Sự khác biệt giữa *args**kwargs trong định nghĩa function là gì?
  3. Tại sao nên dùng with open() thay vì open()close() riêng lẻ khi xử lý file?
  4. Dictionary và List khác nhau như thế nào? Khi nào nên dùng Dictionary thay vì List?

✅ Những điều bạn đã học được

  • 🔀 Control Flow — if/elif/else, for loop, while loop, list comprehension
  • 📚 Collections — List, Dictionary, Set, Tuple và methods quan trọng
  • 🔧 Functions — Parameters, *args, **kwargs, return, docstrings
  • Lambda — Anonymous functions, map/filter/sorted
  • 🎨 Decorators — @timer, @lru_cache, @property
  • 🛡️ Error Handling — try/except/else/finally, raise, custom exceptions
  • 📦 Modules — import, alias, tạo module riêng

Bài tập tự luyện

  1. Viết function flatten(nested_list) biến [[1,2],[3,4],[5]] thành [1,2,3,4,5] dùng list comprehension
  2. Tạo dict word_count đếm số lần xuất hiện mỗi từ trong câu "the cat sat on the mat the cat"
  3. Viết decorator @log in ra tên function và arguments mỗi khi gọi
  4. Viết function đọc file CSV an toàn — trả về data nếu thành công, None nếu file không tồn tại

Bài tiếp theo: Bài tập thực hành Python Basics — Practice makes perfect! 💪