Python 函数进阶
在 Python 编程中,函数是组织代码的基本单元。掌握函数的进阶技巧,包括变量作用域管理、高阶函数应用、递归逻辑以及 Lambda 表达式,能够显著提升代码的复用性和可维护性。
变量的作用域
一个程序中的所有变量并不是在任何位置都可以访问的。访问权限取决于变量是在哪里赋值的。变量的作用域决定了在哪一部分程序中你可以访问哪个特定的变量名称。
全局变量
全局变量是在函数外部定义的变量,可以在整个脚本的任何地方被访问(除非被局部变量遮蔽)。
global_var = "I am global"
def print_global():
print(global_var)
print_global()
局部变量
局部变量是在函数内部定义的变量,只能在定义它的函数内部访问。
def func():
local_var = "I am local"
print(local_var)
func()
# print(local_var) # 这里会报错,NameError
修改变量作用域
在函数内部修改全局变量需要使用 global 关键字声明。如果希望修改嵌套作用域中的非全局变量,可以使用 nonlocal 关键字。
count = 0
def increment():
global count
count += 1
return count
print(increment()) # 输出 1
print(increment()) # 输出 2
# nonlocal 示例
def outer():
x = 10
def inner():
nonlocal x
x = 20
print(x)
inner()
print(x)
outer() # 输出 20, 20
高阶函数
高阶函数是指至少满足以下两个条件之一的函数:
- 接受一个或多个函数作为参数。
- 返回一个函数。
什么是高阶函数?
函数的参数为另一个函数
将函数作为参数传递给其他函数,可以实现回调机制或通用算法。
def apply_operation(func, value):
return func(value)
def double(x):
return x * 2
result = apply_operation(double, 5)
print(result) # 输出 10
函数的返回值为另一个函数
函数可以返回另一个函数对象,常用于闭包场景。
def make_multiplier(n):
def multiplier(x):
return x * n
return multiplier
times_two = make_multiplier(2)
times_three = make_multiplier(3)
print(times_two(5)) # 输出 10
print(times_three(5)) # 输出 15
内置高阶函数
map() 函数
map() 函数接收一个函数和一个可迭代对象,将函数作用于该对象的每个元素,并返回迭代器。
nums = [1, 2, 3, 4]
squared = list(map(lambda x: x**2, nums))
print(squared) # 输出 [1, 4, 9, 16]
filter() 函数
filter() 函数用于过滤序列,只保留使函数返回 True 的元素。
nums = [1, 2, 3, 4, 5, 6]
even_nums = list(filter(lambda x: x % 2 == 0, nums))
print(even_nums) # 输出 [2, 4, 6]
递归
递归是指函数在其定义中调用自身的过程。它是解决复杂问题的一种强大工具,但需要谨慎使用以避免栈溢出。
函数内部自己调用自己
递归的核心在于将大问题分解为规模更小的同类子问题。
必须有出口
递归必须包含终止条件(基准情况),否则会导致无限循环和栈溢出错误。
数字累加和示例
计算从 1 到 n 的数字累加和。
def sum_recursive(n):
if n == 1:
return 1
return n + sum_recursive(n - 1)
print(sum_recursive(5)) # 输出 15
执行流程
当调用 sum_recursive(5) 时,系统会建立多个栈帧,直到达到基准条件 n=1,然后逐层返回结果。
递归三原则
- 递归必须有停止条件:确保递归不会无限进行。
- 递归必须改变其状态并向停止条件靠近:每次调用应更接近基准情况。
- 递归必须递归地调用自己:核心逻辑通过自我调用来实现。
lambda 表达式
lambda 表达式,又名匿名函数,用于创建小型的单行函数对象。
适用场景
如果一个函数有一个返回值,并且只有一句代码,可以使用 lambda 简化。
语法
lambda arguments: expression
- 注意:lambda 表达式的参数可有可无,函数的参数在 lambda 表达式中完全适用。
- lambda 函数能接收任何数量的参数,但只能返回一个表达式的值。
快速上手
add = lambda x, y: x + y
print(add(3, 5)) # 输出 8
夹带参数
lambda 常与高阶函数配合使用,如 map 和 filter。
names = ['Alice', 'Bob', 'Charlie']
upper_names = list(map(lambda name: name.upper(), names))
print(upper_names) # 输出 ['ALICE', 'BOB', 'CHARLIE']
总结
本文介绍了 Python 函数的高级特性。理解变量作用域有助于避免命名冲突;掌握高阶函数和内置函数(map/filter)能提升代码简洁度;递归适用于分治类问题;Lambda 表达式则适合轻量级函数定义。在实际开发中,应根据具体场景选择合适的方式,平衡可读性与性能。


