# GESP等级：二级 | GESP Python 二级考点
"""
============================================================================
  第3节：math综合 —— 课程讲义
  课程编号: GESP #35
  时长规划: 60分钟
  记忆钩子: "π=3.14 sqrt开方 floor向下 ceil向上"
============================================================================

【课程目标】
1. 掌握 math 模块的核心函数：pi、sqrt、floor、ceil、sin、cos
2. 能用 math 模块解决几何计算问题（周长、对角线）
3. 理解模块导入的两种方式及其作用域差异

============================================================================
第一部分：导入 —— math 工具箱（00:00 - 10:00）
============================================================================

数学工具箱 analogy：
    Python 的 math 模块就像一个装满数学工具的工具箱。
    要用里面的工具，必须先"打开工具箱"→ 也就是 import math

----------------------------------------------------------------------------
1.1  导入方式
----------------------------------------------------------------------------

方式 A：import math（推荐）
    import math
    print(math.pi)       # 用 math. 前缀调用

方式 B：from math import *
    from math import *
    print(pi)            # 直接写函数名，不用前缀
    # 风险：可能与自定义变量重名，不推荐在大项目中使用

方式 C：from math import pi, sqrt（精确导入）
    from math import pi, sqrt
    print(pi, sqrt(100))
    # 只导入需要的函数，最推荐

----------------------------------------------------------------------------
1.2  认识 math.pi —— 圆周率
----------------------------------------------------------------------------

>>> import math
>>> math.pi
3.141592653589793

* math.pi 是常量，不是函数（没有括号）
* 精度 ≈ 15 位小数，足够绝大多数计算
* 用途：圆周长 C=2πr、圆面积 S=πr²

记忆钩子： π=3.14 派≈3.14

============================================================================
第二部分：知识点精讲（10:00 - 30:00）
============================================================================

----------------------------------------------------------------------------
2.1  math.pi —— 圆周率常量
----------------------------------------------------------------------------

    import math
    print(math.pi)   # 3.141592653589793

    适用场景：圆形、球体、弧度计算

----------------------------------------------------------------------------
2.2  math.sqrt(x) —— 平方根 / 开方
----------------------------------------------------------------------------

    import math
    print(math.sqrt(100))   # 10.0
    print(math.sqrt(2))     # 1.4142135623730951

    * 返回值永远是 float 类型
    * 参数 x 必须 ≥ 0，否则抛出 ValueError
    * 等价于 x ** 0.5，但 sqrt 可读性更佳

    记忆钩子：sqrt 开方 —— square root 平方根

    应用：已知正方形面积求边长、勾股定理求斜边

----------------------------------------------------------------------------
2.3  math.floor(x) —— 向下取整
----------------------------------------------------------------------------

    import math
    print(math.floor(3.9))   # 3
    print(math.floor(3.1))   # 3
    print(math.floor(-3.1))  # -4  ← 注意：负数向下取整更小

    * 向负无穷方向取整
    * 等价于 int(x) 当 x≥0，但负数的 int() 是向零取整

    记忆钩子：floor 地板 —— 向下（往地板方向）

----------------------------------------------------------------------------
2.4  math.ceil(x) —— 向上取整
----------------------------------------------------------------------------

    import math
    print(math.ceil(3.1))    # 4
    print(math.ceil(3.9))    # 4
    print(math.ceil(-3.1))   # -3  ← 注意：负数向上取整更大

    * 向正无穷方向取整

    记忆钩子：ceil 天花板 —— 向上（往天花板方向）

    floor vs ceil 对比：
    ┌─────────────┬──────────────┬──────────────┐
    │     x       │ floor(x)     │  ceil(x)     │
    ├─────────────┼──────────────┼──────────────┤
    │    3.1      │     3        │     4        │
    │    3.9      │     3        │     4        │
    │   -3.1      │    -4        │    -3        │
    │   -3.9      │    -4        │    -3        │
    └─────────────┴──────────────┴──────────────┘

----------------------------------------------------------------------------
2.5  math.sin(x) / math.cos(x) —— 三角函数
----------------------------------------------------------------------------

    import math
    print(math.sin(math.pi / 2))   # 1.0
    print(math.cos(0))             # 1.0

    * 参数 x 的单位是弧度（radian），不是角度（degree）
    * 角度→弧度：radians = degrees * π / 180
    * 辅助函数：math.radians(deg) 和 math.degrees(rad)

    示例：计算 30° 的 sin 值
    >>> math.sin(math.radians(30))
    0.49999999999999994  （≈ 0.5，浮点精度误差）

============================================================================
第三部分：演示代码（30:00 - 40:00）
============================================================================

----------------------------------------------------------------------------
演示 1：用 math.pi 计算圆的周长
----------------------------------------------------------------------------

    import math

    radius = 5
    circumference = 2 * math.pi * radius

    print(f"半径 = {radius}")
    print(f"圆周率 π = {math.pi}")
    print(f"周长 C = 2πr = {circumference:.2f}")

    # 输出：
    # 半径 = 5
    # 圆周率 π = 3.141592653589793
    # 周长 C = 2πr = 31.42

----------------------------------------------------------------------------
演示 2：用 math.sqrt 计算矩形对角线
----------------------------------------------------------------------------

    import math

    width = 3
    height = 4
    diagonal = math.sqrt(width ** 2 + height ** 2)

    print(f"矩形宽 = {width}, 高 = {height}")
    print(f"对角线 = √({width}² + {height}²) = {diagonal}")

    # 输出：
    # 矩形宽 = 3, 高 = 4
    # 对角线 = √(3² + 4²) = 5.0

    # 原理：勾股定理 a² + b² = c² → c = sqrt(a² + b²)

----------------------------------------------------------------------------
演示 3：floor / ceil 实际应用 —— 分页计算
----------------------------------------------------------------------------

    import math

    total_items = 53
    items_per_page = 10

    # 需要多少页？（ceil —— 不够一页也要算一页）
    total_pages = math.ceil(total_items / items_per_page)

    print(f"共 {total_items} 条，每页 {items_per_page} 条")
    print(f"需要 {total_pages} 页")

    # 当前在第 3 页，显示第几条到第几条？（floor —— 页码从1开始）
    page = 3
    start = items_per_page * (page - 1) + 1
    end = min(items_per_page * page, total_items)
    print(f"第 {page} 页：第 {start} ~ {end} 条")

============================================================================
第四部分：知识图谱
============================================================================

                    ┌──────────────┐
                    │  math 模块   │
                    ├──────────────┤
                    │  pi (常量)   │──→ 圆周率 π ≈ 3.14159
                    │  sqrt( )     │──→ 开平方根 √x
                    │  floor( )    │──→ 向下取整 ⌊x⌋
                    │  ceil( )     │──→ 向上取整 ⌈x⌉
                    │  sin( )      │──→ 正弦  (参数:弧度)
                    │  cos( )      │──→ 余弦  (参数:弧度)
                    │  radians( )  │──→ 角度→弧度转换
                    │  degrees( )  │──→ 弧度→角度转换
                    └──────────────┘

记忆口诀：
    "π=3.14  sqrt开方  floor向下  ceil向上"
    "勾股定理用sqrt  圆的计算找pi  三角函数弧度记"

"""
