Bài 17: Biến và lệnh gán – Lý thuyết, Sơ đồ tư duy

I. Lý thuyết trọng tâm

1. Biến và lệnh gán

a) Biến là gì?

Trong toán học, ta dùng chữ cái (a, b, x, y…) để đại diện cho các giá trị số. Trong lập trình cũng tương tự: biến (variable) là tên gọi của một vùng nhớ trong máy tính, dùng để lưu trữ giá trị. Giá trị này có thể thay đổi trong quá trình chương trình hoạt động.

Khác với nhiều ngôn ngữ lập trình khác, Python không yêu cầu khai báo kiểu dữ liệu trước — kiểu dữ liệu của biến được xác định tự động tại thời điểm gán giá trị.

b) Lệnh gán

Biến trong Python được tạo ra thông qua lệnh gán. Cú pháp:

<biến> = <biểu thức>

Khi thực hiện lệnh gán, Python sẽ tính giá trị của <biểu thức> bên phải, rồi lưu kết quả vào <biến> bên trái. Nếu biến chưa tồn tại, Python tự động tạo mới.

>>> x = 5          # x được tạo, gán giá trị 5, kiểu số nguyên
>>> y = "Tin học 10"  # y được tạo, gán xâu kí tự, kiểu string
>>> z = x / 2      # z = 2.5, kiểu số thực (vì phép chia / cho số thực)

Các dạng gán quan trọng:

Dạng gán Ví dụ Giải thích
Gán giá trị trực tiếp x = 5 Gán số 5 cho biến x
Gán biểu thức z = x + y * 2 Tính biểu thức rồi gán kết quả cho z
Gán đồng thời cùng giá trị x = y = 1 Cả x và y đều nhận giá trị 1
Gán đồng thời nhiều giá trị x, y, z = 10, 5, 1 x = 10, y = 5, z = 1

Cú pháp gán đồng thời:

<var1>, <var2>, ..., <varn> = <gt1>, <gt2>, ..., <gtn>

Lưu ý: số biến bên trái phải bằng số giá trị bên phải dấu =.

Điều quan trọng: Mọi biến xuất hiện trong biểu thức bên phải phải được gán giá trị trước đó, nếu không Python sẽ báo lỗi NameError.

Chú ý về kiểu dữ liệu: Không thể thực hiện phép toán giữa các biến có kiểu dữ liệu khác nhau một cách tùy ý. Ví dụ, nếu x = 5 (số nguyên) và y = "abc" (xâu kí tự), lệnh z = x + y sẽ gây lỗi vì không thể cộng số với xâu.

c) Quy tắc đặt tên biến

Tên biến trong Python phải tuân theo ba quy tắc:

Quy tắc Hợp lệ Không hợp lệ
Chỉ gồm chữ cái tiếng Anh (a–z, A–Z), chữ số (0–9) và dấu gạch dưới _ _name, xyzABC, so_1 m123&b (có kí tự &), My country (có dấu cách)
Không bắt đầu bằng chữ số x1, _test 12abc (bắt đầu bằng số), 123a
Phân biệt chữ hoa và chữ thường NamenameNAME

Câu hỏi kiểm tra nhanh (SGK): Các tên biến nào dưới đây là hợp lệ trong Python?

Tên biến Hợp lệ? Lí do
A. _name ✔️ Bắt đầu bằng _, chỉ chứa chữ cái và gạch dưới
B. 12abc Bắt đầu bằng chữ số
C. My country Có dấu cách (khoảng trắng)
D. m123&b Có kí tự đặc biệt &
E. xyzABC ✔️ Chỉ chứa chữ cái

2. Các phép toán trên kiểu dữ liệu cơ bản

a) Bảy phép toán với kiểu số

Phép toán Kí hiệu Ví dụ Kết quả Ghi chú
Cộng + 10 + 3 13
Trừ - 10 - 3 7
Nhân * 10 * 3 30
Chia / 10 / 3 3.333... Luôn trả về số thực
Chia lấy thương nguyên // 10 // 3 3 Lấy phần nguyên của phép chia
Chia lấy số dư % 10 % 3 1 Lấy phần dư của phép chia
Lũy thừa ** 2 ** 3 8 $2^3 = 8$

Mối liên hệ giữa //%: Với hai số nguyên ab, luôn có đẳng thức:

