文章目录
一、为什么要自己造轮子?
很多Python萌新都会问:“明明有现成的math模块,为啥还要自己写数学函数?”(灵魂发问)!!举个真实案例:上周我帮朋友做游戏物理引擎,需要快速计算三维向量的模长。结果发现直接用math.sqrt(x²+y²+z²)的时候——每次写起来巨麻烦!!!(抓狂)
这时候咱们自己写个vector_magnitude()函数,瞬间清爽了N倍!自己写数学函数的三大好处:
- 代码复用不用愁:把复杂公式打包成函数,一次编写到处调用(真香!)
- 调试效率翻倍:当计算出现偏差时,只需要检查一个函数!
- 个性化定制自由:比如给所有计算结果自动保留3位小数(老板再也不用担心我的精度问题)
二、手把手创建第一个数学函数
2.1 基础版绝对值函数
def my_abs(num):
if num >= 0:
return num
else:
return -num
(别笑!)这个看似简单的函数暗藏玄机:
- 处理整数的正确率100%
- 遇到字符串会直接报错(安全机制get√)
- 比内置abs()少做了复数处理(所以不能替代原版哦)
2.2 升级版绝对值函数
def super_abs(value):
try:
return value if value >=0 else -value
except TypeError:
print("老铁,你传的不是数字啊!")
return None
这个版本新增了:
- 异常捕获机制(TypeError杀手)
- 友好的错误提示
- 兼容int/float类型
三、实战:三角函数黑科技
3.1 角度转弧度函数
(重要知识点)Python的math模块默认用弧度制,但咱们中国人习惯用角度怎么办?
def deg_to_rad(degrees):
return degrees * 3.1415926535 / 180
测试用例:
print(deg_to_rad(90)) # 输出≈1.5708(π/2)
3.2 自定义正弦函数
不用math模块实现泰勒展开版sin函数:
def my_sin(x):
# 先把角度转成弧度
x = x % 360 # 处理超大角度
rad = deg_to_rad(x)
result = 0
# 泰勒展开前5项
for n in range(5):
numerator = (-1)**n * rad**(2*n+1)
denominator = math.factorial(2*n+1)
result += numerator / denominator
return round(result, 4)
这个函数的特点是:
- 自动处理超过360度的角度
- 结果保留4位小数
- 比math.sin()误差在0.0001以内(亲测有效)
四、参数顺序的坑(血泪教训)
去年我做项目时写过这样一个函数:
def quadratic(a, b, c):
return (-b + math.sqrt(b**2-4*a*c))/(2*a)
看起来没问题?直到某天传入参数quadratic(2, -5, 3)——居然报错了!!!(黑人问号脸)
原因揭晓:参数顺序写反了!!!应该先判断a是否为0,再计算delta。修正版:
def safe_quadratic(a, b, c):
if a == 0:
raise ValueError("a不能为0!")
delta = b**2 - 4*a*c
if delta < 0:
return None
x1 = (-b + math.sqrt(delta))/(2*a)
x2 = (-b - math.sqrt(delta))/(2*a)
return (round(x1,2), round(x2,2))
五、函数组合实战:工资计算器
假设要计算税后工资:
def salary_calculator(base, bonus):
# 自定义的加法函数
def safe_add(a, b):
return a + b if isinstance(a, (int, float)) and isinstance(b, (int, float)) else 0
# 自定义的乘法函数
def tax_calc(income):
rates = {5000:0, 8000:0.1, 15000:0.2}
for key in sorted(rates.keys(), reverse=True):
if income > key:
return (income - key) * rates[key]
return 0
total = safe_add(base, bonus)
tax = tax_calc(total)
return total - tax
这个案例展示了:
- 函数嵌套的妙用
- 自定义安全计算
- 阶梯税率计算逻辑
六、调试技巧大放送
遇到自定义函数出错时,试试这些神器:
- print大法:在关键步骤打印变量值
- type()检测:检查参数类型是否正确
- round()救命:浮点数计算记得控制精度
- 单元测试:用assert写测试用例
举个调试案例:
def test_my_sin():
assert my_sin(30) == 0.5000 # 预期值
assert abs(my_sin(90) - 1) < 0.0001
print("所有测试通过!")
七、避坑指南(新人必看)
- 浮点精度陷阱:0.1+0.2 != 0.3(用round()解决)
- 除零保护:所有除法操作前检查分母
- 参数校验:用isinstance()检查类型
- 异常处理:try-except保护核心代码
记住:好的数学函数要像瑞士军刀——功能专一但安全可靠!!!
八、拓展练习
来挑战这些自定义函数吧:
- 斐波那契数列生成器
- 矩阵乘法计算器
- 自定义对数函数
- 复数运算工具箱
(小提示:从简单功能开始,逐步增加复杂度。写废了没关系,我刚开始写斐波那契函数还搞出过死循环呢…)
最后说句大实话:看10遍教程不如自己写1遍!打开你的PyCharm/VSCode,从改写本文的示例函数开始,很快你就能创建属于自己的数学函数库啦~(记得保存版本哦)