Python入门:9.递归函数和高阶函数

【Python入门系列】第9讲:递归函数和高阶函数全面详解(2026最新版)

这一讲我们进入函数的进阶内容:递归函数高阶函数
这两部分内容掌握后,你写代码会更加优雅、简洁,并且为后续学习装饰器、闭包(我们之前已讲)、函数式编程打下坚实基础。

1. 递归函数(Recursion)

递归:函数在内部直接或间接地调用自己。

(1)递归的三个核心要素(必须满足)

  1. 递归公式(递推关系)
  2. 递归边界(基线条件 / 停止条件)—— 防止无限递归
  3. 递归方向(每次调用让问题规模变小)

(2)经典递归例子

例1:阶乘(factorial)

def factorial(n):
    if n == 0 or n == 1:        # 基线条件
        return 1
    return n * factorial(n - 1) # 递归公式 + 规模缩小

print(factorial(5))   # 120

例2:斐波那契数列(Fibonacci)

def fib(n):
    if n <= 1:
        return n
    return fib(n-1) + fib(n-2)

print(fib(10))        # 55

例3:递归遍历目录结构(实战常用)

import os

def list_files(path, level=0):
    for item in os.listdir(path):
        full_path = os.path.join(path, item)
        print("  " * level + "|-- " + item)
        if os.path.isdir(full_path):
            list_files(full_path, level + 1)   # 递归调用

# list_files(".")

(3)递归 vs 循环

维度递归循环(for/while)
代码简洁度通常更优雅较长
可读性数学思维强时很好大多数人更容易理解
性能有调用开销,可能栈溢出更好
内存占用每层调用都占用栈空间固定空间
适用场景树、图、分治、DFS简单重复、计数

Python递归深度限制:默认约1000层(可通过 sys.setrecursionlimit() 修改,但不推荐)。

尾递归优化:Python官方解释器支持尾递归优化,所以深递归容易栈溢出。

(4)递归转迭代(推荐实战写法)

# 迭代版阶乘
def factorial_iter(n):
    result = 1
    for i in range(1, n+1):
        result *= i
    return result

2. 高阶函数(Higher-Order Function)

定义:把函数作为参数传入,或者把函数作为返回值返回的函数。

Python中高阶函数是函数式编程的核心。

(1)常见内置高阶函数

map() —— 对序列中每个元素应用函数

nums = [1, 2, 3, 4, 5]

squares = list(map(lambda x: x**2, nums))
print(squares)          # [1, 4, 9, 16, 25]

# 等价列表推导式(更推荐)
squares2 = [x**2 for x in nums]

filter() —— 过滤满足条件的元素

even = list(filter(lambda x: x % 2 == 0, nums))
print(even)             # [2, 4]

reduce() —— 从 functools 导入,对序列进行累积计算

from functools import reduce

total = reduce(lambda x, y: x + y, nums)   # 15
product = reduce(lambda x, y: x * y, nums) # 120

sorted() —— 支持 key 函数

students = [("小明", 85), ("小红", 92), ("小刚", 78)]

# 按成绩降序排序
sorted_students = sorted(students, key=lambda x: x[1], reverse=True)
print(sorted_students)

(2)自定义高阶函数

def apply_twice(func, value):
    """把函数执行两次"""
    return func(func(value))

def add_one(x):
    return x + 1

print(apply_twice(add_one, 5))   # 7

(3)lambda 表达式(匿名函数)

# 普通函数
def square(x):
    return x ** 2

# lambda 等价写法
square_lambda = lambda x: x ** 2

# 常用于高阶函数中
nums = [1, 5, 3, 9, 2]
print(sorted(nums, key=lambda x: -x))   # 降序

lambda 使用建议

  • 适合简单单行逻辑
  • 复杂逻辑还是定义普通函数更清晰

3. 综合实战:递归 + 高阶函数

# 用递归计算目录中所有 .py 文件的总行数
def count_py_lines(path):
    total = 0
    for item in os.listdir(path):
        full = os.path.join(path, item)
        if os.path.isfile(full) and full.endswith(".py"):
            with open(full, encoding="utf-8") as f:
                total += len(f.readlines())
        elif os.path.isdir(full):
            total += count_py_lines(full)   # 递归
    return total

4. 本讲总结口诀

递归三要素
有边界 + 有公式 + 规模缩小

高阶函数核心
函数可以当参数,也可以当返回值

记忆口诀
递归像俄罗斯套娃,一层层打开直到最里面; 高阶函数像指挥官,让函数去指挥另一个函数。


下一讲预告
Python入门第10讲:面向对象编程(OOP)基础 —— 类与对象全面详解

立即练习(强烈建议现在就做)

  1. 用递归实现一个函数 sum_list(lst),计算列表所有元素之和(不用 sum())。
  2. map()filter() 处理列表 [1,2,3,4,5,6,7,8,9,10]
  • 筛选出所有奇数
  • 把每个奇数平方
  1. 写一个高阶函数 make_power(n),返回一个能计算 x^n 的函数(这就是闭包的经典应用)。
  2. 递归打印杨辉三角(前n行)。

把你的练习代码贴出来,我会帮你检查、优化,并指出递归/高阶函数的改进点!

准备好了吗?
回复 “下一讲” 我们马上进入面向对象编程世界!
或者对递归、高阶函数、lambda 有任何疑问,现在就问我!

函数进阶学完后,你的Python编程思维已经提升了一个大台阶,继续加油!你已经非常接近能独立开发小项目了!🐍✨

文章已创建 5268

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部