【Python-Day 25】玩转数字:精通 math 与 random 模块,从数学运算到随机抽样
Langchain系列文章目录
01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
07-【深度解析】从GPT-1到GPT-4:ChatGPT背后的核心原理全揭秘
08-【万字长文】MCP深度解析:打通AI与世界的“USB-C”,模型上下文协议原理、实践与未来
Python系列文章目录
PyTorch系列文章目录
机器学习系列文章目录
深度学习系列文章目录
Java系列文章目录
JavaScript系列文章目录
Python系列文章目录
01-【Python-Day 1】告别编程恐惧:轻松掌握 Python 安装与第一个程序的 6 个步骤
02-【Python-Day 2】掌握Python基石:变量、内存、标识符及int/float/bool数据类型
03-【Python-Day 3】玩转文本:字符串(String)基础操作详解 (上)
04-【Python-Day 4】玩转文本:Python 字符串常用方法深度解析 (下篇)
05-【Python-Day 5】Python 格式化输出实战:%、format()、f-string 对比与最佳实践
06- 【Python-Day 6】从零精通 Python 运算符(上):算术、赋值与比较运算全解析
07-【Python-Day 7】从零精通 Python 运算符(下):逻辑、成员、身份运算与优先级规则全解析
08-【Python-Day 8】从入门到精通:Python 条件判断 if-elif-else 语句全解析
09-【Python-Day 9】掌握循环利器:for 循环遍历序列与可迭代对象详解
10-【Python-Day 10】Python 循环控制流:while 循环详解与 for 循环对比
11-【Python-Day 11】列表入门:Python 中最灵活的数据容器 (创建、索引、切片)
12-【Python-Day 12】Python列表进阶:玩转添加、删除、排序与列表推导式
13-【Python-Day 13】Python 元组 (Tuple) 详解:从创建、操作到高级应用场景一网打尽
14-【Python-Day 14】玩转Python字典(上篇):从零开始学习创建、访问与操作
15-【Python-Day 15】深入探索 Python 字典 (下):常用方法、遍历、推导式与嵌套实战
16-【Python-Day 16】代码复用基石:详解 Python 函数的定义与调用
17-【Python-Day 17】玩转函数参数(上):轻松掌握位置、关键字和默认值
18-【Python-Day 18】玩转函数参数(下):*args 与 **kwargs 终极指南
19-【Python-Day 19】函数的回响:深入理解 return
语句与返回值
20-【Python-Day 20】揭秘Python变量作用域:LEGB规则与global/nonlocal关键字详解
21-【Python-Day 21】一行搞定!Python lambda 匿名函数的妙用与实战
22-【Python-Day 22】代码的基石:模块(Module)的导入与使用详解
23-【Python-Day 23】Python 模块化编程实战:创建、导入及 sys.path 深度解析
24-【Python-Day 24】告别杂乱代码!一文掌握 Python 包(Package)的创建与使用
25-【Python-Day 25】玩转数字:精通 math 与 random 模块,从数学运算到随机抽样
文章目录
- Langchain系列文章目录
- Python系列文章目录
- PyTorch系列文章目录
- 机器学习系列文章目录
- 深度学习系列文章目录
- Java系列文章目录
- JavaScript系列文章目录
- Python系列文章目录
- 前言
- 一、数学家的得力助手 —— `math` 模块
- 1.1 导入并初识 `math` 模块
- 1.2 `math` 模块中的核心“宝藏”
- 1.2.1 数学常数: p i pi pi 与 e e e
- 1.2.2 核心函数:从取整到幂指对
- (1) 向上与向下取整:`ceil()` 和 `floor()`
- (2) 平方根:`sqrt()`
- (3) 幂运算与对数:`pow()`, `log()`, `log10()`
- 1.2.3 三角函数
- 二、幸运的魔法师 —— `random` 模块
- 2.1 基础随机数生成
- 2.1.1 `random.random()`
- 2.2 实用随机数生成函数
- 2.2.1 生成指定范围的随机数
- (1) 随机整数:`randint()` 和 `randrange()`
- (2) 随机浮点数:`uniform()`
- 2.2.2 从序列中随机选择
- (1) 随机选择一个元素:`choice()`
- (2) 随机打乱序列:`shuffle()`
- 2.3 `random` 模块函数总结
- 三、总结
前言
大家好!欢迎来到 “Python 从零到大师” 系列的第 25 篇。在前面的文章中,我们学习了如何创建自己的模块和包来组织代码。然而,Python 的强大之处不仅在于自定义,更在于其丰富的“标准库”——一系列预先编写好、可直接使用的模块。这些模块就像是 Python 给我们配备的瑞士军刀,能极大地提升开发效率。
从今天开始,我们将探索其中一些最常用、最实用的内建模块。本次我们将聚焦于两个与数字打交道的得力助手:math
模块和 random
模块。无论你是要进行科学计算、数据分析,还是开发游戏、进行模拟,这两个模块都是不可或缺的基础工具。本文将带你深入了解它们的核心功能,并通过丰富的实例,让你轻松掌握数学运算与随机数生成的技巧。
一、数学家的得力助手 —— math
模块
在编程中,我们经常需要进行比基础的加减乘除更复杂的数学运算,例如开方、取整、对数、三角函数等。Python 的 math
模块就是为此而生,它提供了大量用于浮点数运算的函数。
1.1 导入并初识 math
模块
要使用 math
模块中的任何功能,首先需要通过 import
语句将其导入到当前程序中。
import math
导入后,我们就可以通过 math.函数名
或 math.常量名
的方式来调用其内部的功能。
1.2 math
模块中的核心“宝藏”
math
模块包含数学常数和各种计算函数,下面我们来探索其中最常用的一些。
1.2.1 数学常数: p i pi pi 与 e e e
在科学计算中,圆周率 π \pi π 和自然常数 e e e 是两个极其重要的常数。math
模块直接为我们提供了它们的高精度值。
(1) 圆周率 π \pi π (math.pi
)
math.pi
提供了圆周率 π \pi π 的值。
应用场景:计算圆的面积或周长。
代码示例:
import math# 计算半径为 5 的圆的面积
radius = 5
area = math.pi * radius ** 2
print(f"半径为 {radius} 的圆的面积是: {area}")
# 输出: 半径为 5 的圆的面积是: 78.53981633974483
(2) 自然常数 e e e (math.e
)
math.e
提供了自然常数 e e e(欧拉数)的值,约等于 2.71828。
应用场景:在涉及复利、正态分布等高级数学计算时会用到。
代码示例:
import mathprint(f"自然常数 e 的值是: {math.e}")
# 输出: 自然常数 e 的值是: 2.718281828459045
1.2.2 核心函数:从取整到幂指对
math
模块的函数极大地扩展了我们的计算能力。
(1) 向上与向下取整:ceil()
和 floor()
这两个函数用于处理浮点数的取整问题,但与 int()
直接截断小数不同。
math.ceil(x)
: “天花板”函数,返回大于或等于 x x x 的最小整数。math.floor(x)
: “地板”函数,返回小于或等于 x x x 的最大整数。
场景驱动:假设你需要根据商品数量计算需要多少个包装箱,每个箱子最多装10个商品。即使有11个商品,也需要2个箱子,这时向上取整就派上了用场。
代码示例:
import mathnum = 3.14# 向上取整
ceil_num = math.ceil(num)
print(f"{num} 向上取整的结果是: {ceil_num}") # 输出: 4# 向下取整
floor_num = math.floor(num)
print(f"{num} 向下取整的结果是: {floor_num}") # 输出: 3# 实际应用:计算包装箱数量
items = 32
items_per_box = 10
boxes_needed = math.ceil(items / items_per_box)
print(f"需要 {boxes_needed} 个包装箱来装 {items} 个商品。") # 输出: 4
(2) 平方根:sqrt()
math.sqrt(x)
用于计算一个非负数的平方根。
代码示例:
import math# 计算 16 的平方根
result = math.sqrt(16)
print(f"16 的平方根是: {result}") # 输出: 4.0# 尝试计算负数的平方根会引发 ValueError
try:math.sqrt(-4)
except ValueError as e:print(f"计算负数平方根时出错: {e}")
注意:math.sqrt()
只能处理非负实数。如果需要处理复数的平方根,应使用 cmath
模块。
(3) 幂运算与对数:pow()
, log()
, log10()
math.pow(x, y)
: 计算 x x x 的 y y y 次方,等价于 x ∗ ∗ y x ** y x∗∗y,但返回值总是浮点数。math.log(x[, base])
: 计算以base
为底的 x x x 的对数。如果省略base
,则计算自然对数(以 e e e 为底)。math.log10(x)
: 计算以 10 为底的 x x x 的对数。
代码示例:
import math# 幂运算
print(f"2 的 10 次方是: {math.pow(2, 10)}") # 输出: 1024.0# 自然对数
print(f"e 的自然对数是: {math.log(math.e)}") # 输出: 1.0# 以 2 为底的对数
print(f"8 以 2 为底的对数是: {math.log(8, 2)}") # 输出: 3.0# 以 10 为底的对数
print(f"1000 以 10 为底的对数是: {math.log10(1000)}") # 输出: 3.0
1.2.3 三角函数
math
模块还提供了一整套三角函数,如 sin()
, cos()
, tan()
等。需要特别注意的是,这些函数的参数都以弧度(radians)为单位,而不是角度(degrees)。模块也提供了 math.radians()
和 math.degrees()
用于转换。
代码示例:
import mathangle_degrees = 90# 1. 将角度转换为弧度
angle_radians = math.radians(angle_degrees)
print(f"{angle_degrees} 度等于 {angle_radians:.4f} 弧度。")# 2. 计算正弦值
sin_value = math.sin(angle_radians)
# 由于浮点数精度问题,结果可能是一个非常接近 1 的数
print(f"sin(90度) 的值是: {sin_value}") # 输出: 1.0# 3. 将弧度转回角度
print(f"{math.pi/2} 弧度等于 {math.degrees(math.pi/2)} 度。")
二、幸运的魔法师 —— random
模块
random
模块用于生成伪随机数,这在模拟、游戏、密码学、数据抽样等领域至关重要。“伪随机”意味着这些数是通过一个确定的算法生成的,但看起来是随机的。对于大多数应用来说,这种随机性已经足够了。
2.1 基础随机数生成
random
模块的核心是生成 0 到 1 之间的随机浮点数。
2.1.1 random.random()
这是最基础的函数,它返回一个 [0.0, 1.0)
区间内的随机浮点数(即包含 0.0,但不包含 1.0)。
代码示例:
import random# 生成一个随机浮点数
rand_float = random.random()
print(f"生成一个 0 到 1 之间的随机数: {rand_float}")
2.2 实用随机数生成函数
基于 random()
,random
模块提供了更多便捷的函数。
2.2.1 生成指定范围的随机数
(1) 随机整数:randint()
和 randrange()
random.randint(a, b)
: 返回一个[a, b]
闭区间内的随机整数,包含a
和b
。random.randrange(start, stop[, step])
: 更灵活的版本,类似于range()
函数。它返回从start
到stop-1
范围内,按step
递增的集合中随机选取的一个数。
场景驱动:模拟掷一个六面骰子,结果是 1 到 6 之间的整数,randint(1, 6)
是完美的选择。
代码示例:
import random# 模拟掷骰子 (1到6)
dice_roll = random.randint(1, 6)
print(f"掷骰子的结果是: {dice_roll}")# 生成一个 0 到 99 之间的随机偶数
even_num = random.randrange(0, 100, 2)
print(f"一个随机偶数: {even_num}")
(2) 随机浮点数:uniform()
random.uniform(a, b)
返回一个 [a, b]
或 [b, a]
区间内的随机浮点数,端点是否包含取决于浮点数的舍入。
代码示例:
import random# 生成一个 1.5 到 5.5 之间的随机身高(米)
height = random.uniform(1.5, 5.5)
print(f"随机生成的身高是: {height:.2f} 米")
2.2.2 从序列中随机选择
当我们需要从一个列表、元组或字符串中随机挑选元素时,以下函数非常有用。
(1) 随机选择一个元素:choice()
random.choice(sequence)
从一个非空序列中随机返回一个元素。
场景驱动:抽奖程序,从参与者名单(列表)中随机抽取一名幸运儿。
代码示例:
import randomparticipants = ["张三", "李四", "王五", "赵六"]
winner = random.choice(participants)
print(f"恭喜 {winner} 中奖了!")
(2) 随机打乱序列:shuffle()
random.shuffle(x)
会就地打乱序列 x
的元素顺序,它不返回任何值(返回 None
)。这意味着它会直接修改原始列表。
场景驱动:洗牌。一副扑克牌列表,通过 shuffle
可以模拟洗牌的过程。
代码示例:
import randomcards = ["A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3", "2"]
print(f"洗牌前: {cards}")
random.shuffle(cards)
print(f"洗牌后: {cards}")
注意:shuffle()
不能作用于不可变序列,如元组或字符串。
2.3 random
模块函数总结
为了方便查阅,下表总结了 random
模块的关键函数:
函数 | 功能描述 | 示例 |
---|---|---|
random() | 返回 [0.0, 1.0) 之间的随机浮点数 | random.random() |
randint(a, b) | 返回 [a, b] 之间的随机整数 | random.randint(1, 100) |
randrange(start, stop[, step]) | 返回 range(start, stop, step) 中的随机数 | random.randrange(0, 10, 2) |
uniform(a, b) | 返回 [a, b] 之间的随机浮点数 | random.uniform(1.0, 5.0) |
choice(seq) | 从非空序列 seq 中随机选择一个元素 | random.choice(['a', 'b', 'c']) |
shuffle(x) | 就地打乱序列 x | items=[1,2,3]; random.shuffle(items) |
sample(population, k) | 从 population 中随机选择 k 个不重复的元素 | random.sample(range(100), 10) |
三、总结
恭喜你,完成了对 math
和 random
这两个强大内建模块的学习!它们是 Python 工具箱中的基础,却能解决无数实际问题。
今天我们学习的核心要点如下:
math
模块是科学计算的基石:它提供了精确的数学常数(如math.pi
)和丰富的数学函数(如ceil
,floor
,sqrt
,log
, 三角函数等),让我们能轻松处理复杂的数值计算。- 使用三角函数时注意单位:
math
模块的三角函数默认使用弧度,需要时应使用math.radians()
进行转换。 random
模块是模拟与随机化的核心:它能生成各种类型的伪随机数,从简单的浮点数 (random()
) 到指定范围的整数 (randint()
),再到对序列的操作。- 根据需求选择合适的
random
函数:choice()
用于单项选择,shuffle()
用于就地打乱,sample()
用于无重复抽样,应根据具体场景灵活选用。 - 模块化编程思想:通过
import
关键字,我们可以方便地引入并使用 Python 标准库提供的强大功能,这正是 Python “自带电池”(batteries included)理念的体现。
在接下来的文章中,我们将继续探索更多实用的内建模块,比如用于处理日期和时间的 datetime
和 time
模块。不断充实你的 Python 工具箱,编程世界将变得更加精彩!继续加油!