Python高阶函数返回函数用法与素数筛选实例

今天早睡
今天早睡
发布时间:2026-10-12 | 3人浏览过
原创

本文详解Python高阶函数中返回函数的核心机制,通过动态求和示例展示闭包工作原理,并结合无限生成器与filter函数实现埃氏筛法,自动生成并验证小于100的全部素数。该方法能显著简化传统嵌套循环,提升代码运行效率与逻辑清晰度。

高阶函数返回函数的运行机制

高阶函数除了可以接受函数作为参数外,还允许将内部定义的函数作为结果值直接返回。这种写法常用于构建延迟计算或闭包场景。当外层函数被调用时,实际返回的是内层函数的对象而非计算结果,只有在后续主动触发该函数时才会执行业务逻辑。

以下代码演示了如何通过返回函数实现动态参数求和:

# 定义高阶函数,接收可变参数
def sum_fun(*args):
    # 内部定义求和逻辑函数
    def add_fun():
        s = 0
        for i in args:
            s += i
        return s
    # 返回函数对象本身,而非直接调用
    return add_fun

# 调用高阶函数获取内部函数引用
f = sum_fun(1, 2, 3, 4, 5, 6, 7, 8, 9)
# 执行返回的函数以获取最终结果
add = f()
print(add)  # 输出: 45

调用 sum_fun 时,Python解释器会创建作用域并将参数 args 绑定到闭包环境中,最后返回 add_fun 的内存地址。赋值给变量 f 后,通过括号 f() 发起调用才完成实际的累加运算。

构建素数筛选生成器的完整步骤

借助返回函数与迭代器特性,可以使用经典的埃氏筛法配合 filter 优雅地实现素数生成。算法核心在于不断剔除已发现质数的倍数,保留剩余的奇数序列。

第1步:创建无限奇数序列生成器

偶数(除2外)均非素数,因此首先构造一个从3开始的奇数迭代器,避免不必要的整除判断。

def odd_num():
    n = 1
    while True:
        n += 2
        yield n

第2步:编写可复用的过滤判断逻辑

为了配合 filter 使用,需设计一个工厂函数,它接收当前已知的最小质数 n,并返回一个用于检测其他数字能否被其整除的匿名函数。

def un_divisible(n):
    # 返回lambda,检测传入值x对n取余是否大于0
    return lambda x: x % n > 0

第3步:组合生成器链并输出结果

将上述组件接入主生成器 primes。首次直接yield最小质数2,随后进入循环:取出下一个奇数作为新质数yield,并利用 filter 结合上一步的过滤逻辑截断原序列,形成链式迭代。

def primes():
    yield 2  # 明确输出第一个素数
    it = odd_num()
    while True:
        n = next(it)       # 获取序列中的首个候选数
        yield n            # 确认为素数并输出
        it = filter(un_divisible(n), it)  # 基于该素数过滤后续序列

# 迭代打印小于100的素数
for i in primes():
    if i < 100:
        print(i, end=' ')
    else:
        break

运行上述代码后,控制台将按顺序输出100以内的全部质数。程序利用惰性求值特性,仅在需要时计算下一步迭代状态,内存占用极低。

终端运行结果:打印出小于100的全部素数
图1:程序执行后输出的完整素数序列

总结

通过将函数作为数据返回,配合生成器的惰性求值与 filter 的高阶过滤能力,能够以极简的代码结构实现复杂的数学筛选逻辑。掌握此类函数式编程模式,在处理流式数据或优化递归替代方案时具有显著的工程价值。以上就是Python高阶函数返回函数用法与素数筛选的详细内容,更多关于Python函数式编程的技巧资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表