Bài 2: Variables và Data Types

Bài học về variables và data types trong Python - cách khai báo biến, kiểu dữ liệu cơ bản (int, float, str, bool), type conversion, type checking và naming conventions chuẩn.

14/05/2026
15 phút đọc
3 lượt xem
1

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
2

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!

3

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ương
print(25 * 1000 + 500)  # Tính tổng
print(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 = 25
hourly_rate = 1000
bonus = 500

salary = working_hours * hourly_rate
total = salary + bonus
tax = salary * 0.1

print(salary)
print(total)
print(tax)

# Muốn đổi giờ làm? Chỉ sửa 1 dòng!
4

Khai Báo Variables

Cú Pháp Cơ Bản

# Cú pháp: tên_biến = giá_trị
name = "An"
age = 25
height = 1.75
is_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 values
x, y, z = 10, 20, 30
print(x)  # 10
print(y)  # 20
print(z)  # 30

# Cách 2: Multiple variables, same value
a = b = c = 100
print(a, b, c)  # 100 100 100

# Cách 3: Unpacking
numbers = [1, 2, 3]
first, second, third = numbers
print(first)   # 1
print(second)  # 2
print(third)   # 3

Thay Đổi Giá Trị

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

score = 0
print(score)  # 0

score = 10
print(score)  # 10

score = score + 5
print(score)  # 15

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

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 = 25
year = 2025
temperature = -5
large_number = 1000000

print(type(age))  # <class 'int'>

Ví dụ thực tế:

# Đếm số lượng
students = 30
books = 150

# Tính toán
total_students = students + 20
print(f"Tổng số học sinh: {total_students}")

# Số âm
debt = -5000000  # Nợ 5 triệu

Số lớn trong Python:

# Python xử lý số rất lớn!
billion = 1000000000
trillion = 1000000000000
googol = 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ệu
print(population)  # 98000000

# Binary, Octal, Hexadecimal
binary = 0b1010    # 10 in decimal
octal = 0o12       # 10 in decimal  
hexa = 0xA         # 10 in decimal

2. Float - Số Thực

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

pi = 3.14159
height = 1.75
price = 99.99
temperature = -2.5

print(type(pi))  # <class 'float'>

Ví dụ thực tế:

# Tính tiền
product_price = 199.99
tax_rate = 0.1
total = product_price * (1 + tax_rate)
print(f"Tổng tiền: {total:.2f}")  # 219.99

# Đo lường
weight = 65.5  # kg
height = 1.70  # m
bmi = 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,000
electron_mass = 9.1e-31   # 9.1 × 10^-31

print(speed_of_light)     # 300000000.0
print(electron_mass)      # 9.1e-31

Float Precision:

# Lưu ý: Float không chính xác tuyệt đối!
result = 0.1 + 0.2
print(result)           # 0.30000000000000004 (!)
print(result == 0.3)    # False

# Giải pháp: làm tròn
print(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 OK
text1 = "Hello"
text2 = 'Hello'

# Dùng quotes trong string
quote1 = "He said 'Hello'"
quote2 = 'She said "Hi"'

# Escape characters
quote3 = "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_name
print(full_name)  # An Nguyen

# Repetition (lặp lại)
separator = "-" * 20
print(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:])   # Programming
print(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 methods
email = "[email protected]"
print(email.startswith("user"))   # True
print(email.endswith(".com"))     # True
print("123".isdigit())            # True
print("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() method
msg2 = "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.99
quantity = 3

# Expressions trong f-strings
print(f"Tổng: {price * quantity}")

# Formatting
print(f"Giá: {price:.2f} VND")      # 2 chữ số thập phân
print(f"Số lượng: {quantity:03d}")  # Pad với 0, width 3

# Alignment
name = "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 = True
has_permission = False
is_admin = True

print(type(is_logged_in))  # <class 'bool'>

Boolean từ Comparisons:

age = 25

print(age > 18)      # True
print(age == 25)     # True
print(age < 20)      # False
print(age != 30)     # True

# String comparison
name = "An"
print(name == "An")   # True
print(name == "Binh") # False

Boolean Logic:

is_adult = True
has_id = True

# AND: Cả hai đều True
can_vote = is_adult and has_id
print(can_vote)  # True

# OR: Một trong hai True
is_weekend = False
is_holiday = True
is_day_off = is_weekend or is_holiday
print(is_day_off)  # True

# NOT: Đảo ngược
is_working = not is_day_off
print(is_working)  # False

Truthy và Falsy Values:

# Falsy values (coi như False)
print(bool(0))          # False
print(bool(0.0))        # False
print(bool(""))         # False (empty string)
print(bool([]))         # False (empty list)
print(bool(None))       # False

# Truthy values (coi như True)
print(bool(1))          # True
print(bool(-1))         # True
print(bool("Hello"))    # True
print(bool([1, 2]))     # True
6

Type Checking

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

age = 25
name = "An"
height = 1.75
is_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ơn
print(isinstance(age, int))      # True
print(isinstance(name, str))     # True
print(isinstance(height, float)) # True
7

Type Conversion (Casting)

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

String ↔ Number

# String → Int
age_str = "25"
age_int = int(age_str)
print(age_int + 5)  # 30

# String → Float
price_str = "199.99"
price_float = float(price_str)
print(price_float * 2)  # 399.98

# Number → String
age = 25
age_str = str(age)
print("Tuổi: " + age_str)

# Int → Float
num = 10
num_float = float(num)
print(num_float)  # 10.0

# Float → Int (mất phần thập phân)
price = 199.99
price_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 int
age = int(age_str)
next_year = age + 1
print(f"Năm sau bạn {next_year} tuổi")

Conversion Errors

# Lỗi khi convert
try:
    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
8

Naming Conventions

Quy Tắc Bắt Buộc

# ✅ ĐÚNG
name = "An"
user_age = 25
_private = "secret"
total2024 = 1000

# ❌ SAI
2name = "An"           # Không bắt đầu bằng số
user-age = 25          # Không dùng dấu gạch ngang
user age = 25          # Không có khoảng trắng
class = "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 = 1000
is_logged_in = True
user_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ĩa
a = 25
x = "An"
temp = 199.99

# ✅ Tên mô tả rõ ràng
user_age = 25
user_name = "An"
product_price = 199.99

Constants

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

# Constants (giá trị không đổi)
PI = 3.14159
MAX_USERS = 1000
DEFAULT_TIMEOUT = 30
API_KEY = "abc123xyz"

# Sử dụng
radius = 5
area = PI * radius ** 2
print(f"Diện tích: {area}")
9

Ví Dụ Thực Tế

1. Profile Information

# User profile
username = "nguyenvanan"
full_name = "Nguyễn Văn An"
age = 25
height = 1.75
weight = 70.5
is_premium_member = True
account_balance = 500000.50

# Display profile
print("=" * 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 BMI
bmi = 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 information
product_name = "Laptop Dell XPS 15"
unit_price = 25000000  # 25 triệu
quantity = 2
discount_percent = 10

# Calculate
subtotal = unit_price * quantity
discount_amount = subtotal * discount_percent / 100
tax_amount = (subtotal - discount_amount) * 0.1
total = subtotal - discount_amount + tax_amount

# Display
print(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

# Input
celsius = float(input("Nhập nhiệt độ (°C): "))

# Convert
fahrenheit = celsius * 9/5 + 32
kelvin = celsius + 273.15

# Display
print(f"\n{celsius}°C =")
print(f"  {fahrenheit:.2f}°F")
print(f"  {kelvin:.2f}K")

# Status
if 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}")
10

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
11

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

12

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ế!