Python 练习讲解 · 24 / 25

离散计数:加法原理与乘法原理

先判断是在互斥方案中择一,还是多个步骤都要完成。

要学习的知识点

题目

补充练习:用实际选择问题分别演示加法原理和乘法原理。

输入一行四个非负整数:两类互斥选项数量 a、b,以及两类可搭配选项数量 c、d。

参考程序:ex24.py;空白练习:lx24.py。

完整代码

以下内容与 ex24.py 一致,可对照右侧讲解阅读。

"""补充练习:用实际选择问题分别演示加法原理和乘法原理。
输入一行四个非负整数:两类互斥选项数量 a、b,以及两类可搭配选项数量 c、d。

学习说明:
- 两类选择互斥、只能选其中一类时,用加法原理:总数为 a + b。
- 两个步骤都要完成、每个第一步选择都能配每个第二步选择时,用乘法原理:总数为 c * d。
- 输入检查保证数量非负,避免出现没有意义的负选择数。
"""
a, b, c, d = map(int, input().split())
if min(a, b, c, d) < 0:
    raise ValueError("选项数量不能为负数")

print("addition principle:", a + b)
print("multiplication principle:", c * d)

进阶写法

这版与初学版解决同一道题,使用更精炼的语法或标准库工具。

进阶源码:ex24_adv.py

"""练习 24 进阶版:用解包、min 和算术表达式实现计数原理。"""
a, b, c, d = map(int, input().split())
if min(a, b, c, d) < 0:
    raise ValueError("选项数量不能为负数")

print("addition principle:", a + b)
print("multiplication principle:", c * d)

map() 转换四个输入,解包后直接赋给变量;min() 一次检查所有数量是否非负。

运行结果

示例输入:

2 3 2 3

程序输出:

addition principle: 5
multiplication principle: 6

逐个认识函数

下表根据程序中实际调用的函数和方法整理;自定义函数的实现与算法细节见后续说明。

函数形式功能与返回值注意事项
ValueError(message)内置异常类型,用来表示参数值不符合要求。raise ValueError(...) 会立即抛错并停止当前程序流程。
input(prompt='')读取一行文本,返回 str;若提供 prompt 会先显示提示。返回值默认是字符串,计算前通常要做类型转换。
str.split(sep=None)按分隔符拆分字符串,返回字符串列表。默认按连续空白拆分并忽略首尾空白。
map(function, iterable)逐个应用函数,返回惰性迭代器。常与 list() 一起使用以立即取得结果。
min(iterable) / min(a, b, ...)返回最小元素。空可迭代对象且没有 default 时会报错。
print(*objects, sep=' ', end='\n')把对象转换为文本显示;返回 None。默认空格分隔并在末尾换行。

两个生活模型

程序输入四个选项数量 a、b、c、d。前两类互斥,只选其一;后两项代表一个选择过程中的两个连续步骤。源码:ex24.py。

  • 只能选饮料 A(a 种)或饮料 B(b 种):用加法原理,a+b 种。
  • 先选上衣(c 种),再选裤子(d 种):每件上衣都能搭配每条裤子,用乘法原理,c×d 种。

原理的适用条件

原理直观问题公式条件
加法原理方案 A 或方案 Ba+b两个类别互斥,结果不会被重复数。
乘法原理先做步骤 A,再做步骤 Ba×b每个 A 选择都能与 b 个 B 选择搭配。

不能看到“有两类”就随意相加,也不能看到“两个数字”就相乘。先辨认题意是“选一个类别”还是“完成多个步骤”。

程序使用的函数

函数/方法参数与返回值作用
input().split()input 返回 str;split 默认按空白拆分并返回列表。读取同一行四个数。
map(int, ...)逐项转换为整数,返回 map 迭代器。转换 a、b、c、d。
min(a, b, c, d)内置函数,多个参数时返回最小值。若最小值小于 0,说明至少一个选项数量为负。
raise ValueError(message)抛出值错误;程序不会继续执行后续代码。拒绝负选项数量。
print(...)显示标签和结果,返回 None。输出相加和相乘的计算结果。

用小数据枚举检查

a=2 类蓝色物品,b=3 类红色物品,互斥选一:2+3=5
c=2 件上衣,d=3 条裤子,搭配一套:
(上衣1,裤1) (上衣1,裤2) (上衣1,裤3)
(上衣2,裤1) (上衣2,裤2) (上衣2,裤3)
共 2×3=6 套

先用很小的数量手工列举所有结果,再看公式是否重复或漏算。程序输入应为非负整数。

代码如何运行

  1. 先按左侧题目给出的格式输入数据;程序通过 input() 读取,并在需要时转换数据类型。
  2. 程序自上而下执行语句;遇到条件、循环或函数调用时,按照右侧算法说明更新变量和处理数据。
  3. 最后由 print() 输出计算结果。可将左侧示例输入与输出逐项对照。

先自己跟踪一组小数据,记录循环前后变量的值;这比只看最终答案更容易理解程序。

自己动手试一试

让某类选项数量为 0;说明为什么互斥方案相加、连续步骤相乘。

先在 lx24.py 中独立完成,再运行参考程序比较结果。修改程序时一次只改一个条件或步骤。