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
  • //% 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ế!