当前位置: 首页 > news >正文

【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` 模块
  • 二、幸运的魔法师 —— `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 xy,但返回值总是浮点数。
  • 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] 闭区间内的随机整数,包含 ab
  • random.randrange(start, stop[, step]): 更灵活的版本,类似于 range() 函数。它返回从 startstop-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)就地打乱序列 xitems=[1,2,3]; random.shuffle(items)
sample(population, k)population 中随机选择 k 个不重复的元素random.sample(range(100), 10)

三、总结

恭喜你,完成了对 mathrandom 这两个强大内建模块的学习!它们是 Python 工具箱中的基础,却能解决无数实际问题。

今天我们学习的核心要点如下:

  • math 模块是科学计算的基石:它提供了精确的数学常数(如 math.pi)和丰富的数学函数(如 ceil, floor, sqrt, log, 三角函数等),让我们能轻松处理复杂的数值计算。
  • 使用三角函数时注意单位math 模块的三角函数默认使用弧度,需要时应使用 math.radians() 进行转换。
  • random 模块是模拟与随机化的核心:它能生成各种类型的伪随机数,从简单的浮点数 (random()) 到指定范围的整数 (randint()),再到对序列的操作。
  • 根据需求选择合适的 random 函数choice() 用于单项选择,shuffle() 用于就地打乱,sample() 用于无重复抽样,应根据具体场景灵活选用。
  • 模块化编程思想:通过 import 关键字,我们可以方便地引入并使用 Python 标准库提供的强大功能,这正是 Python “自带电池”(batteries included)理念的体现。

在接下来的文章中,我们将继续探索更多实用的内建模块,比如用于处理日期和时间的 datetimetime 模块。不断充实你的 Python 工具箱,编程世界将变得更加精彩!继续加油!

相关文章:

  • 图文教程——Deepseek最强平替工具免费申请教程——国内edu邮箱可用
  • 亚马逊Woot黑五策略,快速提升亚马逊业绩
  • LeetCode - 136. 只出现一次的数字
  • vue3 + ant 实现 tree默认展开,筛选对应数据打开,简单~直接cv
  • Java异步编程难题
  • 渗透测试PortSwigger Labs:遭遇html编码和转义符的反射型XSS
  • 使用Gradle打包springboot项目为JAR包教程
  • SQL进阶之旅 Day 26:分库分表环境中的SQL策略
  • python数据结构和算法(4)
  • 51la查看https统计,悟空统计助力高效运营
  • TensorZero:开源 LLM 应用优化与可观测性平台
  • 如何将照片从Android传输到Mac?
  • Codeforces 2025/6/11 日志
  • ZZU-ARM汇编语言实验 34
  • 一键批量修改XML标签名称:告别手工修改,高效管理标注数据
  • input+disabled/readonly问题
  • (十)量子注意力机制:深度学习与量子计算的交叉融合探索
  • C++面试(5)-----删除链表中指定值的节点
  • Spring | 深入解析 Spring AOP 中的AopProxyUtils.ultimateTargetClass()解决代理对象注解获取问题
  • 如何选择合适的IP轮换周期
  • 彩票自己开盘做网站/互联网营销成功案例
  • 室内设计速成班学费/东莞seo建站
  • 网站站内logo怎么做/搜索引擎营销的四种方式
  • 电影网站开发技术/百度推广云南总代理
  • 福田做商城网站建设多少钱/自己创建网站
  • wordpress ux theme/上海有哪些优化网站推广公司