小菜鸟的python进阶之路 ------- 高阶函数

本文深入探讨了Python中的高阶函数概念,包括map(), reduce()和filter()等内置函数的使用方法及实例,展示了如何利用这些函数进行高效的数据处理。

高阶函数

  • 高阶函数
  • python中的内置高阶函数

 

1.高阶函数

特点:

  •   实参是一个函数
  •    函数的返回值也是一个函数

示例:

abs()       #求绝对值的函数
f = abs     #函数本身可以赋值给变量,变量也可以指向函数

def fun(x,y,f):      #传递的参数包括函数名
    return f(x),f(y)    #返回值是函数

print(fun(-10,34,abs))

 

2.python中内置的高阶函数

  • map()
  • reduce()
  • filter()

 

(1)map()函数

特点:接收两个参数,一个是函数,一个是序列
作用:map 将传入的函数依次作用到序列的每个元素,并且把结果作为一个对象返回


练习:对于序列的每个元素求阶乘(10个,2~7之间的随机)

import random
def factoria(x):
    res = 1
    for i in range(1,x+1):
        res *= i
    return res

li = [random.randint(2,7) for i in range(10)]
print(list(map(factoria,li)))

 

(2)reduce()函数

特点:接收两个参数,一个函数,一个序列

作用:把一个函数作用在一个序列上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素累计计算

形式:reduce(f,[x1,x2,x3,x4,x5]) = f(f(f(x1,x2),x3),x4)

注意:在python3中时用reduuce()函数,要先将导入

            from functools import reduce

 

示例:求3的阶乘

from functools import reduce
def multi(x,y):
    return x * y

print(reduce(multi,range(1,4)))


 

(3)filter()过滤函数

特点:map类似,也接受一个函数和一个序列

作用:filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃列表中的该元素

示例:输出10以内的偶数

def isodd(num):
    if num % 2 == 0:
        return True
    else:
        return False

print(list(filter(isodd,range(10))))

 

 

在限定 $ y/x \in (-1, 1) $ 的范围内计算 $ \arctan(y/x) $,通常用于简化数值计算或在定点实现中优化查表效率。以下是几种常用方法: --- ### 利用泰勒级数展开 当 $ |x| < 1 $ 时,反正切函数可以使用泰勒级数近似表示为: $$ \arctan(x) = x - \frac{x^3}{3} + \frac{x^5}{5} - \frac{x^7}{7} + \cdots $$ 此公式收敛较快,尤其适用于 $ x \in (-1, 1) $ 范围内的输入。例如,取前四项可得: $$ \arctan(x) \approx x - \frac{x^3}{3} + \frac{x^5}{5} - \frac{x^7}{7} $$ 该方法适合软件实现,但需注意截断误差对精度的影响。 --- ### 使用多项式逼近(如 Chebyshev 近似) 为了提高计算效率和精度,可在区间 $ [-1, 1] $ 上构造一个低阶多项式逼近 $ \arctan(x) $。例如,使用如下形式的三阶多项式: $$ \arctan(x) \approx a_1 x + a_3 x^3 $$ 其中系数 $ a_1, a_3 $ 可通过最小二乘拟合或 Chebyshev 逼近法确定。这种方法比泰勒展开更稳定且误差更小。 --- ### 查找表插值法(LUT) 对于嵌入式系统或实时性要求高的场景,可以预先构建一个包含 $ \arctan(x) $ 值的查找表,并在运行时通过线性插值获取结果。例如: ```c #define LUT_SIZE 1024 float atan_lut[LUT_SIZE]; // 初始化查找表 for (int i = 0; i < LUT_SIZE; ++i) { float x = (float)i / (LUT_SIZE - 1); // x ∈ [0, 1] atan_lut[i] = atan(x); } // 插值查询 float lookup_atan(float x) { int index = (int)((x + 1.0f) * (LUT_SIZE - 1) / 2.0f); // 映射到 [0, LUT_SIZE-1] return atan_lut[index]; } ``` 此方法速度快,但需要权衡内存占用与精度。 --- ### Cordic 算法实现 Cordic 是一种仅使用移位和加法的迭代算法,特别适合定点硬件实现。其核心思想是通过旋转向量逐步逼近目标角度。伪代码如下: ```python def cordic_atan(y, x): angle_sum = 0 for i in range(16): # 迭代次数 if y < 0: x, y, angle_sum = x - (y >> i), y + (x >> i), angle_sum - atan_table[i] else: x, y, angle_sum = x + (y >> i), y - (x >> i), angle_sum + atan_table[i] return angle_sum ``` 该算法无需乘除运算,非常适合资源受限环境。 --- ### 输入归一化与象限处理 由于限定 $ y/x \in (-1, 1) $,即斜率绝对值小于 1,因此只需考虑第一、第四象限的角度计算。若原始坐标位于其他象限,可通过符号判断调整最终结果。例如: - 若 $ x < 0 $,则实际角度应加上 $ \pi $ - 若 $ y < 0 $,则角度可能为负,需根据应用需求进行调整(如转换为 $ 2\pi + \theta $) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值