Trong bài này
Mai chuẩn bị 24 nhãn cho tủ sách. Mỗi nhãn cần ghi tên ngăn và chiều cao tính bằng mét. Mai muốn nhập thông tin một lần rồi dùng lại khi in nhãn.
Biến giữ một giá trị để các lệnh sau sử dụng
Hãy lưu số ngăn và in giá trị đó hai lần:
so_ngan = 24
print(so_ngan)
print("So ngan:", so_ngan)24 So ngan: 24
so_ngan là biến (variable), một tên dùng để tham chiếu đến giá trị. Dấu = thực hiện phép gán (assignment): Python tính phần bên phải rồi gắn kết quả với tên bên trái. Dòng đầu không tự in. Hai dòng sau đọc giá trị đang gắn với so_ngan.
Tên biến không đặt trong dấu nháy khi bạn muốn dùng giá trị của nó. Nếu đặt trong nháy, nó trở thành chữ:
nhan = "Truyen"
print(nhan)
print("nhan")Truyen nhan
Bạn có thể gán một giá trị mới cho cùng tên. Lệnh in đọc giá trị mới nhất tại thời điểm nó chạy:
so_ngan = 24
print(so_ngan)
so_ngan = 18
print(so_ngan)24 18
| Lệnh | so_ngan |
|---|---|
| Gán lần đầu | 24 |
| Gán lần sau | 18 |
Một biến khác có thể nhận giá trị của biến đã có:
so_ke = 5
so_day = so_ke
so_ke = 6
print(so_day)
print(so_ke)5 6
Khi gán so_day, Python lấy giá trị 5 đang gắn với so_ke. Gán lại so_ke không tự đổi so_day trong ví dụ này.
Nếu dùng một tên chưa được gán, Python báo lỗi:
print(so_tang)Lỗi khi chạy, ở dòng 1
NameError: name 'so_tang' is not defined
Thông báo NameError cho biết Python không tìm thấy tên. Hãy kiểm tra tên và gán giá trị trước khi dùng.
Tên biến cần hợp lệ và dễ đọc
Tên sau mô tả dữ liệu mà nó giữ:
so_hoc_sinh = 28
print(so_hoc_sinh)28
Tên có thể chứa chữ, chữ số và dấu gạch dưới _, nhưng không bắt đầu bằng chữ số. Tên không được chứa dấu cách. Hãy dùng tên ngắn mà rõ nghĩa; ví dụ so_hoc_sinh dễ hiểu hơn x khi lưu số học sinh.
Bạn có thể dùng chữ số sau chữ đầu. Tên lop2 và lop_2 đều hợp lệ, nhưng chúng là hai tên riêng:
lop2 = "Hoa"
lop_2 = "La"
print(lop2, lop_2)Hoa La
Hãy chọn một cách viết và dùng đúng cách đó ở mọi dòng cần đọc cùng dữ liệu. Dấu _ giúp phân biệt các phần của tên khi đọc code.
2lop = 28Lỗi khi chạy, ở dòng 1
SyntaxError: invalid decimal literal
Python báo SyntaxError vì không đọc được tên này. Bạn có thể viết lop_2 thay thế.
Python phân biệt chữ hoa và chữ thường trong tên:
ten = "Mai"
Ten = "An"
print(ten)
print(Ten)Mai An
ten và Ten là hai tên khác nhau. Ngoài ra, một số từ như True và False có ý nghĩa riêng trong Python; bạn không thể dùng chúng làm tên biến. Tránh đặt tên biến trùng tên hàm có sẵn như print, input, int hay type, vì tên đó có thể che hàm bạn cần dùng.
Giá trị có kiểu dữ liệu, kể cả khi trông giống nhau
Hãy kiểm tra kiểu của số lượng và chiều cao:
so_sach = 24
chieu_cao = 1.5
print(type(so_sach))
print(type(chieu_cao))<class 'int'> <class 'float'>
Kiểu dữ liệu (data type) cho biết loại giá trị. int biểu diễn số nguyên như 24, 0, -3. float biểu diễn số có phần thập phân như 1.5. Trong code Python, dấu chấm phân cách phần nguyên và phần thập phân. type() cho biết kiểu của giá trị đưa vào ngoặc.
Một dòng chữ thuộc kiểu str, kể cả khi chữ đó chỉ gồm các chữ số:
ma = "24"
print(ma)
print(type(ma))24 <class 'str'>
"24" và 24 có thể in giống nhau, nhưng kiểu của chúng khác nhau. Dấu nháy đánh dấu chuỗi, còn số nguyên không đặt trong nháy.
Python có hai giá trị kiểu đúng sai (Boolean): True và False. Chúng phải viết đúng chữ hoa đầu tiên:
mo_cua = True
print(mo_cua)
print(type(mo_cua))
print(False)True <class 'bool'> False
Kiểu của True và False là bool. Bài 3 sẽ dùng giá trị đúng sai trong điều kiện; ở đây bạn chỉ cần nhận biết chúng.
mo_cua = trueLỗi khi chạy, ở dòng 1
NameError: name 'true' is not defined. Did you mean: 'True'?
true là tên khác True; nếu chưa được gán, nó gây NameError. Một tên biến có thể được gán lại giá trị thuộc kiểu khác, nên kiểm tra kiểu của giá trị hiện tại:
du_lieu = 7
print(type(du_lieu))
du_lieu = "7"
print(type(du_lieu))<class 'int'> <class 'str'>
Chuyển dòng nhập sang kiểu cần dùng
Ở Bài 1, input() đọc một dòng chữ. Dù dòng đó chứa chữ số, kết quả vẫn là str:
24
dong = input()
print(dong)
print(type(dong))24 <class 'str'>
Để nhận số nguyên, đưa chuỗi vào int():
24
dong = input()
so_sach = int(dong)
print(so_sach)
print(type(so_sach))24 <class 'int'>
int(dong) tạo giá trị số nguyên từ nội dung phù hợp. dong vẫn là chuỗi; so_sach giữ kết quả chuyển kiểu. Bạn cũng có thể viết hai bước trên trong một dòng:
5
so_ke = int(input())
print(so_ke)5
Python đọc input() trước, rồi đưa kết quả vào int(). Chuỗi phải biểu diễn số nguyên hợp lệ. Ví dụ sau có dấu chấm thập phân nên không chuyển trực tiếp bằng int() được:
so = int("2.5")Lỗi khi chạy, ở dòng 1
ValueError: invalid literal for int() with base 10: '2.5'
Thông báo ValueError cho biết nội dung không phù hợp với cách chuyển. Với dữ liệu thập phân, dùng float():
1.5
chieu_cao = float(input())
print(chieu_cao)
print(type(chieu_cao))1.5 <class 'float'>
float() cũng nhận chuỗi số nguyên như "2"; kết quả là số thực 2.0:
so_do = float("2")
print(so_do)
print(type(so_do))2.0 <class 'float'>
Số thực có thể được in với phần .0 ngay cả khi dòng nhập không có dấu chấm. Nội dung dòng vào và cách Python hiển thị giá trị đã chuyển là hai việc khác nhau. Nếu cần giữ nguyên mã có các số không ở đầu, hãy giữ nó là chuỗi thay vì chuyển sang số.
Khi cần chuyển một giá trị thành chữ, dùng str():
so_ke = 5
chu = str(so_ke)
print(chu)
print(type(chu))5 <class 'str'>
Chuyển kiểu tạo ra giá trị mới. Không nhầm str(so_ke) với "so_ke": cách thứ hai là chữ gồm tên biến, không đọc giá trị của biến.
Biến tham gia phép tính
Hai điểm của Mai là 8 và 9. Bạn có thể cộng hai biến rồi lưu kết quả vào một tên mới:
diem_van = 8
diem_toan = 9
tong_diem = diem_van + diem_toan
print(tong_diem)17
Dấu + cộng hai số. Python tính vế phải trước rồi gắn kết quả với tong_diem. Hai biến điểm ban đầu vẫn giữ giá trị cũ.
Dấu - thực hiện phép trừ. Chẳng hạn, thư viện có 20 sách và đã cho mượn 6 cuốn:
so_sach = 20
da_muon = 6
con_lai = so_sach - da_muon
print(con_lai)14
Phép trừ lấy giá trị bên trái trừ giá trị bên phải. Nếu đổi vị trí hai biến, bạn đang tính một phép khác.
Dấu * thực hiện phép nhân. Một cuốn sách giá 8000 đồng; mua 4 cuốn cùng giá thì tính tiền như sau:
don_gia = 8000
so_luong = 4
thanh_tien = don_gia * so_luong
print(thanh_tien)32000
thanh_tien giữ kết quả nhân để bạn có thể in hoặc dùng lại. Dấu nhân trong code là *, không phải chữ x.
Dấu / thực hiện phép chia. Với số nguyên hay số thực, kết quả của / có kiểu float, kể cả khi chia hết:
so_sach = 10
so_ngan = 2
print(so_sach / so_ngan)
print(type(so_sach / so_ngan))5.0 <class 'float'>
Số chia phải khác 0. Chia cho 0 gây lỗi ZeroDivisionError:
print(10 / 0)Lỗi khi chạy, ở dòng 1
ZeroDivisionError: division by zero
Bạn có thể gán kết quả lại cho biến ban đầu. Thư viện bổ sung 3 cuốn vào số sách đang có:
so_sach = 10
so_sach = so_sach + 3
print(so_sach)13
Python lấy 10 đang gắn với so_sach, cộng 3, rồi gắn 13 lại với tên đó. Dấu = ở đây là phép gán, không phải phép so sánh. Bạn sẽ học phép so sánh ở Bài 3.
Các phép tính cũng nhận số đọc từ dữ liệu vào. Hãy chuyển từng dòng thành số trước khi cộng:
3 4
a = int(input())
b = int(input())
print(a + b)7
Nếu bỏ int(), hai giá trị là chuỗi. Dấu + khi đó nối hai chuỗi theo thứ tự, thay vì cộng số:
3 4
a = input()
b = input()
print(a + b)34
Bạn không thể nối trực tiếp chuỗi với số bằng +:
print("Tong: " + 5)Lỗi khi chạy, ở dòng 1
TypeError: can only concatenate str (not "int") to str
Python báo TypeError vì hai giá trị không phù hợp để nối theo cách này. Đổi số thành chữ bằng str() để nối:
tong = 5
print("Tong: " + str(tong))Tong: 5
Bạn cũng có thể dùng f-string, được giới thiệu ở phần sau. Với phép tính nhiều bước, bạn có thể tách thành từng bước hoặc đặt phần cần tính trước trong ngoặc. Ví dụ, tìm tổng hai điểm rồi chia đều cho hai môn:
diem_van = 8
diem_toan = 9
tong = diem_van + diem_toan
trung_binh = tong / 2
print(trung_binh)8.5
Ví dụ trên tách thành hai phép để dễ theo dõi. Bạn sẽ học thứ tự ưu tiên của các phép tính ở Bài 3.
Bạn cũng có thể đặt tổng trong ngoặc để tính tổng trước khi chia:
diem_van = 8
diem_toan = 9
trung_binh = (diem_van + diem_toan) / 2
print(trung_binh)8.5
Ngoặc làm rõ phần được tính trước. Không cần dự đoán thứ tự của các phép khác khi tách chúng thành từng bước.
Đọc hai số nguyên trên cùng một dòng
Một phiếu ghi số tầng và số ngăn, cách nhau bằng dấu cách. Ví dụ sau đọc đúng hai số trên một dòng:
2 24
so_tang, so_ngan = map(int, input().split())
print("Tang:", so_tang)
print("Ngan:", so_ngan)Tang: 2 Ngan: 24
Đọc từ trong ra ngoài: input() lấy cả dòng chữ. .split() tách dòng thành các phần theo khoảng trắng. map(int, ...) chuyển từng phần thành số nguyên. Cuối cùng, hai tên bên trái nhận hai kết quả theo thứ tự.
Đọcinput() nhận dòng 2 24Táchsplit() tách hai phần chữChuyểnmap(int, ...) đổi từng phần thành số nguyênGánso_tang nhận 2, so_ngan nhận 24
Không đặt dấu nháy quanh int trong map: Python cần hàm chuyển kiểu, không phải chữ "int". Số phần nhận được phải khớp số tên bên trái. Dòng dưới chỉ có một phần nên phép gán cho hai tên bị lỗi:
2
a, b = map(int, input().split())Lỗi khi chạy, ở dòng 1
ValueError: not enough values to unpack (expected 2, got 1)
Nếu đề yêu cầu hai số trên hai dòng, hãy dùng hai lần input() thay vì mẫu đọc một dòng này. Bạn sẽ học chi tiết về các cấu trúc chứa nhiều giá trị ở các bài sau.
Với hai dòng riêng, mỗi lần đọc cần chuyển kiểu của dòng vừa nhận:
2 24
so_tang = int(input())
so_ngan = int(input())
print(so_tang, so_ngan)2 24
Lần đọc đầu nhận 2; lần sau nhận 24. Cả hai đều được chuyển sang số nguyên. Đọc kỹ định dạng vào của đề để chọn cách đọc phù hợp.
F-string đưa giá trị vào đúng vị trí trong câu
Một nhãn cần chứa cả tên và số ngăn. Đặt chữ f trước dấu nháy và đặt tên biến trong ngoặc nhọn:
ten = "Truyen"
so_ngan = 24
print(f"Ke {ten} co {so_ngan} ngan")Ke Truyen co 24 ngan
Đây là chuỗi định dạng (f-string). Python thay mỗi phần trong {} bằng giá trị tương ứng khi tạo chuỗi. Những chữ và dấu cách ngoài ngoặc nhọn được giữ như đã viết. Không có f, tên trong ngoặc nhọn chỉ là chữ:
ten = "Truyen"
print("Ke {ten}")
print(f"Ke {ten}")Ke {ten}
Ke Truyen
F-string tạo ra chuỗi. Nó giúp trình bày số mà không cần đổi số thành str() trước:
so_tang = 2
nhan = f"Tang {so_tang}"
print(nhan)
print(type(nhan))Tang 2 <class 'str'>
Bạn cũng có thể đặt phép tính trong ngoặc nhọn. Python tính kết quả rồi đưa kết quả vào chuỗi:
gia = 6000
so = 2
print(f"Tien: {gia * so}")Tien: 12000
Làm tròn giá trị hoặc định dạng số khi in
Một số đo có thể có nhiều chữ số sau dấu chấm. Để hiển thị đúng hai chữ số thập phân, thêm :.2f sau tên biến trong f-string:
chieu_cao = 1.5
print(f"{chieu_cao:.2f}")1.50
Phần .2f yêu cầu hai chữ số sau dấu chấm; vì thế số đo được hiển thị với thêm chữ số không. Đây là cách trình bày chuỗi, không đổi giá trị đã lưu:
chieu_cao = 1.256
print(f"{chieu_cao:.2f}")
print(chieu_cao)1.26 1.256
Hàm round() trả về giá trị được làm tròn. Đối số thứ hai chọn số chữ số sau dấu chấm:
so_do = 3.146
gan_dung = round(so_do, 2)
print(gan_dung)
print(so_do)3.15 3.146
round() không tự sửa so_do; muốn dùng kết quả, hãy lưu hoặc in giá trị trả về. round() không bảo đảm hiển thị đủ hai chữ số ở cuối. Dùng :.2f khi đề yêu cầu chính xác hai chữ số thập phân.
Với một số giá trị nằm giữa hai lựa chọn, Python dùng quy tắc làm tròn về chữ số cuối chẵn. Số float còn được lưu gần đúng, nên kết quả có thể khác điều bạn dự đoán bằng cách nhìn chữ số thập phân:
print(round(2.5))
print(round(3.5))2 4
Không suy ra rằng mọi số có chữ số cuối là 5 đều được xử lý giống nhau. Nếu cần tiền chính xác, hãy làm theo quy ước làm tròn của đề bài.
Lỗi thường gặp
| Lỗi | Vì sao sai | Cách sửa |
|---|---|---|
| Dùng tên chưa gán | Python chưa tìm thấy giá trị của tên | Gán trước rồi mới dùng |
| Bắt đầu tên bằng số | Tên biến không được mở đầu bằng chữ số | Viết lop_2 thay cho 2lop |
Viết true | Python phân biệt chữ hoa và chữ thường | Viết True |
Dùng int("2.5") | Chuỗi có dấu chấm không phải dạng số nguyên | Dùng float() nếu dữ liệu là số thập phân |
Cộng chuỗi với số bằng + | + không nối trực tiếp hai kiểu này | Dùng str() đổi số thành chuỗi hoặc dùng f-string |
Quên f trước chuỗi | Ngoặc nhọn được giữ thành chữ | Thêm f trước dấu nháy |
Dùng round(x, 2) để bắt buộc hiện hai chữ số | Giá trị được in có thể không giữ số 0 cuối | Dùng f"{x:.2f}" |
Tóm tắt
- Dùng
=để gắn giá trị với tên; tên biến phân biệt chữ hoa và chữ thường. int,float,strvàboollà các kiểu dữ liệu;type()cho biết kiểu của một giá trị.input()trả về chuỗi; dùngint(),float()hoặcstr()để tạo giá trị theo kiểu cần dùng.- Dùng
+,-,*,/để cộng, trừ, nhân, chia;/trả vềfloatvà số chia phải khác 0. - Dùng
a, b = map(int, input().split())khi một dòng chứa đúng hai số nguyên. - F-string đưa giá trị vào câu;
:.2fquy định cách hiện hai chữ số sau dấu chấm.round()trả về giá trị làm tròn.