Bài 3: Operators - Toán Tử
Mục Tiêu Bài Học
Sau khi hoàn thành bài này, bạn sẽ:
- ✅ Hiểu các loại operators trong Python
- ✅ Sử dụng arithmetic operators cho phép tính
- ✅ Dùng comparison operators để so sánh
- ✅ Áp dụng logical operators cho điều kiện phức tạp
- ✅ Sử dụng assignment operators hiệu quả
Operators Là Gì?
Operator (toán tử) là ký hiệu đặc biệt dùng để thực hiện các phép toán trên dữ liệu.
# Ví dụ:result = 5 + 3# ^ ^ Operands (toán hạng)# ^ Operator (toán tử)
1. Arithmetic Operators - Toán Tử Số Học
Dùng để thực hiện các phép tính toán học.
Addition (+) - Phép Cộng
# Cộng sốx = 10 + 5print(x) # 15 # Cộng floatprice = 19.99 + 5.50print(price) # 25.49 # Nối chuỗigreeting = "Xin " + "chào"print(greeting) # Xin chào # Cộng negativeresult = 10 + (-3)print(result) # 7
Ví dụ thực tế:
# Tính tổng tiềnproduct1 = 50000product2 = 75000shipping = 20000 total = product1 + product2 + shippingprint(f"Tổng: {total:,} VND") # Tổng: 145,000 VND
Subtraction (-) - Phép Trừ
# Trừ sốx = 20 - 8print(x) # 12 # Trừ floatbalance = 1000.50 - 249.99print(balance) # 750.51 # Số âmresult = 5 - 10print(result) # -5
Ví dụ thực tế:
# Tính số dư tài khoảninitial_balance = 5000000spent = 1250000 remaining = initial_balance - spentprint(f"Còn lại: {remaining:,} VND") # Còn lại: 3,750,000 VND
Multiplication (*) - Phép Nhân
# Nhân sốx = 6 * 7print(x) # 42 # Nhân floatprice = 99.99 * 3print(price) # 299.97 # Nhân chuỗi (lặp lại)stars = "*" * 10print(stars) # ********** # Nhân listnumbers = [1, 2, 3] * 2print(numbers) # [1, 2, 3, 1, 2, 3]
Ví dụ thực tế:
# Tính lươnghours_worked = 160hourly_rate = 50000 salary = hours_worked * hourly_rateprint(f"Lương: {salary:,} VND") # Lương: 8,000,000 VND # Tạo separatorprint("=" * 40) # ========================================
Division (/) - Phép Chia
# Chia thông thường (luôn trả về float)x = 10 / 2print(x) # 5.0 y = 10 / 3print(y) # 3.3333333333333335 # Chia số âmz = -10 / 3print(z) # -3.3333333333333335
Ví dụ thực tế:
# Tính trung bìnhtotal_score = 450num_subjects = 5 average = total_score / num_subjectsprint(f"Điểm trung bình: {average:.2f}") # Điểm trung bình: 90.00 # Chia tiền đềutotal_bill = 500000num_people = 3 per_person = total_bill / num_peopleprint(f"Mỗi người: {per_person:,.0f} VND") # Mỗi người: 166,667 VND
Lưu ý: Không chia cho 0!
try: result = 10 / 0except ZeroDivisionError: print("Lỗi: Không thể chia cho 0!")
Floor Division (//) - Chia Lấy Phần Nguyên
Chia và chỉ lấy phần nguyên (bỏ phần thập phân).
# Floor divisionx = 10 // 3print(x) # 3 (bỏ phần thập phân) y = 15 // 4print(y) # 3 # Với số âmz = -10 // 3print(z) # -4 (làm tròn xuống)
So sánh / vs //:
print(10 / 3) # 3.3333333333333335print(10 // 3) # 3 print(7 / 2) # 3.5print(7 // 2) # 3
Ví dụ thực tế:
# Tính số túi cần muatotal_items = 25items_per_bag = 6 num_bags = total_items // items_per_bagprint(f"Cần mua: {num_bags} túi") # Cần mua: 4 túi # Tính số giờ từ phúttotal_minutes = 135hours = total_minutes // 60print(f"{hours} giờ") # 2 giờ
Modulus (%) - Chia Lấy Dư
Lấy phần dư của phép chia.
# Modulusx = 10 % 3print(x) # 1 (10 = 3*3 + 1) y = 15 % 4print(y) # 3 (15 = 4*3 + 3) z = 10 % 2print(z) # 0 (chia hết)
Ứng dụng:
1. Kiểm tra số chẵn/lẻ:
number = 7 if number % 2 == 0: print(f"{number} là số chẵn")else: print(f"{number} là số lẻ") # 7 là số lẻ
2. Tính phần dư:
total_items = 25items_per_bag = 6 remaining = total_items % items_per_bagprint(f"Còn thừa: {remaining} items") # Còn thừa: 1 items
3. Lấy chữ số cuối:
number = 12345last_digit = number % 10print(f"Chữ số cuối: {last_digit}") # Chữ số cuối: 5
4. Chu kỳ lặp:
# Vị trí trong vòng lặpfor i in range(10): position = i % 3 # Chỉ có 0, 1, 2 print(f"i={i}, position={position}")# 0,0 1,1 2,2 3,0 4,1 5,2 6,0 7,1 8,2 9,0
Exponentiation (**) - Lũy Thừa
# Lũy thừax = 2 ** 3print(x) # 8 (2^3 = 2*2*2) y = 5 ** 2print(y) # 25 (5^2 = 5*5) # Căn bậc hai (square root)z = 16 ** 0.5print(z) # 4.0 # Lũy thừa âma = 2 ** -2print(a) # 0.25 (1/4)
Ví dụ thực tế:
# Tính diện tích hình vuôngside = 5area = side ** 2print(f"Diện tích: {area} m²") # Diện tích: 25 m² # Tính lãi képprincipal = 10000000 # 10 triệurate = 0.08 # 8%/nămyears = 5 amount = principal * (1 + rate) ** yearsprint(f"Sau {years} năm: {amount:,.0f} VND")# Sau 5 năm: 14,693,281 VND # Công thức vật lý: E = mc²mass = 1 # kgspeed_of_light = 3e8 # m/senergy = mass * speed_of_light ** 2print(f"Năng lượng: {energy:e} J")
Operator Precedence - Thứ Tự Ưu Tiên
# Thứ tự: ** > *, /, //, % > +, -result = 2 + 3 * 4print(result) # 14 (không phải 20) # Dùng ngoặc để thay đổi thứ tựresult = (2 + 3) * 4print(result) # 20 # Phức tạp hơnresult = 10 + 5 * 2 ** 3 - 4 / 2# 5 * 8 = 40# 10 + 40 = 50# 4/2 = 2.0# 50 - 2.0 = 48.0print(result) # 48.0
Best Practice:
# ❌ Khó đọcresult = 100+50*2/10-5 # ✅ Dễ đọcresult = 100 + (50 * 2) / 10 - 5 # ✅ Chia nhỏtemp = 50 * 2temp = temp / 10result = 100 + temp - 5
2. Comparison Operators - Toán Tử So Sánh
Dùng để so sánh giá trị, kết quả trả về True hoặc False.
Equal To (==) - Bằng
# So sánh sốprint(5 == 5) # Trueprint(5 == 10) # Falseprint(3.0 == 3) # True (int và float bằng nhau) # So sánh chuỗiprint("hello" == "hello") # Trueprint("Hello" == "hello") # False (phân biệt hoa/thường) # So sánh booleanprint(True == True) # Trueprint(True == 1) # True (!)print(False == 0) # True (!)
Lưu ý: = vs ==
x = 5 # Assignment (gán giá trị)x == 5 # Comparison (so sánh)
Not Equal To (!=) - Khác
print(5 != 10) # Trueprint(5 != 5) # Falseprint("a" != "b") # True
Greater Than (>) - Lớn Hơn
print(10 > 5) # Trueprint(5 > 10) # Falseprint(5 > 5) # False
Less Than (<) - Nhỏ Hơn
print(5 < 10) # Trueprint(10 < 5) # Falseprint(5 < 5) # False
Greater Than or Equal (>=) - Lớn Hơn Hoặc Bằng
print(10 >= 5) # Trueprint(5 >= 5) # Trueprint(3 >= 5) # False
Less Than or Equal (<=) - Nhỏ Hơn Hoặc Bằng
print(5 <= 10) # Trueprint(5 <= 5) # Trueprint(10 <= 5) # False
So Sánh Chuỗi
Chuỗi được so sánh theo thứ tự ABC (lexicographic):
print("apple" < "banana") # Trueprint("cat" > "car") # True (t > r)print("Python" < "python") # True (P < p) # So sánh độ dàilen("hello") > len("hi") # True (5 > 2)
Ví Dụ Thực Tế
# Kiểm tra tuổiage = 18if age >= 18: print("Đủ tuổi bầu cử")else: print("Chưa đủ tuổi") # Kiểm tra điểmscore = 85if score >= 90: grade = "A"elif score >= 80: grade = "B"elif score >= 70: grade = "C"else: grade = "D"print(f"Xếp loại: {grade}") # So sánh giáproduct_price = 500000budget = 600000 if product_price <= budget: print("Mua được!") savings = budget - product_price print(f"Còn dư: {savings:,} VND")else: print("Không đủ tiền")
3. Logical Operators - Toán Tử Logic
Dùng để kết hợp nhiều điều kiện.
AND - Và
Trả về True nếu TẤT CẢ điều kiện đều True.
# Truth tableprint(True and True) # Trueprint(True and False) # Falseprint(False and True) # Falseprint(False and False) # False
Ví dụ:
age = 25has_license = True # Cả hai điều kiện đều đúngcan_drive = age >= 18 and has_licenseprint(can_drive) # True # Một điều kiện saiage = 16can_drive = age >= 18 and has_licenseprint(can_drive) # False
Ứng dụng thực tế:
# Kiểm tra đăng nhậpusername = "admin"password = "123456"is_active = True login_success = (username == "admin" and password == "123456" and is_active)print(f"Đăng nhập: {login_success}") # Kiểm tra điều kiện mua hàngage = 20has_money = Truein_stock = True can_buy = age >= 18 and has_money and in_stockprint(f"Có thể mua: {can_buy}")
OR - Hoặc
Trả về True nếu ÍT NHẤT MỘT điều kiện True.
# Truth tableprint(True or True) # Trueprint(True or False) # Trueprint(False or True) # Trueprint(False or False) # False
Ví dụ:
is_weekend = Trueis_holiday = False is_day_off = is_weekend or is_holidayprint(is_day_off) # True # Cả hai đều Falseis_weekend = Falseis_holiday = Falseis_day_off = is_weekend or is_holidayprint(is_day_off) # False
Ứng dụng thực tế:
# Miễn phí shiporder_value = 400000is_member = False free_shipping = order_value >= 500000 or is_memberprint(f"Miễn phí ship: {free_shipping}") # False # Discount eligibilityage = 70is_student = False has_discount = age >= 65 or is_studentprint(f"Được giảm giá: {has_discount}") # True
NOT - Phủ Định
Đảo ngược giá trị boolean.
print(not True) # Falseprint(not False) # True # Với biểu thứcage = 16print(not age >= 18) # True (vì age < 18) is_logged_in = Falseprint(not is_logged_in) # True
Ví dụ thực tế:
# Kiểm tra chưa đăng nhậpis_logged_in = False if not is_logged_in: print("Vui lòng đăng nhập") # Kiểm tra không có trong danh sáchusername = "guest"banned_users = ["hacker", "spammer"] if username not in banned_users: print("Chào mừng!")
Kết Hợp Logical Operators
# AND và ORage = 25has_ticket = Trueis_vip = False can_enter = (age >= 18 and has_ticket) or is_vipprint(can_enter) # True # Dùng ngoặc để rõ ràngresult = (True and False) or Trueprint(result) # True result = True and (False or True)print(result) # True
Ví dụ phức tạp:
# Điều kiện được vayage = 30income = 20000000has_collateral = Falsecredit_score = 750 can_get_loan = ( age >= 21 and age <= 65 and income >= 15000000 and (has_collateral or credit_score >= 700)) print(f"Được vay: {can_get_loan}") # True
Short-circuit Evaluation
Python đánh giá từ trái sang phải và dừng khi biết kết quả:
# AND: Dừng khi gặp Falseresult = False and print("Không in") # Không in gìresult = True and print("Có in") # In "Có in" # OR: Dừng khi gặp Trueresult = True or print("Không in") # Không in gìresult = False or print("Có in") # In "Có in"
4. Assignment Operators - Toán Tử Gán
Simple Assignment (=)
x = 10name = "An"is_valid = True
Compound Assignment
Kết hợp phép toán với gán:
# += (cộng rồi gán)x = 10x += 5 # Tương đương: x = x + 5print(x) # 15 # -= (trừ rồi gán)x = 10x -= 3 # Tương đương: x = x - 3print(x) # 7 # *= (nhân rồi gán)x = 5x *= 2 # Tương đương: x = x * 2print(x) # 10 # /= (chia rồi gán)x = 20x /= 4 # Tương đương: x = x / 4print(x) # 5.0 # //= (chia lấy nguyên rồi gán)x = 20x //= 3 # Tương đương: x = x // 3print(x) # 6 # %= (chia lấy dư rồi gán)x = 20x %= 3 # Tương đương: x = x % 3print(x) # 2 # **= (lũy thừa rồi gán)x = 2x **= 3 # Tương đương: x = x ** 3print(x) # 8
Ví dụ thực tế:
# Countercount = 0count += 1 # Tăng 1count += 1 # Tăng 1count += 1 # Tăng 1print(f"Count: {count}") # Count: 3 # Accumulatortotal = 0total += 100total += 50total += 25print(f"Total: {total}") # Total: 175 # Discountprice = 1000000price -= 100000 # Giảm 100kprice *= 0.9 # Giảm thêm 10%print(f"Giá cuối: {price:,.0f}") # Giá cuối: 810,000 # Game scorescore = 100score += 50 # Bonusscore -= 20 # Penaltyscore *= 2 # Doubleprint(f"Score: {score}") # Score: 260
Ví Dụ Tổng Hợp
1. Tính Tiền Điện
print("=== TÍNH TIỀN ĐIỆN ===") # Inputusage = int(input("Số kWh sử dụng: ")) # Bậc thang giá điện (VND/kWh)TIER1_PRICE = 1678 # 0-50 kWhTIER2_PRICE = 1734 # 51-100 kWhTIER3_PRICE = 2014 # 101-200 kWhTIER4_PRICE = 2536 # 201-300 kWhTIER5_PRICE = 2834 # >300 kWh # Tính tiềnif usage <= 50: cost = usage * TIER1_PRICEelif usage <= 100: cost = 50 * TIER1_PRICE + (usage - 50) * TIER2_PRICEelif usage <= 200: cost = (50 * TIER1_PRICE + 50 * TIER2_PRICE + (usage - 100) * TIER3_PRICE)elif usage <= 300: cost = (50 * TIER1_PRICE + 50 * TIER2_PRICE + 100 * TIER3_PRICE + (usage - 200) * TIER4_PRICE)else: cost = (50 * TIER1_PRICE + 50 * TIER2_PRICE + 100 * TIER3_PRICE + 100 * TIER4_PRICE + (usage - 300) * TIER5_PRICE) # Thuế VAT 10%tax = cost * 0.1total = cost + tax # Hiển thịprint(f"\nSố điện: {usage} kWh")print(f"Tiền điện: {cost:,} VND")print(f"VAT (10%): {tax:,} VND")print(f"Tổng cộng: {total:,.0f} VND")
2. BMI Calculator
print("=== TÍNH CHỈ SỐ BMI ===") # Inputheight = float(input("Chiều cao (m): "))weight = float(input("Cân nặng (kg): ")) # Tính BMIbmi = weight / (height ** 2) # Phân loạiif bmi < 18.5: category = "Thiếu cân" advice = "Cần tăng cân"elif bmi < 25: category = "Bình thường" advice = "Giữ vững!"elif bmi < 30: category = "Thừa cân" advice = "Nên giảm cân"else: category = "Béo phì" advice = "Cần giảm cân gấp" # Hiển thịprint(f"\nChiều cao: {height}m")print(f"Cân nặng: {weight}kg")print(f"BMI: {bmi:.2f}")print(f"Phân loại: {category}")print(f"Khuyến nghị: {advice}")
3. Discount Calculator
print("=== TÍNH GIẢM GIÁ ===") # Inputprice = float(input("Giá gốc: "))quantity = int(input("Số lượng: "))is_member = input("Thành viên? (y/n): ").lower() == 'y' # Tính subtotalsubtotal = price * quantity # Discount theo quantityif quantity >= 10: quantity_discount = 0.15 # 15%elif quantity >= 5: quantity_discount = 0.10 # 10%elif quantity >= 3: quantity_discount = 0.05 # 5%else: quantity_discount = 0 # Member discountmember_discount = 0.05 if is_member else 0 # Tổng discounttotal_discount = quantity_discount + member_discount # Tính tiềndiscount_amount = subtotal * total_discountfinal_price = subtotal - discount_amount # Hiển thịprint(f"\n{'='*40}")print(f"Đơn giá: {price:,.0f} VND")print(f"Số lượng: {quantity}")print(f"Tạm tính: {subtotal:,.0f} VND") if quantity_discount > 0: print(f"Giảm theo SL ({quantity_discount*100:.0f}%): -{subtotal*quantity_discount:,.0f} VND")if member_discount > 0: print(f"Giảm thành viên ({member_discount*100:.0f}%): -{subtotal*member_discount:,.0f} VND") print(f"{'='*40}")print(f"TỔNG CỘNG: {final_price:,.0f} VND")print(f"Tiết kiệm: {discount_amount:,.0f} VND ({total_discount*100:.1f}%)")
Bài Tập Thực Hành
Bài 1: Calculator
Viết chương trình máy tính:
- Input: 2 số và toán tử (+, -, *, /, //, %, **)
- Output: Kết quả phép tính
Bài 2: Grade System
Nhập điểm (0-100), xuất xếp loại:
= 90: A
= 80: B
= 70: C
= 60: D
- < 60: F
Bài 3: Leap Year Check
Kiểm tra năm nhuận:
- Chia hết cho 4 VÀ (không chia hết cho 100 HOẶC chia hết cho 400)
Bài 4: Even/Odd Counter
Nhập 5 số, đếm:
- Số chẵn
- Số lẻ
- Số dương
- Số âm
Bài 5: Shopping Cart
Tính tổng giỏ hàng:
- 3 sản phẩm với giá và số lượng
- Áp dụng giảm giá nếu tổng > 1 triệu
- Tính thuế 10%
Tóm Tắt
✅ Arithmetic: +, -, *, /, //, %, **
✅ Comparison: ==, !=, >, <, >=, <=
✅ Logical: and, or, not
✅ Assignment: =, +=, -=, *=, /=, //=, %=, **=
✅ Precedence: ** > *, /, //, % > +, - > comparison > logical
✅ Dùng ngoặc () để rõ ràng
Bài Tiếp Theo
Bài 4: Strings - Tìm hiểu sâu về chuỗi ký tự, string methods và string formatting.
Remember:
- Operators là công cụ để thao tác dữ liệu
//và%rất hữu ích trong thực tế- Logical operators giúp kết hợp điều kiện
- Practice với nhiều bài toán thực tế!