函数参数传递与 Lambda 表达式
一、函数参数传递方式概览
Python 中函数的参数传递方式非常灵活,主要包括以下几种形式:
| 类型 | 说明 | 示例 |
|---|---|---|
| 位置参数 | 按参数顺序依次传入 | func(1, 2) |
| 关键字参数 | 按参数名传入,可与顺序无关 | func(a=1, b=2) |
| 默认参数 | 为参数提供默认值,可省略传参 | def func(a, b=10) |
可变位置参数 *args |
接收任意数量的位置参数 | def func(*args) |
可变关键字参数 **kwargs |
接收任意数量的关键字参数 | def func(**kwargs) |
二、参数传递详解
1. 位置参数
最常见的参数传递形式,按顺序依次赋值。
python
def add(a, b):
return a + b
print(add(3, 5)) # 输出 8
2. 关键字参数
通过参数名进行传递,顺序无关。
python
def greet(name, msg):
print(f"{msg}, {name}!")
greet(msg="Hello", name="Alice")
3. 默认参数
可以为部分参数设置默认值,调用时可以省略。
python
def power(base, exp=2):
return base ** exp
print(power(3)) # 9
print(power(3, 3)) # 27
注意:默认参数在定义时只计算一次,若默认值是可变对象(如 list、dict),可能引发意外行为。
4. 可变位置参数 *args
用于接收任意数量的位置参数,函数内会将它们打包成一个元组。
python
def show(*args):
print(args)
show(1, 2, 3, "hello")
# 输出:(1, 2, 3, 'hello')
5. 可变关键字参数 **kwargs
用于接收任意数量的关键字参数,函数内会将它们打包成一个字典。
python
def show_info(**kwargs):
print(kwargs)
show_info(name="Alice", age=25)
# 输出:{'name': 'Alice', 'age': 25}
6. 参数组合与顺序规则
函数定义时参数的顺序必须遵循:
位置参数 → 默认参数 → *args → **kwargs
示例:
python
def func(a, b=10, *args, **kwargs):
print(a, b, args, kwargs)
三、参数的传递机制(重要)
Python 的参数传递机制可理解为:
"对象引用传递(传值与传址的结合体)"
即:
- 如果传入的是可变对象(list, dict, set),函数内修改会影响原对象。
- 如果是不可变对象(int, str, tuple),函数内修改不会影响原对象。
python
def modify(x):
x.append(100)
nums = [1, 2, 3]
modify(nums)
print(nums) # [1, 2, 3, 100]
四、把函数作为参数
- 基本用法:将函数名(不带 ())传入另一个函数,在被调用处使用它。
def apply_twice(func, x):
return func(func(x))
def add1(n):
return n + 1
print(apply_twice(add1, 3))
五、Lambda 表达式(匿名函数)
1. 基本语法
python
lambda 参数列表: 表达式
- 用于定义简短的匿名函数;
- 表达式执行结果即为返回值;
- 适合在只使用一次的场景中(如排序、过滤)。
2. 示例
python
add = lambda x, y: x + y
print(add(2, 3)) # 5
与普通函数等价:
python
def add(x, y):
return x + y