Bài 2: Variables và Data Types

Mục Tiêu Bài Học

Sau khi hoàn thành bài này, bạn sẽ:

  • ✅ Hiểu variable là gì và cách sử dụng
  • ✅ Biết các kiểu dữ liệu cơ bản trong Python
  • ✅ Khai báo và sử dụng variables đúng cách
  • ✅ Chuyển đổi giữa các kiểu dữ liệu (type conversion)
  • ✅ Áp dụng naming conventions chuẩn

Câu Chuyện Về Cái Hộp

Hãy tưởng tượng bạn đang dọn dẹp phòng với rất nhiều đồ vật: sách vở, quần áo, đồ chơi, dụng cụ học tập... Tất cả đang nằm ngổn ngang khắp nơi.

Vấn đề:

  • 🤔 "Quyển sách Toán để đâu nhỉ?"
  • 🤔 "Cái bút đỏ tôi mới mua đâu rồi?"
  • 🤔 "Chiếc áo khoác nằm ở đống nào?"

Bạn phải lật tung cả phòng mỗi khi tìm thứ gì đó!

Giải pháp: Mua một số cái hộp, dán nhãn và sắp xếp:

📦 Hộp "Sách Giáo Khoa"   ├─ Sách Toán   ├─ Sách Văn   └─ Sách Anh 📦 Hộp "Văn Phòng Phẩm"   ├─ Bút đỏ   ├─ Bút xanh   └─ Tẩy, thước 📦 Hộp "Quần Áo"   ├─ Áo khoác   ├─ Áo thun   └─ Quần jeans

Kết quả:

  • ✅ Tìm đồ nhanh chóng: "Bút đỏ? Ở hộp Văn Phòng Phẩm!"
  • Tái sử dụng dễ dàng: Lấy ra, dùng xong bỏ lại vào
  • Thay đổi linh hoạt: Thêm bớt đồ trong hộp khi cần
  • Quản lý gọn gàng: Phòng luôn ngăn nắp

Trong lập trình cũng vậy! Khi code xử lý hàng trăm, hàng nghìn dữ liệu (tên người dùng, số tiền, điểm số...), bạn cần "cái hộp" để:

  • 📝 Lưu trữ dữ liệu vào bộ nhớ
  • 🏷️ Đặt tên dễ nhớ để tìm lại
  • 🔄 Sử dụng lại nhiều lần
  • ♻️ Thay đổi giá trị khi cần

Cái hộp đó chính là Variable!

Variables Là Gì?

Variable (biến) là "hộp chứa" để lưu trữ dữ liệu trong bộ nhớ. Bạn có thể đặt tên cho "hộp" này và sử dụng lại nhiều lần.

Analogy Đời Thực

Tủ lạnh (Variable)         → Tên: fridge├── Sữa (Value)           → Nội dung└── Đồ uống (Type)        → Loại Ví (Variable)              → Tên: wallet  ├── 500,000 VND (Value)   → Nội dung└── Tiền (Type)           → Loại

Tại Sao Cần Variables?

Không dùng variables:

print(25 * 1000)        # Tính lươngprint(25 * 1000 + 500)  # Tính tổngprint(25 * 1000 * 0.1)  # Tính thuế # Nếu cần đổi 25 thành 30, phải sửa nhiều chỗ!

Dùng variables:

working_hours = 25hourly_rate = 1000bonus = 500 salary = working_hours * hourly_ratetotal = salary + bonustax = salary * 0.1 print(salary)print(total)print(tax) # Muốn đổi giờ làm? Chỉ sửa 1 dòng!

Khai Báo Variables

Cú Pháp Cơ Bản

# Cú pháp: tên_biến = giá_trịname = "An"age = 25height = 1.75is_student = True

Lưu ý:

  • Dùng = để gán giá trị (assignment operator)
  • KHÔNG cần khai báo kiểu dữ liệu (Python tự nhận biết)
  • Phân biệt chữ hoa/thường (nameName)

Multiple Assignment

Gán nhiều giá trị cùng lúc:

# Cách 1: Multiple variables, multiple valuesx, y, z = 10, 20, 30print(x)  # 10print(y)  # 20print(z)  # 30 # Cách 2: Multiple variables, same valuea = b = c = 100print(a, b, c)  # 100 100 100 # Cách 3: Unpackingnumbers = [1, 2, 3]first, second, third = numbersprint(first)   # 1print(second)  # 2print(third)   # 3

Thay Đổi Giá Trị

Variables có thể thay đổi giá trị:

score = 0print(score)  # 0 score = 10print(score)  # 10 score = score + 5print(score)  # 15 # Hoặc viết ngắn gọnscore += 10print(score)  # 25