$$a = (a // b) \times b + a % b$$

Ví dụ: a = 10, b = 3(10 // 3) * 3 + 10 % 3 = 3 * 3 + 1 = 10 ✔️

b) Thứ tự ưu tiên các phép toán

Mức ưu tiên Phép toán Chiều thực hiện
1 (cao nhất) ** (lũy thừa) Phải sang trái
2 *, /, //, % Trái sang phải
3 (thấp nhất) +, - Trái sang phải

Lưu ý đặc biệt: Phép lũy thừa ** thực hiện từ phải sang trái, khác với mọi phép toán khác. Ví dụ: 4**2**3 tương đương 4**(2**3) = 4**8 = 65536, chứ không phải (4**2)**3 = 16**3 = 4096.

Nếu biểu thức có dấu ngoặc (), phần trong ngoặc luôn được ưu tiên tính trước.

Ví dụ phân tích thứ tự (SGK):

>>> 3/2 + 4*2**4 - 5//2**2

Tương đương với:

>>> 3/2 + 4*(2**4) - 5//(2**2)

Tính từng phần: 3/2 = 1.5, 2**4 = 164*16 = 64, 2**2 = 45//4 = 1

Kết quả: 1.5 + 64 - 1 = 64.5

c) Quy tắc kiểu dữ liệu kết quả

  • Phép / luôn trả về số thực (float), kể cả chia hết.
  • Nếu biểu thức có cả số thực và số nguyên → kết quả là số thực.
  • Phép //% giữa hai số nguyên → kết quả là số nguyên.

d) Hai phép toán với xâu kí tự

Phép toán Kí hiệu Ví dụ Kết quả
Nối xâu + "Hà Nội" + "Việt Nam" 'Hà NộiViệt Nam'
Lặp xâu * "123" * 5 '123123123123123'

Lưu ý:

  • Phép + chỉ nối hai xâu, không tự thêm dấu cách giữa chúng.
  • Phép * n với n ≤ 0 cho kết quả là xâu rỗng ''.
  • Xâu rỗng "" nhân với bất kì số nào cũng cho xâu rỗng.

3. Từ khóa (keyword)

Từ khóa là các từ tiếng Anh đặc biệt mà Python đã “giữ chỗ” để dùng vào mục đích riêng của ngôn ngữ. Khi đặt tên biến, không được trùng với từ khóa.

Một số từ khóa trong Python 3.x:

False break else if not as from while
None class except import or assert global with
True continue finally in pass del lambda yield
and def for is raise elif nonlocal try

Ví dụ lỗi khi đặt tên biến trùng từ khóa:

>>> if = 12
SyntaxError: invalid syntax    # "if" là từ khóa → không dùng làm tên biến

>>> with = "Độ rộng"
SyntaxError: invalid syntax    # "with" là từ khóa → không dùng làm tên biến

Câu hỏi kiểm tra nhanh (SGK): Các tên biến sau có hợp lệ không?

Tên biến Hợp lệ? Lí do
a) _if ✔️ Có dấu _ đứng trước, không trùng từ khóa if
b) global Trùng từ khóa global
c) nolocal ✔️ Không trùng từ khóa nonlocal (thiếu chữ n)
d) return Trùng từ khóa return
e) true ✔️ Không trùng từ khóa True (Python phân biệt hoa/thường: trueTrue)

II. Phương pháp giải các dạng bài tập

Dạng 1: Kiểm tra tên biến hợp lệ

Phương pháp:

Kiểm tra lần lượt 3 điều kiện + 1 ràng buộc:

  • Điều kiện 1: Chỉ chứa chữ cái (a–z, A–Z), chữ số (0–9), dấu gạch dưới _? → Nếu có kí tự khác (dấu cách, &, @, -…) → không hợp lệ.
  • Điều kiện 2: Kí tự đầu tiên có phải chữ số không? → Nếu bắt đầu bằng số → không hợp lệ.
  • Điều kiện 3: Có trùng với từ khóa Python không? → Nếu trùng → không hợp lệ.

Lưu ý: Python phân biệt hoa/thường, nên trueTrue, IFif. Chỉ đúng chính xác mới bị coi là trùng từ khóa.

Bài tập mẫu (SGK – Luyện tập, bài 1):

>>> x = 1
>>> 123a = x + 1
SyntaxError: invalid syntax

Lệnh trên có lỗi gì?

Lời giải: Tên biến 123a bắt đầu bằng chữ số → vi phạm quy tắc đặt tên biến → Python báo lỗi cú pháp (SyntaxError).

