文章目录
一、为什么要学自定义数学函数?(这可不是吃饱撑的!)
各位老铁们!今天咱们要聊的这个Python自定义数学函数(敲黑板),绝对是你编程路上必须get的神技能!你以为数学函数只能调用现成的?Too young too simple!
举个栗子🌰:当你要计算斐波那契数列时,系统函数可不会直接给你递推公式;当你要做复杂的数据分析时,现成函数可能根本满足不了你的骚操作。这时候自定义函数就是你的瑞士军刀!(别告诉我你还在用计算器一个个按)
二、基础语法三连击(包教包会版)
2.1 函数定义的基本姿势
def 函数名(参数):
# 操作区
return 结果
注意看这个def关键字(重点标记!),它就像魔法咒语的起手式。参数可以是多个,用逗号隔开,return不是必须的,但数学函数一般都要有返回值。
2.2 第一个实战案例:平方计算器
def square(x):
return x ** 2
print(square(5)) # 输出25(这都不懂的话建议重修小学数学)
这里有个坑要注意(敲黑板):参数x可以是任意数值类型,但如果是字符串就会报错!所以建议加个类型判断:
def safe_square(x):
if not isinstance(x, (int, float)):
raise TypeError("老铁,参数得是数字啊!")
return x ** 2
2.3 参数进阶玩法(骚操作预警)
默认参数妙用
def power(base, exponent=2):
return base ** exponent
print(power(3)) # 9(默认平方)
print(power(3,3)) # 27
可变参数*args的黑科技
def multi_sum(*numbers):
total = 0
for num in numbers:
total += num
return total
print(multi_sum(1,2,3,4,5)) # 15(这个必须对)
三、硬核实战:三大经典数学函数实现
3.1 斐波那契数列生成器(面试常考!)
def fibonacci(n):
a, b = 0, 1
sequence = []
for _ in range(n):
sequence.append(a)
a, b = b, a + b
return sequence
print(fibonacci(10)) # [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
升级版(带缓存优化):
from functools import lru_cache
@lru_cache(maxsize=None)
def fib_cache(n):
if n < 2:
return n
return fib_cache(n-1) + fib_cache(n-2)
3.2 素数判断大师(装逼必备)
def is_prime(n):
if n <= 1:
return False
for i in range(2, int(n**0.5)+1):
if n % i == 0:
return False
return True
# 测试输出
print(is_prime(17)) # True
print(is_prime(100)) # False
性能优化小技巧:先判断偶数,然后遍历奇数
def is_prime_v2(n):
if n <= 1:
return False
if n == 2:
return True
if n % 2 == 0:
return False
for i in range(3, int(n**0.5)+1, 2):
if n % i == 0:
return False
return True
3.3 自定义统计函数(不用numpy也能行)
def data_analyzer(data):
analysis = {
'sum': sum(data),
'mean': sum(data)/len(data),
'max': max(data),
'min': min(data),
'range': max(data)-min(data)
}
return analysis
scores = [85, 92, 78, 90, 65]
print(data_analyzer(scores))
四、调试技巧大公开(血泪经验)
4.1 常见错误类型
- 参数类型错误(TypeError)
- 除零错误(ZeroDivisionError)
- 递归深度超标(RecursionError)
- 数学域错误(ValueError)
4.2 调试神器大法
- 打印大法好:
def debug_func(x):
print(f"输入值:{x}") # 这里!
result = x ** 2
print(f"计算结果:{result}") # 还有这里!
return result
- 断言检测:
def sqrt(x):
assert x >= 0, "负数没有实平方根!"
return x ** 0.5
- 单元测试(以素数判断为例):
import unittest
class TestPrime(unittest.TestCase):
def test_prime(self):
self.assertTrue(is_prime(2))
self.assertFalse(is_prime(1))
self.assertTrue(is_prime(999983)) # 已知大素数
if __name__ == '__main__':
unittest.main()
五、性能优化指南(速度提升10倍不是梦)
5.1 算法优化案例:计算圆周率
原始版本(蒙特卡洛法):
import random
def calculate_pi(n):
inside = 0
for _ in range(n):
x = random.random()
y = random.random()
if x**2 + y**2 <= 1:
inside += 1
return 4 * inside / n
优化版本(使用numpy向量化):
import numpy as np
def calculate_pi_fast(n):
points = np.random.rand(n, 2)
inside = np.sum(np.linalg.norm(points, axis=1) <= 1)
return 4 * inside / n
5.2 内存优化技巧
使用生成器处理大数据:
def big_data_processor():
for i in range(10**8):
yield i**2
# 使用时
for num in big_data_processor():
# 处理代码
pass
六、实际应用场景(学完就能用)
6.1 科学计算
- 自定义微分方程求解器
- 傅里叶变换实现
- 矩阵运算扩展
6.2 数据分析
- 自定义数据清洗函数
- 特征工程处理
- 业务指标计算
6.3 机器学习
- 自定义损失函数
- 评估指标实现
- 数据增强方法
七、给新手的终极建议(听人劝吃饱饭)
- 先写伪代码再写实际代码(思路清晰最重要)
- 函数功能保持单一(一个函数只做一件事)
- 参数命名要见名知意(别用a,b,c这种)
- 多写文档字符串(三个月后你会感谢自己)
- 单元测试不能少(血泪教训!)
最后送大家一句话:函数写得好,下班回家早!现在立刻打开你的IDE,把文中的案例都敲一遍(光看不动手都是耍流氓),遇到问题评论区见!走你~

被折叠的 条评论
为什么被折叠?



