在 Python 中,divmod() 是一个内建函式,用来同时计算两个数字的「商和余数」。它的结果会以一个二元组(tuple)的形式返回,分别表示「商」和「余数」。

什么是商?

「商」是数学中的术语,指的是在进行除法运算时,被除数(分子)被除数(分母)整除后的结果。商代表「完整分割」的次数或结果,例如,20 除以 5 的商是 4,因为 20 可以被 5 整除四次。

举例10÷2=510÷2=5,所以 10 除以 2 的商是 5,余数是 0。

17÷3=517÷3=5(余数 2),所以 17 除以 3 的商是 5,余数是 2。

在 Python 中,商可以用两种方式求得:

  • 使用 // 运算符:这是「整数除法」或「地板除」,只保留整数部分。
  • 使用 divmod() 函式,它会返回商和余数的组合。

# 方法 1: 使用整数除法
quotient = 10 // 3
print(quotient) # 输出: 3

# 方法 2: 使用 divmod 函式
quotient, remainder = divmod(10, 3)
print(quotient) # 输出: 3
print(remainder) # 输出: 1

divmod(a, b) 返回 (a // b, a % b) 的结果,也就是 a 除以 b 的整数商和余数。

# 假设 a = 10, b = 3
result = divmod(10, 3)
print(result) # 输出: (3, 1)

# 分别取得商和余数
quotient, remainder = divmod(10, 3)
print("商:", quotient) # 输出: 商: 3
print("余数:", remainder) # 输出: 余数: 1

divmod() 使用情境

整除及余数运算的便捷性:在需要同时得出整数商和余数的情况下,divmod() 可以避免重复计算。应用于货币、时间等计算:当需要计算小单位的数量和剩余时数(如小时、分钟的转换)时非常实用。

  • 时间计算与格式化,应用场景: 网路伺服器响应时间计算、任务执行时间统计、影片播放进度显示等。

def seconds_to_hms(seconds):
h, m = divmod(seconds, 3600)
m, s = divmod(m, 60)
return h, m, s

total_seconds = 7265
hours, minutes, seconds = seconds_to_hms(total_seconds)
print(f"{hours}小时{minutes}分{seconds}秒")

  • 资料库操作, 分页查询:Web应用程式中的数据展示。

def paginate_data(data, page, per_page):
start = (page - 1) * per_page
end = start + per_page
return data[start:end]

# 假设资料总数为 100,每页显示 10 条资料,查询第 3 页
total_data = [i for i in range(100)]
#设定分页参数
page = 3
per_page = 10
result = paginate_data(total_data, page, per_page)
print(result)

参数:data: 要分页的资料列表。page: 要查询的页码。per_page: 每页显示的资料数量。

  • 运作方式:
    • 运计算起始索引 start: (page - 1) * per_page 这部分计算出当前页的起始索引。例如,如果要查询第 3 页,每页 10 条资料,那么 start 就会是 20。
    • 计算结束索引 end: start + per_page 计算出当前页的结束索引。
    • 返回分页后的资料: data[start:end] 这部分会从 data 列表中切取从 start 到 end-1 的元素,并返回。

与普通运算对比

如果我们不使用 divmod(),计算整数商和余数会需要进行两次操作:

a = 10
b = 3
quotient = a // b
remainder = a % b
print((quotient, remainder)) # 输出: (3, 1)

而 divmod() 更为简洁,也会执行得更快,因为它仅进行一次运算。