Skip to content

P02: Biến & Kiểu dữ liệu

Tác giả: Hà Trí Kiên
Chủ đề: Biến, kiểu dữ liệu, chuyển đổi kiểu, toán tử gán


1. Biến là gì?

Biến là chiếc hộp để lưu trữ dữ liệu. Bạn đặt tên cho hộp, rồi cho dữ liệu vào.

flowchart LR
    subgraph Biến
        name["name"] --> value["'Alice'"]
        age["age"] --> value2["15"]
        score["score"] --> value3["9.5"]
    end
1
2
3
4
name = "Alice"    # Biến name lưu chuỗi "Alice"
age = 15          # Biến age lưu số nguyên 15
score = 9.5       # Biến score lưu số thực 9.5
is_student = True # Biến is_student lưu giá trị True

Đặc điểm biến Python

  • Không cần khai báo kiểu — Python tự nhận diện
  • Có thể gán lại kiểu khác: x = 5 rồi x = "hello" — OK!
  • Phân biệt chữ hoa: nameName là 2 biến khác nhau

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

# ĐÚNG
ten = "Alice"
ten_hoc_sinh = "Bob"       # snake_case (khuyến nghị trong Python)
tenHocSinh = "Charlie"     # camelCase (ít dùng trong Python)
TenHocSinh2 = "David"      # Có số
_private = "Bí mật"        # Bắt đầu bằng _

# SAI
2ten = "Eve"               # Không bắt đầu bằng số
ten-hoc-sinh = "Frank"     # Không dùng dấu gạch ngang
ten hoc sinh = "Grace"     # Không có khoảng trắng
class = "10A1"             # Không dùng từ khóa Python

Quy tắc đặt tên trong thi đấu

  • Dùng ngắn gọn: n, m, a, b, x, y
  • Dùng snake_case cho biến dài: max_value, is_prime
  • Tránh tên trùng từ khóa: if, else, for, while, class, return, import, True, False, None

Từ khóa Python (không được dùng làm tên biến)

1
2
3
4
5
6
7
import keyword
print(keyword.kwlist)
# ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await',
#  'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except',
#  'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is',
#  'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return',
#  'try', 'while', 'with', 'yield']

3. Các kiểu dữ liệu cơ bản

3.1. Số nguyên (int)

1
2
3
4
x = 42
y = -10
z = 0
big = 1000000000000000000  # Python xử lý số nguyên BẤT KỲ kích thước!

Python không tràn số!

Khác với C++, Python có thể lưu số nguyên lớn bất kỳ. Đây là ưu điểm lớn khi thi đấu.

1
2
3
4
5
# Tính giai thừa 100 — không vấn đề!
result = 1
for i in range(1, 101):
    result *= i
print(result)  # Số rất lớn, Python xử lý OK

3.2. Số thực (float)

1
2
3
pi = 3.14159
temperature = -5.5
speed = 1.0

Lưu ý số thực

  • Số thực trong máy tính không chính xác tuyệt đối
  • 0.1 + 0.2 = 0.30000000000000004 (không phải 0.3!)
  • Khi so sánh: dùng abs(a - b) < 1e-9 thay vì a == b
1
2
3
4
5
6
7
# SAI
if 0.1 + 0.2 == 0.3:
    print("Bằng")  # Không in ra!

# ĐÚNG
if abs(0.1 + 0.2 - 0.3) < 1e-9:
    print("Bằng")  # In ra!

3.3. Chuỗi (str)

1
2
3
4
name = "Alice"
greeting = 'Hello'        # Dùng nháy đơn hoặc nháy kép đều được
message = """Đây là
chuỗi nhiều dòng"""

3.4. Boolean (bool)

is_student = True
is_passed = False

Boolean thường là kết quả của phép so sánh:

1
2
3
4
5
x = 10
print(x > 5)     # True
print(x < 5)     # False
print(x == 10)   # True
print(x != 10)   # False

3.5. Giá trị None

1
2
3
result = None  # Biến chưa có giá trị
print(result)  # None
print(type(result))  # <class 'NoneType'>

4. Hàm type() — Kiểm tra kiểu dữ liệu

x = 42
print(type(x))        # <class 'int'>

y = 3.14
print(type(y))        # <class 'float'>

s = "Hello"
print(type(s))        # <class 'str'>

b = True
print(type(b))        # <class 'bool'>

5. Chuyển đổi kiểu (Type Casting)

flowchart LR
    str["str"] --> |"int()"| int["int"]
    int --> |"str()"| str
    str --> |"float()"| float["float"]
    float --> |"str()"| str
    int --> |"float()"| float
    float --> |"int()"| int
    int --> |"bool()"| bool["bool"]

String → Số

1
2
3
4
5
6
7
8
s = "42"
n = int(s)        # 42 (số nguyên)

s = "3.14"
x = float(s)      # 3.14 (số thực)

# LƯU Ý: Không thể int("3.14") → ValueError
# Phải int(float("3.14")) = int(3.14) = 3

Số → String

1
2
3
4
5
n = 42
s = str(n)        # "42"

x = 3.14
s = str(x)        # "3.14"

Boolean