Dạng 2: Truy vết giá trị biến sau chuỗi lệnh gán

Phương pháp:

  • Bước 1: Thực hiện các lệnh theo thứ tự từ trên xuống dưới.
  • Bước 2: Với mỗi lệnh gán, tính giá trị biểu thức bên phải trước (dùng giá trị hiện tại của các biến), sau đó gán kết quả cho biến bên trái.
  • Bước 3: Cập nhật giá trị mới của biến, tiếp tục lệnh kế tiếp.

Cẩn thận với lệnh gán đồng thời: a, b = a+b, a-b → Python tính cả hai vế phải trước (dùng giá trị cũ của a, b), rồi mới gán đồng thời.

Bài tập mẫu 1 (SGK – Câu hỏi mục 1, bài 2): Sau các lệnh dưới đây, x và y nhận giá trị bao nhiêu?

>>> x = 10
>>> y = x**2 - 1
>>> x = x//2 + y%2

Lời giải:

Bước Lệnh Tính toán Giá trị biến
1 x = 10 x = 10
2 y = x**2 - 1 $10^2 – 1 = 100 – 1 = 99$ x = 10, y = 99
3 x = x//2 + y%2 $10 // 2 + 99 % 2 = 5 + 1 = 6$ x = 6, y = 99

Kết quả: x = 6, y = 99.

Bài tập mẫu 2 (SGK – Câu hỏi mục 1, bài 3): a, b nhận giá trị gì sau các lệnh sau?

>>> a, b = 2, 3
>>> a, b = a+b, a-b

Lời giải:

Bước Lệnh Tính toán Giá trị biến
1 a, b = 2, 3 a = 2, b = 3
2 a, b = a+b, a-b Tính cả hai vế phải trước (dùng a=2, b=3): 2+3 = 5, 2-3 = -1 → rồi gán đồng thời a = 5, b = -1

Kết quả: a = 5, b = -1.

Dạng 3: Tính giá trị biểu thức số học trong Python

Phương pháp:

  • Bước 1: Xác định thứ tự ưu tiên: ***, /, //, %+, -. Ngoặc () ưu tiên cao nhất.
  • Bước 2: Phép ** thực hiện phải sang trái, các phép khác trái sang phải.
  • Bước 3: Tính từng phần theo thứ tự, chú ý phép / luôn cho số thực.

Bài tập mẫu (SGK – Câu hỏi mục 2, bài 1): Mỗi lệnh sau đúng hay sai? Nếu đúng cho kết quả bao nhiêu?

