在上一节中,我们学习了如何定义和调用函数,了解了函数的基本结构。 然而,在实际编程中,函数往往需要更强的灵活性,比如:
- 能接受不同数量、类型的输入参数;
- 能根据情况返回一个或多个结果。
本节我们将深入学习 函数的参数类型 与 返回值机制,让你掌握函数的核心逻辑与应用技巧。
一、函数参数的作用
参数是函数与外部数据沟通的桥梁。 通过参数,函数可以在不同场景下复用同一逻辑,而不必重复编写相似的代码。
二、函数参数的类型
Python 的函数参数非常灵活,主要分为以下几类:
1. 位置参数(Positional Arguments)
最常见的参数类型,调用时必须按顺序传值。
python
def greet(name, age):
print(f"你好,{name},你今年 {age} 岁啦!")
greet("小明", 18)
调用时必须保证参数数量一致,否则会报错。
2. 关键字参数(Keyword Arguments)
调用函数时可以通过指定参数名来传值,顺序可以不同。
python
def show_info(name, city):
print(f"{name} 来自 {city}")
show_info(city="北京", name="小红")
这种方式可读性更强,尤其适合参数较多的函数。
3. 默认参数(Default Arguments)
给参数设置默认值,使函数更灵活。
python
def connect(host="localhost", port=3306):
print(f"正在连接服务器:{host}:{port}")
connect() # 使用默认值
connect("192.168.1.1", 8080) # 传入新值
默认参数常用于配置型函数,比如数据库连接、API请求等。
4. 可变参数(*args)
当不确定会传入多少个参数时,可以使用 *args。 它会将所有位置参数打包成一个元组。
python
def add(*nums):
total = sum(nums)
print("总和为:", total)
add(1, 2, 3)
add(5, 10, 15, 20)
输出:
总和为: 6
总和为: 50
5. 关键字可变参数(**kwargs)
当参数是键值对形式时,可以使用 **kwargs,它会将所有关键字参数打包成一个字典。
python
def show_user(**info):
print(info)
show_user(name="小李", age=20, city="广州")
输出:
arduino
{'name': '小李', 'age': 20, 'city': '广州'}
**kwargs常用于可配置型函数,比如日志记录、数据存储、API请求。
6. 参数的组合使用
Python 支持在一个函数中混合使用多种参数类型:
python
def func(a, b=10, *args, **kwargs):
print(a, b, args, kwargs)
func(1, 2, 3, 4, x=5, y=6)
输出:
arduino
1 2 (3, 4) {'x': 5, 'y': 6}
注意:参数定义顺序固定为
位置参数→默认参数→可变参数→关键字可变参数
三、函数的返回值
函数通过 return 语句将结果返回给调用者。 返回值可以是任意类型,也可以是多个值。
1. 单个返回值
python
def square(x):
return x * x
print(square(5)) # 25
2. 多个返回值(返回元组)
python
def calc(a, b):
return a + b, a - b
result = calc(10, 3)
print(result) # (13, 7)
sum_val, diff_val = calc(10, 3)
print(sum_val, diff_val) # 13 7
Python 实际上是将多个值打包成一个元组返回的。
3. 无返回值(隐式返回 None)
python
def greet(name):
print(f"你好,{name}")
result = greet("Tom")
print(result)
输出:
css
你好,Tom
None
当函数没有 return 时,Python 会自动返回 None。
四、return 的执行特点
- 一旦执行
return,函数立即结束; - 函数中可以有多个
return,但只会执行第一个被触发的; - 可以用
return提前结束函数逻辑。
示例:
python
def divide(a, b):
if b == 0:
return "除数不能为0"
return a / b
print(divide(10, 2)) # 5.0
print(divide(10, 0)) # 除数不能为0
五、实战案例:购物结算函数
需求:
- 接收任意数量的商品价格;
- 计算总价;
- 可选打折参数;
- 返回最终金额。
python
def checkout(*prices, discount=1.0):
"""购物结算函数"""
total = sum(prices)
pay = total * discount
return round(pay, 2)
print(checkout(100, 200, 300))
print(checkout(100, 200, 300, discount=0.9))
输出:
600.0
540.0
六、总结
| 参数类型 | 特点 | 示例 |
|---|---|---|
| 位置参数 | 按顺序传值 | func(1, 2) |
| 关键字参数 | 指定参数名 | func(a=1, b=2) |
| 默认参数 | 设置默认值 | def func(a=1) |
| 可变参数 | 接收任意数量的位置参数 | *args |
| 关键字可变参数 | 接收任意数量的键值参数 | **kwargs |
七、小结
- 参数让函数更加灵活,
return让函数能输出结果; *args与**kwargs是 Python 的"可扩展接口";- 返回值可以是任何类型,甚至是函数本身(这将在高阶函数中讲到);
- 写函数时,应保持输入清晰、返回明确、逻辑单一。
结语: 掌握函数的参数与返回值,你就能编写出灵活、可复用的代码模块。