1
2
3
4
5
6
7
bool(0)        # False
bool("")       # False
bool([])       # False
bool(None)     # False
bool(1)        # True (mọi thứ khác 0, "", [], None đều True)
bool("hello")  # True
bool([1,2,3])  # True

Kiểm tra isinstance()

1
2
3
4
x = 42
print(isinstance(x, int))          # True
print(isinstance(x, float))        # False
print(isinstance(x, (int, float))) # True (x là int hoặc float)

6. Toán tử gán

# Gán cơ bản
x = 10

# Gán nhiều biến cùng lúc
a, b, c = 1, 2, 3
x, y = y, x  # Hoán đổi giá trị!

# Gán cùng giá trị
a = b = c = 0

# Gán tăng cường
x += 5    # x = x + 5 → 15
x -= 3    # x = x - 3 → 12
x *= 2    # x = x * 2 → 24
x /= 4    # x = x / 4 → 6.0
x //= 2   # x = x // 2 → 3.0
x %= 2    # x = x % 2 → 1.0
x **= 3   # x = x ** 3 → 1.0

Unpacking — Gán nhiều biến

# Unpack list/tuple
a, b, c = [1, 2, 3]
a, b, c = (1, 2, 3)

# Unpack với *
a, *b = [1, 2, 3, 4, 5]  # a=1, b=[2,3,4,5]
*a, b = [1, 2, 3, 4, 5]  # a=[1,2,3,4], b=5
a, *b, c = [1, 2, 3, 4, 5]  # a=1, b=[2,3,4], c=5

# Swap (hoán đổi)
a, b = 10, 20
a, b = b, a  # a=20, b=10

7. Hằng số trong Python

Python không có hằng số thực sự (không thể ngăn gán lại). Theo quy ước:

1
2
3
4
5
PI = 3.14159          # Viết HOA để biểu thị hằng số
MAX_N = 1000000       # Giới hạn tối đa
INF = float('inf')    # Vô cực
NEG_INF = float('-inf')  # Âm vô cực
MOD = 10**9 + 7       # Modulo trong thi đấu

Các hằng số thường dùng trong thi đấu

1
2
3
4
5
INF = float('inf')      # Vô cực
NEG_INF = float('-inf') # Âm vô cực
MOD = 10**9 + 7         # 10^9 + 7
MOD2 = 998244353        # 998244353
EPS = 1e-9              # Sai số cho số thực

8. Biến toàn cục và cục bộ

x = 10  # Biến toàn cục (global)

def my_func():
    y = 20  # Biến cục bộ (local)
    print(x)  # OK — đọc được biến toàn cục
    print(y)  # OK

my_func()
print(x)  # OK
# print(y)  # Lỗi! y không tồn tại ngoài hàm

9. Lưu ý / Cạm bẫy hay gặp

Bẫy 1: Chia lấy nguyên vs chia thường

1
2
3
4
5
6
7
8
# Chia thường: trả về float
7 / 2     # 3.5

# Chia lấy nguyên: trả về int
7 // 2    # 3

# Lấy dư
7 % 2     # 1

Bẫy 2: Gán tham chiếu vs copy

# SAI: Cùng tham chiếu
a = [1, 2, 3]
b = a          # b trỏ cùng vùng nhớ
b.append(4)
print(a)       # [1, 2, 3, 4] — a cũng bị thay đổi!

# ĐÚNG: Copy
a = [1, 2, 3]
b = a.copy()   # hoặc b = a[:]
b.append(4)
print(a)       # [1, 2, 3] — a không bị thay đổi

Bẫy 3: float("inf") so sánh được

1
2
3
4
INF = float('inf')
print(INF > 10**18)  # True — vô cực lớn hơn mọi số
print(INF == INF)     # True
print(INF + 1)        # inf — vô cực + 1 vẫn vô cực

Bẫy 4: Boolean là subclass của int

1
2
3
print(True + True)   # 2
print(True * 10)     # 10
print(False + 5)     # 5

10. Bài tập thực hành

Bài 1: Hoán đổi 2 biến

Cho a = 5, b = 10. Hoán đổi giá trị và in ra.

Lời giải
a, b = b, a

Bài 2: Tính diện tích hình tròn

Cho bán kính r. Tính diện tích hình tròn (S = π × r²).

Lời giải
1
2
3
4
import math
r = float(input())
s = math.pi * r ** 2
print(f"{s:.2f}")

Bài 3: Chuyển đổi nhiệt độ

Cho nhiệt độ C độ C. Chuyển sang độ F (F = C × 9/5 + 32).

Lời giải
1
2
3
C = float(input())
F = C * 9 / 5 + 32
print(f"{F:.1f}")

Bài 4: Kiểm tra kiểu dữ liệu

Cho biến x. In ra kiểu dữ liệu của x.

Lời giải
print(type(x).__name__)  # int

11. Bài tập luyện tập

Bài Nền tảng Độ khó Chủ đề
AtCoder - Product AtCoder Biến, phép tính
CSES - Weird Algorithm CSES Biến, gán giá trị

Bài viết liên quan


Bài trước: P01: Cài đặt & Hello World
Bài tiếp theo: P03: Nhập/Xuất dữ liệu →


💬 Bình luận