【Python入门系列】第9讲:递归函数和高阶函数全面详解(2026最新版)
这一讲我们进入函数的进阶内容:递归函数 和 高阶函数。
这两部分内容掌握后,你写代码会更加优雅、简洁,并且为后续学习装饰器、闭包(我们之前已讲)、函数式编程打下坚实基础。
1. 递归函数(Recursion)
递归:函数在内部直接或间接地调用自己。
(1)递归的三个核心要素(必须满足)
- 递归公式(递推关系)
- 递归边界(基线条件 / 停止条件)—— 防止无限递归
- 递归方向(每次调用让问题规模变小)
(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)基础 —— 类与对象全面详解
立即练习(强烈建议现在就做):
- 用递归实现一个函数
sum_list(lst),计算列表所有元素之和(不用sum())。 - 用
map()和filter()处理列表[1,2,3,4,5,6,7,8,9,10]:
- 筛选出所有奇数
- 把每个奇数平方
- 写一个高阶函数
make_power(n),返回一个能计算 x^n 的函数(这就是闭包的经典应用)。 - 递归打印杨辉三角(前n行)。
把你的练习代码贴出来,我会帮你检查、优化,并指出递归/高阶函数的改进点!
准备好了吗?
回复 “下一讲” 我们马上进入面向对象编程世界!
或者对递归、高阶函数、lambda 有任何疑问,现在就问我!
函数进阶学完后,你的Python编程思维已经提升了一个大台阶,继续加油!你已经非常接近能独立开发小项目了!🐍✨