Data Types - Kiểu Dữ Liệu

Python có nhiều kiểu dữ liệu, nhưng chúng ta sẽ học 4 kiểu cơ bản nhất:

1. Integer (int) - Số Nguyên

Số nguyên, không có phần thập phân.

age = 25year = 2025temperature = -5large_number = 1000000 print(type(age))  # <class 'int'>

Ví dụ thực tế:

# Đếm số lượngstudents = 30books = 150 # Tính toántotal_students = students + 20print(f"Tổng số học sinh: {total_students}") # Số âmdebt = -5000000  # Nợ 5 triệu

Số lớn trong Python:

# Python xử lý số rất lớn!billion = 1000000000trillion = 1000000000000googol = 10 ** 100  # 1 theo sau 100 số 0 print(billion * trillion)  # Không bị overflow!

Định dạng số:

# Underscore để dễ đọc (Python 3.6+)population = 98_000_000  # 98 triệuprint(population)  # 98000000 # Binary, Octal, Hexadecimalbinary = 0b1010    # 10 in decimaloctal = 0o12       # 10 in decimal  hexa = 0xA         # 10 in decimal

2. Float - Số Thực

Số có phần thập phân.

pi = 3.14159height = 1.75price = 99.99temperature = -2.5 print(type(pi))  # <class 'float'>

Ví dụ thực tế:

# Tính tiềnproduct_price = 199.99tax_rate = 0.1total = product_price * (1 + tax_rate)print(f"Tổng tiền: {total:.2f}")  # 219.99 # Đo lườngweight = 65.5  # kgheight = 1.70  # mbmi = weight / (height ** 2)print(f"BMI: {bmi:.2f}")

Scientific Notation:

# Số rất lớn hoặc rất nhỏspeed_of_light = 3e8      # 3 × 10^8 = 300,000,000electron_mass = 9.1e-31   # 9.1 × 10^-31 print(speed_of_light)     # 300000000.0print(electron_mass)      # 9.1e-31

Float Precision:

# Lưu ý: Float không chính xác tuyệt đối!result = 0.1 + 0.2print(result)           # 0.30000000000000004 (!)print(result == 0.3)    # False # Giải pháp: làm trònprint(round(result, 2))  # 0.3

3. String (str) - Chuỗi

Chuỗi ký tự, dùng để lưu text.

name = "Nguyễn Văn An"email = '[email protected]'message = """Đây làchuỗi nhiều dòng""" print(type(name))  # <class 'str'>

Single vs Double Quotes:

# Cả hai đều OKtext1 = "Hello"text2 = 'Hello' # Dùng quotes trong stringquote1 = "He said 'Hello'"quote2 = 'She said "Hi"' # Escape charactersquote3 = "He said \"Hello\""quote4 = 'It\'s a beautiful day'

String Operations:

# Concatenation (nối chuỗi)first_name = "An"last_name = "Nguyen"full_name = first_name + " " + last_nameprint(full_name)  # An Nguyen # Repetition (lặp lại)separator = "-" * 20print(separator)  # -------------------- # Length (độ dài)text = "Python"print(len(text))  # 6

String Indexing:

text = "Python"#       012345  (index từ trái)#      -654321  (index từ phải) print(text[0])   # P (ký tự đầu)print(text[5])   # n (ký tự cuối)print(text[-1])  # n (ký tự cuối, cách khác)print(text[-6])  # P (ký tự đầu, cách khác)

String Slicing:

text = "Python Programming"#       0123456789... print(text[0:6])    # Python (từ 0 đến 5)print(text[:6])     # Python (từ đầu đến 5)print(text[7:])     # Programming (từ 7 đến cuối)print(text[-11:])   # Programmingprint(text[::2])    # Pto rgamn (mỗi ký tự thứ 2)print(text[::-1])   # gnimmargorP nohtyP (đảo ngược)

String Methods:

text = "  Hello World  " print(text.upper())       # "  HELLO WORLD  "print(text.lower())       # "  hello world  "print(text.strip())       # "Hello World" (xóa khoảng trắng)print(text.replace("Hello", "Hi"))  # "  Hi World  "print(text.split())       # ['Hello', 'World'] # Check methodsemail = "[email protected]"print(email.startswith("user"))   # Trueprint(email.endswith(".com"))     # Trueprint("123".isdigit())            # Trueprint("abc".isalpha())            # True

String Formatting:

name = "An"age = 25 # Cách 1: Concatenation (cũ, không khuyến nghị)msg1 = "Tên: " + name + ", Tuổi: " + str(age) # Cách 2: format() methodmsg2 = "Tên: {}, Tuổi: {}".format(name, age) # Cách 3: f-strings (Python 3.6+, khuyến nghị)msg3 = f"Tên: {name}, Tuổi: {age}" print(msg3)

f-strings Advanced:

price = 199.99quantity = 3 # Expressions trong f-stringsprint(f"Tổng: {price * quantity}") # Formattingprint(f"Giá: {price:.2f} VND")      # 2 chữ số thập phânprint(f"Số lượng: {quantity:03d}")  # Pad với 0, width 3 # Alignmentname = "An"print(f"|{name:<10}|")  # Left align:  |An        |print(f"|{name:>10}|")  # Right align: |        An|print(f"|{name:^10}|")  # Center:      |    An    |

4. Boolean (bool) - True/False

Chỉ có 2 giá trị: True hoặc False.

is_logged_in = Truehas_permission = Falseis_admin = True print(type(is_logged_in))  # <class 'bool'>

Boolean từ Comparisons:

age = 25 print(age > 18)      # Trueprint(age == 25)     # Trueprint(age < 20)      # Falseprint(age != 30)     # True # String comparisonname = "An"print(name == "An")   # Trueprint(name == "Binh") # False

Boolean Logic:

is_adult = Truehas_id = True # AND: Cả hai đều Truecan_vote = is_adult and has_idprint(can_vote)  # True # OR: Một trong hai Trueis_weekend = Falseis_holiday = Trueis_day_off = is_weekend or is_holidayprint(is_day_off)  # True # NOT: Đảo ngượcis_working = not is_day_offprint(is_working)  # False

Truthy và Falsy Values:

# Falsy values (coi như False)print(bool(0))          # Falseprint(bool(0.0))        # Falseprint(bool(""))         # False (empty string)print(bool([]))         # False (empty list)print(bool(None))       # False # Truthy values (coi như True)print(bool(1))          # Trueprint(bool(-1))         # Trueprint(bool("Hello"))    # Trueprint(bool([1, 2]))     # True

Type Checking

Kiểm tra kiểu dữ liệu của variable:

age = 25name = "An"height = 1.75is_student = True print(type(age))        # <class 'int'>print(type(name))       # <class 'str'>print(type(height))     # <class 'float'>print(type(is_student)) # <class 'bool'> # isinstance() - Cách tốt hơnprint(isinstance(age, int))      # Trueprint(isinstance(name, str))     # Trueprint(isinstance(height, float)) # True

Type Conversion (Casting)

Chuyển đổi giữa các kiểu dữ liệu.

String ↔ Number

# String → Intage_str = "25"age_int = int(age_str)print(age_int + 5)  # 30 # String → Floatprice_str = "199.99"price_float = float(price_str)print(price_float * 2)  # 399.98 # Number → Stringage = 25age_str = str(age)print("Tuổi: " + age_str) # Int → Floatnum = 10num_float = float(num)print(num_float)  # 10.0 # Float → Int (mất phần thập phân)price = 199.99price_int = int(price)print(price_int)  # 199

Input Conversion

# input() luôn trả về string!age_str = input("Tuổi của bạn? ")print(type(age_str))  # <class 'str'> # Phải convert sang intage = int(age_str)next_year = age + 1print(f"Năm sau bạn {next_year} tuổi")

Conversion Errors

# Lỗi khi converttry:    num = int("abc")  # ValueError!except ValueError:    print("Không thể convert 'abc' sang số") try:    num = int("12.5")  # ValueError!except ValueError:    print("Dùng float() cho số thập phân")    num = float("12.5")  # OK

Naming Conventions

Quy Tắc Bắt Buộc

# ✅ ĐÚNGname = "An"user_age = 25_private = "secret"total2024 = 1000 # ❌ SAI2name = "An"           # Không bắt đầu bằng sốuser-age = 25          # Không dùng dấu gạch nganguser age = 25          # Không có khoảng trắngclass = "A"            # Không dùng keywords của Python

Snake_case Convention

Python style guide (PEP 8) khuyến nghị snake_case cho variables:

# ✅ ĐÚNG (snake_case)first_name = "An"total_amount = 1000is_logged_in = Trueuser_email_address = "[email protected]" # ❌ Tránh (camelCase - dùng cho JavaScript)firstName = "An"totalAmount = 1000 # ❌ Tránh (PascalCase - dùng cho Classes)FirstName = "An"TotalAmount = 1000

Descriptive Names

# ❌ Tên không rõ nghĩaa = 25x = "An"temp = 199.99 # ✅ Tên mô tả rõ rànguser_age = 25user_name = "An"product_price = 199.99