Lệnh 1: (12 - 10//2)**2 - 1

Lời giải:

$$10 // 2 = 5 \longrightarrow 12 – 5 = 7 \longrightarrow 7^{2} = 49 \longrightarrow 49 – 1 = 48$$

Đúng, kết quả = 48.

Lệnh 2: (13 + 45**2)(30//12 - 5/2)

Lời giải:

Sai (lỗi cú pháp). Hai cặp ngoặc đặt liền nhau mà không có toán tử ở giữa. Python không tự hiểu phép nhân khi hai ngoặc liền nhau (khác với toán học). Cần viết (13 + 45**2) * (30//12 - 5/2) mới đúng cú pháp.

Dạng 4: Phép toán trên xâu kí tự

Phương pháp:

  • Phép + giữa hai xâu: nối hai xâu lại (không thêm dấu cách).
  • Phép * n: lặp xâu gốc n lần. Nếu n ≤ 0, kết quả là xâu rỗng "".
  • "" (xâu rỗng) nhân với số bất kì → vẫn là xâu rỗng.
  • Thứ tự thực hiện: * trước, + sau (giống phép toán số).

Bài tập mẫu (SGK – Câu hỏi mục 2, bài 2): Mỗi lệnh sau cho kết quả là xâu kí tự như thế nào?

Lệnh 1: ""*20 + "010"

Lời giải:

""*20 → xâu rỗng lặp 20 lần = "" (xâu rỗng). Sau đó "" + "010" = "010".

→ Kết quả: "010"

Lệnh 2: "10" + "0"*5

Lời giải:

"0"*5"00000" (lặp “0” năm lần). Sau đó "10" + "00000" = "1000000".

→ Kết quả: "1000000"

Dạng 5: Viết lệnh print() kết hợp biến và biểu thức

Phương pháp:

  • Gán giá trị cho các biến liên quan.
  • Dùng print() kết hợp xâu kí tự (in nguyên văn) và biến/biểu thức (Python tính rồi in).
  • Các phép toán trên xâu (+ nối, * lặp) có thể đặt ngay bên trong print().

Bài tập mẫu (SGK – Luyện tập, bài 2): Lệnh sau sẽ in ra kết quả gì?

>>> print("đồ rê mi "*3 + "pha son la si đô "*2)

Lời giải:

  • "đồ rê mi " * 3"đồ rê mi đồ rê mi đồ rê mi "
  • "pha son la si đô " * 2"pha son la si đô pha son la si đô "
  • Nối hai xâu bằng +:

→ Kết quả in ra: đồ rê mi đồ rê mi đồ rê mi pha son la si đô pha son la si đô

III. Sơ đồ tư duy

1. Biến và lệnh gán

  • 1.1. Biến = tên vùng nhớ lưu trữ giá trị, có thể thay đổi
  • 1.2. Lệnh gán: <biến> = <biểu thức>
  • 1.3. Python tự xác định kiểu dữ liệu khi gán (không cần khai báo trước)
  • 1.4. Gán đồng thời: x, y, z = 10, 5, 1
  • 1.5. Quy tắc đặt tên: chữ cái + chữ số + _, không bắt đầu bằng số, phân biệt hoa/thường

2. Phép toán trên kiểu số

  • 2.1. Bảy phép toán: +, -, *, /, //, %, **
  • 2.2. Ưu tiên: ** > *, /, //, % > +, -
  • 2.3. Phép ** thực hiện phải → trái; các phép khác trái → phải
  • 2.4. Phép / luôn cho số thực; biểu thức có số thực → kết quả số thực

3. Phép toán trên kiểu xâu

  • 3.1. Nối xâu: + (không tự thêm dấu cách)
  • 3.2. Lặp xâu: * n (lặp n lần; n ≤ 0 → xâu rỗng)

4. Từ khóa

  • 4.1. Là các từ đặc biệt dành riêng cho ngôn ngữ Python
  • 4.2. Không được đặt tên biến trùng từ khóa
  • 4.3. Phân biệt hoa/thường: trueTrue (từ khóa)

IV. sai lầm thường gặp

Sai lầm Đính chính
Đặt tên biến bắt đầu bằng chữ số: 2x, 123a Tên biến không được bắt đầu bằng chữ số. Sửa lại: x2, a123.
Nhầm phép chia / với chia lấy nguyên //: nghĩ 10/3 = 3 Phép / luôn trả về số thực: 10/3 = 3.333.... Muốn lấy thương nguyên dùng //: 10//3 = 3.
Viết lũy thừa bằng dấu ^: 2^3 Trong Python, ** mới là phép lũy thừa: 2**3 = 8. Dấu ^ là phép XOR (khác hoàn toàn).
Nghĩ 4**2**3 tính từ trái sang phải: (4**2)**3 = 4096 Phép ** thực hiện phải sang trái: 4**(2**3) = 4**8 = 65536.
Hai ngoặc liền nhau là phép nhân: (a+b)(a-b) Python không hiểu hai ngoặc liền nhau là nhân. Phải viết rõ: (a+b) * (a-b).
Nhầm true với từ khóa True, hoặc _if với if Python phân biệt hoa/thường. true, _if, nolocal không phải từ khóa (từ khóa là True, if, nonlocal).
Nghĩ phép nối xâu + tự thêm dấu cách: "Hà Nội" + "Việt Nam" = "Hà Nội Việt Nam" Phép + nối xâu không thêm kí tự nào: kết quả là "Hà NộiViệt Nam". Muốn có dấu cách phải viết "Hà Nội" + " " + "Việt Nam" hoặc "Hà Nội " + "Việt Nam".
Gán đồng thời a, b = a+b, a-b tính lần lượt (a đổi trước rồi mới tính b) Python tính toàn bộ vế phải trước bằng giá trị cũ, rồi mới gán đồng thời. Nên a, b đều dùng giá trị gốc để tính.
Thầy Phạm Thành Danh

Thầy Phạm Thành Danh

(Người kiểm duyệt, ra đề)

Chức vụ: Trưởng ban biên soạn môn Tin Học THPT

Trình độ: Cử nhân Sư phạm Tin học, Chứng chỉ hạng II, Chứng chỉ Tin học, Ngoại ngữ B1

Kinh nghiệm: 8+ năm kinh nghiệm tại Trường THPT Thuận Hóa