divmod(a, b) trả về tuple (quotient, remainder) từ phép chia a // b và a % b. Hiệu quả hơn tính riêng biệt.
Cú pháp
divmod(a, b) # a, b: int hoặc float
Ví dụ cơ bản
print(divmod(5, 2)) # (2, 1) print(divmod(25, 5)) # (5, 0) print(divmod(5.6, 2)) # (2.0, 1.6) print(divmod(11.3, 9.2)) # (1.0, 2.1000000000000014)
Trường hợp đặc biệt: Chia cho 0
print(divmod(0, 8)) # (0, 0) print(divmod(8, 0)) # ZeroDivisionError
Ứng dụng 1: Kiểm tra chia hết
m, n = 12, 4
quotient, remainder = divmod(m, n)
if remainder == 0:
print(f"{m} chia hết cho {n}, thương = {quotient}")
else:
print(f"{m} KHÔNG chia hết cho {n}")
Kết quả
12 chia hết cho 4, thương = 3
Ứng dụng 2: Kiểm tra số nguyên tố
Số nguyên tố chỉ có 2 ước: 1 và chính nó. Dùng divmod đếm số dư = 0.
def is_prime_divmod(n):
if n < 2:
return False
zero_remainder_count = 0
for a in range(1, n + 1):
_, r = divmod(n, a)
if r == 0:
zero_remainder_count += 1
return zero_remainder_count == 2
print(is_prime_divmod(11)) # True
print(is_prime_divmod(12)) # False
Ứng dụng 3: Chuyển đổi cơ số / thời gian
# Giây → Phút:Giây
total_seconds = 125
minutes, seconds = divmod(total_seconds, 60)
print(f"{minutes}:{seconds:02d}") # 2:05
# Cơ số 10 → Cơ số 2 (binary)
def to_binary(n):
if n == 0: return "0"
bits = []
while n > 0:
n, r = divmod(n, 2)
bits.append(str(r))
return ''.join(reversed(bits))
print(to_binary(13)) # 1101
Tại sao dùng divmod()?
- Hiệu năng: 1 phép chia hardware cho cả thương và dư
- Code ngắn gọn, rõ ý đồ
- Atomic: tránh race condition trong multi-thread (hiếm gặp)