Constants

Constants (hằng số) dùng UPPER_CASE:

# Constants (giá trị không đổi)PI = 3.14159MAX_USERS = 1000DEFAULT_TIMEOUT = 30API_KEY = "abc123xyz" # Sử dụngradius = 5area = PI * radius ** 2print(f"Diện tích: {area}")

Ví Dụ Thực Tế

1. Profile Information

# User profileusername = "nguyenvanan"full_name = "Nguyễn Văn An"age = 25height = 1.75weight = 70.5is_premium_member = Trueaccount_balance = 500000.50 # Display profileprint("=" * 40)print("THÔNG TIN HỒ SƠ")print("=" * 40)print(f"Username: {username}")print(f"Họ tên: {full_name}")print(f"Tuổi: {age}")print(f"Chiều cao: {height}m")print(f"Cân nặng: {weight}kg")print(f"Premium: {'Có' if is_premium_member else 'Không'}")print(f"Số dư: {account_balance:,.2f} VND")print("=" * 40) # Calculate BMIbmi = weight / (height ** 2)print(f"\nChỉ số BMI: {bmi:.2f}") if bmi < 18.5:    print("Trạng thái: Gầy")elif bmi < 25:    print("Trạng thái: Bình thường")else:    print("Trạng thái: Thừa cân")

2. Shopping Cart

# Product informationproduct_name = "Laptop Dell XPS 15"unit_price = 25000000  # 25 triệuquantity = 2discount_percent = 10 # Calculatesubtotal = unit_price * quantitydiscount_amount = subtotal * discount_percent / 100tax_amount = (subtotal - discount_amount) * 0.1total = subtotal - discount_amount + tax_amount # Displayprint(f"Sản phẩm: {product_name}")print(f"Đơn giá: {unit_price:,} VND")print(f"Số lượng: {quantity}")print(f"-" * 40)print(f"Tạm tính: {subtotal:,} VND")print(f"Giảm giá ({discount_percent}%): -{discount_amount:,} VND")print(f"Thuế VAT (10%): {tax_amount:,} VND")print(f"=" * 40)print(f"TỔNG CỘNG: {total:,.0f} VND")

3. Temperature Converter

# Inputcelsius = float(input("Nhập nhiệt độ (°C): ")) # Convertfahrenheit = celsius * 9/5 + 32kelvin = celsius + 273.15 # Displayprint(f"\n{celsius}°C =")print(f"  {fahrenheit:.2f}°F")print(f"  {kelvin:.2f}K") # Statusif celsius < 0:    status = "Đóng băng"elif celsius < 20:    status = "Lạnh"elif celsius < 30:    status = "Mát"else:    status = "Nóng"    print(f"\nTrạng thái: {status}")

Bài Tập Thực Hành

Bài 1: Personal Info

Khai báo variables lưu thông tin cá nhân:

  • Họ tên, tuổi, email, số điện thoại
  • In ra màn hình dạng profile card

Bài 2: Math Calculator

Nhập 2 số, tính và hiển thị:

  • Tổng, hiệu, tích, thương
  • Lũy thừa, chia lấy dư
  • Format đẹp với 2 chữ số thập phân

Bài 3: String Manipulation

Nhập họ tên đầy đủ, xuất ra:

  • Chữ hoa toàn bộ
  • Chữ thường toàn bộ
  • Chữ cái đầu viết hoa
  • Số ký tự
  • Đảo ngược chuỗi

Bài 4: Type Conversion Challenge

Input: "25", "30.5", "100"

  • Convert và tính tổng
  • Tính trung bình
  • Tìm số lớn nhất

Bài 5: Complex Calculation

Tính lương nhân viên:

  • Input: số giờ làm, lương/giờ, phụ cấp
  • Tính: lương cơ bản, thuế 10%, thưởng 5%
  • Output: lương net format đẹp

Tóm Tắt

✅ Variables là "hộp chứa" lưu trữ data
✅ 4 kiểu dữ liệu cơ bản: int, float, str, bool
✅ Dùng type() hoặc isinstance() để check type
✅ Type conversion: int(), float(), str(), bool()
✅ Naming: snake_case, mô tả rõ ràng
✅ Constants: UPPER_CASE
✅ f-strings cho string formatting

Bài Tiếp Theo

Bài 3: Operators - Học các toán tử để thực hiện phép tính và so sánh dữ liệu.


Remember:

  • Variables là nền tảng của mọi chương trình
  • Đặt tên biến rõ ràng giúp code dễ đọc
  • Luôn check và convert type khi cần
  • Practice với nhiều ví dụ thực tế!