阶段 02 讲义
数学 11h:高数 · 函数极限与连续
编程 9h:运算符与流程入门
第一部分 · 数学
1 函数极限:从数列到函数
数列极限看的是 $n \to \infty$。函数极限看的是 $x$ 趋近某个值。
记号:$\lim_{x\to x_0} f(x) = A$
直观:$x$ 靠近 $x_0$ 时,$f(x)$ 靠近 $A$。
⚠️ 关键点:$x \to x_0$ 时,我们不关心 $f(x_0)$ 等于什么,甚至 $f$ 在 $x_0$ 处可以没有定义。
关心的是"靠近的过程中"的趋势。例子:$\lim_{x\to1}\frac{x^2-1}{x-1}$,在 $x=1$ 处无定义(分母为 0),
但 $\frac{x^2-1}{x-1} = x+1$(当 $x \ne 1$),所以极限是 2。
2 ε-δ 定义 ⭐
$\lim_{x\to x_0} f(x) = A$ 的定义:
对任意 $\varepsilon > 0$,存在 $\delta > 0$,使得当
$$0 < |x - x_0| < \delta$$
时,恒有
$$|f(x) - A| < \varepsilon$$
逐字解读:
| 符号 | 含义 |
|---|---|
| $0 < \lvert x-x_0\rvert$ | $x$ 不等于 $x_0$(挖掉这一点) |
| $< \delta$ | 但 $x$ 要足够靠近 $x_0$ |
| $\lvert f(x)-A\rvert < \varepsilon$ | 对应的函数值要足够靠近 $A$ |
和 ε-N 的对比:
| 数列 | 函数 | |
|---|---|---|
| 自变量趋近 | $n \to \infty$(只有一边) | $x \to x_0$(左右两边) |
| 控制自变量的 | $N$($n > N$) | $\delta$($\lvert x-x_0\rvert < \delta$) |
逻辑结构完全一样:挑战者给 ε,你回一个 δ(或 N)。
2.1 完整证明例子
证明 $\lim_{x\to 2}(3x-1) = 5$
分析(做题先分析,再写证明):
$$|f(x) - A| = |(3x-1) - 5| = |3x - 6| = 3|x-2|$$
要让 $3|x-2| < \varepsilon$,只需 $|x-2| < \frac{\varepsilon}{3}$。
证明:
任取 $\varepsilon > 0$,取 $\delta = \frac{\varepsilon}{3}$。
当 $0 < |x-2| < \delta$ 时:
$$|(3x-1)-5| = 3|x-2| < 3\delta = 3 \cdot \frac{\varepsilon}{3} = \varepsilon \quad \checkmark$$
∎
套路:把 $|f(x)-A|$ 化成"常数 × |x-x_0|"的形式,然后让这个常数 × δ ≤ ε。
3 左右极限
左极限:$x$ 从左边趋近,记 $\lim_{x\to x_0^-} f(x)$
右极限:$x$ 从右边趋近,记 $\lim_{x\to x_0^+} f(x)$
重要定理:$\lim_{x\to x_0} f(x)$ 存在 ⟺ 左右极限都存在且相等
用于判断分段函数:
$$f(x) = \begin{cases} x+1, & x < 0 \\ x^2, & x \ge 0 \end{cases}$$
- 左极限:$\lim_{x\to0^-}(x+1) = 1$
- 右极限:$\lim_{x\to0^+}x^2 = 0$
- 左右不等 → 极限不存在
4 两个重要极限 ⭐
这两个必须背下来,考试和后续都要用:
$$\lim_{x\to 0}\frac{\sin x}{x} = 1$$
$$\lim_{x\to\infty}\left(1+\frac{1}{x}\right)^x = e$$
第二个的变形(更常考):
$$\lim_{x\to 0}(1+x)^{\frac{1}{x}} = e$$
用法示例:
$$\lim_{x\to0}\frac{\sin 3x}{x} = \lim_{x\to0}\frac{\sin 3x}{3x} \cdot 3 = 1 \cdot 3 = 3$$
技巧:凑成 $\frac{\sin \Box}{\Box}$ 的形式,其中 $\Box \to 0$。
5 无穷小与无穷大
无穷小:极限为 0 的量。
无穷大:绝对值无限增大的量(注意:无穷大不是数)。
无穷小的性质:
- 有限个无穷小之和仍是无穷小
- 有界函数 × 无穷小 = 无穷小 ← 很有用
- $\lim f(x) = A$ ⟺ $f(x) = A + \alpha$,其中 $\alpha$ 是无穷小
无穷小的比较($\alpha, \beta$ 都趋于 0):
| 关系 | 条件 | 记号 |
|---|---|---|
| 高阶 | $\lim\frac{\alpha}{\beta}=0$ | $\alpha = o(\beta)$ |
| 同阶 | $\lim\frac{\alpha}{\beta}=c \ne 0$ | 无 |
| 等价 | $\lim\frac{\alpha}{\beta}=1$ | $\alpha \sim \beta$ |
常用等价无穷小(当 $x \to 0$),这个表要背。
$$\sin x \sim x, \quad \tan x \sim x, \quad \arcsin x \sim x$$
$$1 - \cos x \sim \frac{x^2}{2}, \quad \ln(1+x) \sim x, \quad e^x - 1 \sim x$$
💡 用法:在乘除中可以直接替换,能极大简化计算。
⚠️ 但在加减中不能随便换(可能出错)!
6 连续性
定义:$f$ 在 $x_0$ 连续 ⟺ $\lim_{x\to x_0}f(x) = f(x_0)$
即:极限存在 + 等于函数值。
三个条件:
1. $f(x_0)$ 有定义
2. $\lim_{x\to x_0}f(x)$ 存在
3. 两者相等
间断点分类:
| 类型 | 特征 |
|---|---|
| 可去间断点 | 左右极限存在且相等,但不等于函数值(或函数值不存在) |
| 跳跃间断点 | 左右极限存在但不相等 |
| 无穷间断点 | 至少一侧趋于无穷 |
| 振荡间断点 | 如 $\sin\frac1x$ 在 $x=0$ |
前两类合称第一类间断点,后两类是第二类。
连续函数的性质:
- 连续函数的和差积商仍连续(分母不为 0)
- 初等函数在其定义域内连续
- 闭区间上连续函数:有界、有最大最小值、介值定理
6.1 介值定理与零点存在定理 ⭐
介值定理:$f$ 在 $[a,b]$ 上连续,则 $f$ 能取到 $f(a)$ 和 $f(b)$ 之间的一切值。
它的"实用版"是零点存在定理:
若 $f$ 在 $[a,b]$ 上连续,且 $f(a)$ 与 $f(b)$ 异号,
则在 $(a,b)$ 内至少存在一点 $\xi$,使 $f(\xi)=0$。
直觉:一笔画一条连续的线,从 $x$ 轴下方画到上方,必然穿过 $x$ 轴。绕不过去。
⚠️ "连续"这个前提不能少:$f$ 在 $[-1,1]$ 上若在 0 处断开(比如 $f(x)=1/x$,
在 0 无定义),就可以"跳"过去而不穿过。
为什么这个定理重要:它是二分法求根的理论基础。
不知道根在哪,但知道"一定存在",那就把区间对半砍,看根在哪半边,反复进行。
这就是二分法:它不靠聪明,靠每次都能排除一半。
手算体验一下:求 $\sqrt2$ 的近似值,即求 $f(x)=x^2-2$ 的零点。
$f(1)=-1<0$,$f(2)=2>0$ → 根在 $(1,2)$
取中点 1.5:$f(1.5)=0.25>0$ → 根在 $(1,1.5)$
取中点 1.25:$f(1.25)=-0.4375<0$ → 根在 $(1.25,1.5)$
取中点 1.375:$f(1.375)=-0.109<0$ → 根在 $(1.375,1.5)$
……
每砍一次,区间长度减半。$\sqrt2=1.41421\dots$,就在这一串区间里。这个思路你写循环时(阶段 3)就能让计算机替你砍,这是你的第一个"数值算法"。
7 数学作业 S2
- [ ] 1. 用 ε-δ 语言证明 $\lim_{x\to 3}(2x+1) = 7$
- [ ] 2. 求极限:$\lim_{x\to1}\frac{x^2-1}{x-1}$
- [ ] 3. 求极限:$\lim_{x\to0}\frac{\sin 5x}{\sin 3x}$(提示:凑成两个 $\frac{\sin\Box}{\Box}$)
- [ ] 4. 求极限:$\lim_{x\to\infty}\left(1+\frac{2}{x}\right)^x$(提示:凑成 $(1+\frac{1}{\Box})^\Box$ 的形式)
- [ ] 5. 求极限:$\lim_{x\to0}\frac{1-\cos x}{x^2}$(用等价无穷小)
- [ ] 6. 判断 $f(x)=\frac{x^2-4}{x-2}$ 在 $x=2$ 处的间断点类型;若可去,如何补充定义使其连续?
- [ ] 7. 求 $f(x)=\begin{cases} x^2, & x<1 \\ 2x-1, & x \ge 1\end{cases}$ 在 $x=1$ 处是否连续
- [ ] 8.(手算)用二分法求 $f(x)=x^3-x-2$ 的零点,精确到 0.5 以内
提示:先找两个整数让 $f$ 异号,然后不断取中点、看符号换边。
不用写代码,用笔算,这一步是让你体会"每次排除一半"的威力。 - [ ] 9.(Python)用 numpy 数值检验 $\lim_{x\to0}\frac{\sin x}{x}=1$
第 8 题参考代码:
import numpy as np
for x in [0.1, 0.01, 0.001, 0.0001]:
print(f"x={x:<8} sin(x)/x = {np.sin(x)/x:.10f}")
# 注意:别直接算 x=0!那会是 0/0
你会看到数值越来越接近 1,但永远不等于 1。
⚠️ x 越小,浮点误差越大。这也是数值计算的一个真实陷阱。补充:可以试试直接算
np.sin(0)/0,看看会发生什么(会有警告,结果是nan)。
第二部分 · 编程
8 算术运算符
| 运算符 | 含义 | 例子 | 结果 |
|---|---|---|---|
+ |
加 | 7 + 2 |
9 |
- |
减 | 7 - 2 |
5 |
* |
乘 | 7 * 2 |
14 |
/ |
除(总是浮点) | 7 / 2 |
3.5 |
// |
整除(向下取整) | 7 // 2 |
3 |
% |
取余 | 7 % 2 |
1 |
** |
幂 | 7 ** 2 |
49 |
⚠️ 三个最容易搞错的:
-/永远返回浮点数,4 / 2得到2.0不是2
-//是向下取整,负数时要注意:-7 // 2得到-4(不是-3)
-%的结果符号跟除数走:-7 % 2得到1
print(7 / 2) # 3.5
print(7 // 2) # 3
print(-7 // 2) # -4 ← 不是 -3!
print(-7 % 2) # 1
print(2 ** 10) # 1024
整除和取余的经典用途是数位拆分。
num = 365
print(num // 100) # 3 百位
print(num % 10) # 5 个位
print((num // 10) % 10) # 6 十位
9 比较运算符
| 运算符 | 含义 |
|---|---|
== |
等于 |
!= |
不等于 |
> < |
大于 / 小于 |
>= <= |
大于等于 / 小于等于 |
结果永远是布尔值(True / False):
print(5 > 3) # True
print(5 == 5.0) # True (值相等)
print("a" == "A") # False (区分大小写)
⚠️
==和=完全不同:
-=是赋值(贴标签)
-==是比较(问"相等吗")这是初学者最常见的笔误。
10 逻辑运算符
| 运算符 | 含义 | 例子 |
|---|---|---|
and |
与(都真才真) | True and False → False |
or |
或(有真就真) | True or False → True |
not |
非(取反) | not True → False |
短路求值(重要):
# and:左边为假,右边不计算
result = False and (1/0) # 不会报错!因为左边已经是 False
# or:左边为真,右边不计算
result = True or (1/0) # 也不会报错
实用技巧:
x = value or default,如果value是假的(空、0、None),就用默认值。
11 条件语句
score = 85
if score >= 90:
print("A")
elif score >= 80:
print("B")
elif score >= 70:
print("C")
else:
print("D")
结构说明:
- if 必须
- elif(else if)可有多个
- else 可选,放最后
- 每个条件后面有冒号 :
- 缩进表示"属于哪个分支"
嵌套:
age = 20
has_id = True
if age >= 18:
if has_id:
print("可以进入")
else:
print("需要证件")
else:
print("未成年")
用 and 简化(更清晰):
if age >= 18 and has_id:
print("可以进入")
💡 经验:嵌套超过两层就该想办法简化了(用
and/or,或拆成函数)。
12 布尔值的"真值"
哪些东西是"假"的:
# 下面这些都会被当作 False
False
None
0
0.0
"" # 空字符串
[] # 空列表
{} # 空字典
其他都是 True:
if "hello": # 非空字符串 → True
print("真")
if []: # 空列表 → False,这里的代码不执行
print("不会打印")
💡 实用:判断列表非空可以写
if my_list:而不是if len(my_list) > 0:
13 in 运算符
print("a" in "cat") # True 子串
print("z" in "cat") # False
print(3 in [1, 2, 3]) # True 列表成员
print(5 not in [1, 2, 3]) # True
14 🔧 技能卡 2:自己找答案(help() 和 dir())
技能卡 1 教的是"代码错了怎么办",这张卡教的是"我忘了怎么用怎么办"。
自学最大的瓶颈不是不会,是不会的时候不知道去哪问。Python 把答案装在里面了。
14.1 help():查任何东西怎么用
help(print)
help(str)
help(str.split) # 查字符串的某一个方法
它会打印出说明书:这个函数要什么参数、干什么、怎么用。
14.2 dir():看一个东西有哪些本事
s = "hello"
print(dir(s))
# ['capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', ...]
一长串名字就是字符串所有能用的方法。看到不认识的(比如 startswith),
就 help(s.startswith) 查一下。
print("hello.py".startswith("hello")) # True
print("hello.py".endswith(".py")) # True
💡 实用:想知道"字符串能不能做某件事",先
dir()看一眼名字里有没有相关的。
14.3 三条自学的路
| 遇到什么 | 去哪 |
|---|---|
| 忘了某个函数怎么用 | help(函数名) |
| 想知道某类型有哪些方法 | dir(对象),再 help() 细看 |
| 不确定某行为的细节 | 官方文档 docs.python.org/zh-cn/3/(有中文版) |
⚠️ 一个坑:
dir()的输出包含以__开头结尾的(如__doc__、__class__)。
那些是 Python 内部用的,你现在不用管,看没有下划线开头的那些就行。💡 心态:没人记得住所有方法。专业程序员也是天天查
help()和文档。
"会查"比"记得住"重要得多。
15 🧠 这跟认知科学有什么关系
概念性内容,无法用代码验证,请对照文献。
if / elif / else ↔ 认知架构里的「产生式规则」。
认知科学里有一类理论认为,人的认知过程可以被建模成一大堆"条件 → 动作"规则。
比如 ACT-R、Soar 这些认知架构,核心机制就是:
如果 目标是解方程 且 方程是二次的
则 使用求根公式
这就是 if ... : ...。你在这一节学的条件语句,正是这些模型写出来的样子。
短路求值 ↔ 加工的"提前终止"。
False and (1/0) 不报错,因为左边为假时右边根本不计算。
认知里有没有类似现象?有研究认为某些加工会提前中止,但这个类比比较松,
我不建议你把它当结论用。举它只是想让你知道,短路是普遍的计算策略,
不是 Python 的怪癖。
布尔逻辑 ↔ 信号检测论(SDT)的 2×2 决策矩阵。
这个是扎实的。信号检测论里,每次判断有两种事实(有信号 / 无信号)和两种反应(说有 / 说无),
组合出四种结果:
| 实际有信号 | 实际无信号 | |
|---|---|---|
| 报告"有" | 命中 (Hit) | 虚报 (False Alarm) |
| 报告"无" | 漏报 (Miss) | 正确拒绝 (Correct Rejection) |
这本质上就是真值表。而你把"判定标准"写成一个条件判断时,
就是在实现 SDT 里的判断标准(criterion):
# 下面是伪代码(示意结构,不能直接跑)
if 证据强度 >= 判断标准:
报告("有信号") # 可能是命中,也可能是虚报——取决于真相
else:
报告("无信号") # 可能是正确拒绝,也可能是漏报
这段对应关系是真的,你在实验心理学/认知心理学课上会正式学到 SDT。
到时候回头看这行 if,会觉得"原来我早写过"。
等价无穷小 ↔ 认知建模里的线性近似。
认知模型经常把非线性关系在小范围内近似成线性("在阈限附近,感觉强度≈刺激强度×常数"),
这正是等价无穷小做的事,在小范围内,复杂的东西可以用简单的东西代替。
⚠️ 再提醒一次:上面 SDT 那条对应关系是真的(它是实验心理学的标准内容),
但"短路求值 ↔ 提前终止"那条只是松散的类比。
数学我能保证;类比能不能用,得回到文献。
16 编程作业 S2
- [ ] 1. 写程序:输入三个数,输出最大值
提示:可以先假设第一个最大,再依次比较;或用
max()验证你的结果 - [ ] 2. 用 f-string 格式化输出一个表格,3 行数据(姓名、年龄)对齐
- [ ] 3. 输入身高(米)和体重(公斤),计算 BMI 并判断:
BMI = 体重 / 身高² | < 18.5 偏瘦 | 18.5–24 正常 | 24–28 超重 | ≥28 肥胖
- [ ] 4. 输入一个年份,判断是否为闰年
规则:能被 4 整除但不能被 100 整除,或能被 400 整除
- [ ] 5. 输入一个整数,判断它是奇数还是偶数、是正数还是负数
第 4 题参考框架(先自己写):
year = int(input("输入年份:"))
if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
print(f"{year} 是闰年")
else:
print(f"{year} 不是闰年")
第 3 题提示:
height = float(input("身高(米):"))
weight = float(input("体重(公斤):"))
bmi = weight / height ** 2
print(f"你的 BMI 是 {bmi:.1f}")
if bmi < 18.5:
print("偏瘦")
elif bmi < 24:
print("正常")
elif bmi < 28:
print("超重")
else:
print("肥胖")
自测:把
bmi手动设成 18.5、24、28 这几个边界值,看判断对不对。
边界值是 bug 高发区,这是编程的一条经验。
本阶段自评
- 数学:ε-δ 和 ε-N 的区别在哪?(提示:自变量的趋近方式)
- 数学:你会用等价无穷小简化 $\lim_{x\to0}\frac{\ln(1+x)}{x}$ 吗?
- 数学:零点存在定理要求什么前提?为什么连续不能少?
- 数学:二分法每砍一次,能保证什么?(一句话)
- 编程:
7 // 2和7 % 2分别是多少?-7 // 2呢? - 编程:
if my_list:和if my_list != []:有什么区别? - 技能:你忘了
split怎么用,第一件事该做什么? - 连接:SDT 的"命中/虚报/漏报/正确拒绝"和真值表是什么关系?
全部答得上 → 进阶段 3。