在编程的世界里,函数(function)就像是一个精密加工的工厂:你投入原材料(输入),经过内部的机器运转(处理),最后产出成品(输出)。
而在 python 中,参数(arguments/parameters) 就是这些原材料。掌握了参数的使用,你就掌握了控制函数行为的钥匙,能够编写出更灵活、更强大且易于维护的代码。
本文将带你系统地拆解 python 函数参数的奥秘,从最基础的用法到进阶技巧,助你彻底攻克这一知识点。
1. 前置知识 (prerequisites)
在开始之前,请确保你已经具备以下基础:
- 已安装 python 环境(推荐 python 3.6+)。
- 了解如何定义一个最简单的函数(使用
def关键字)。 - 理解变量的基本赋值概念。
2. 核心概念:形参与实参
在深入具体用法前,我们需要厘清两个经常混用的术语:
- 形参 (parameters):在定义函数时括号内的变量名。它们是占位符。
- 实参 (arguments):在调用函数时实际传入的值。它们是真实的数据。
def greet(name): # name 是形参
print(f"hello, {name}!")
greet("alice") # "alice" 是实参
3. python 参数详解 (step-by-step guide)
python 提供了多种传递参数的方式,使得函数调用极其灵活。我们将由浅入深一一讲解。
3.1 位置参数 (positional arguments)
这是最常见、最基础的参数形式。python 按照参数在括号中出现的顺序,将实参一一对应赋值给形参。
规则:数量必须一致,顺序必须正确。
def describe_pet(animal_type, pet_name):
"""显示宠物的信息"""
print(f"我有一只{animal_type}。")
print(f"它的名字叫{pet_name}。")
# 正确调用:顺序对应
describe_pet('仓鼠', '哈利')
# 输出:
# 我有一只仓鼠。
# 它的名字叫哈利。
# 错误调用:顺序颠倒会导致逻辑错误
describe_pet('哈利', '仓鼠')
# 输出: 我有一只哈利... (逻辑不通)
3.2 关键字参数 (keyword arguments)
为了避免记不住参数顺序带来的麻烦,我们可以使用“键=值”的格式直接指定参数。
规则:一旦指定了参数名,顺序就不重要了。
# 使用关键字参数调用,顺序可以打乱 describe_pet(pet_name='哈利', animal_type='仓鼠')
3.3 默认参数 (default arguments)
有些参数在大部分情况下都是同一个值。我们可以为这些参数设定一个默认值。如果调用时没有传入该参数,python 就会使用默认值。
规则:必选参数(无默认值)必须放在默认参数之前。
def connect_database(host, port=3306):
"""模拟数据库连接"""
print(f"正在连接到 {host}:{port} ...")
# 情况1:只传必选参数,使用默认端口
connect_database("192.168.1.1")
# 输出: 正在连接到 192.168.1.1:3306 ...
# 情况2:传入新值,覆盖默认端口
connect_database("192.168.1.1", 5432)
# 输出: 正在连接到 192.168.1.1:5432 ...
3.4 可变参数 (variable-length arguments)
有时候,我们无法预知用户会传入多少个参数(例如:计算任意个数字的和)。python 提供了两种强大的机制。
*args:接收任意数量的位置参数
python 会将多余的位置参数打包成一个 元组 (tuple)。通常命名为 args,但前面的星号 * 才是关键。
def make_pizza(size, *toppings):
"""概述要制作的比萨"""
print(f"\n准备制作一个 {size} 寸的比萨,配料如下:")
for topping in toppings:
print(f"- {topping}")
# 可以传入任意数量的配料
make_pizza(12, '蘑菇', '青椒', '双倍芝士')
**kwargs:接收任意数量的关键字参数
python 会将多余的关键字参数打包成一个 字典 (dictionary)。通常命名为 kwargs,前面的双星号 ** 是关键。
def build_profile(first, last, **user_info):
"""创建一个字典,其中包含我们知道的有关用户的一切"""
user_info['first_name'] = first
user_info['last_name'] = last
return user_info
user_profile = build_profile('albert', 'einstein',
location='princeton',
field='physics')
print(user_profile)
# 输出: {'location': 'princeton', 'field': 'physics', 'first_name': 'albert', 'last_name': 'einstein'}
4. 常见陷阱与最佳实践 (common pitfalls)
即使是经验丰富的开发者,有时也会在参数问题上栽跟头。以下是新手必须注意的“雷区”。
陷阱 1:使用可变对象作为默认参数 (最经典的坑)
永远不要使用列表、字典等可变对象作为默认参数值。
错误示范:
def add_item(item, list_param=[]):
list_param.append(item)
return list_param
print(add_item('a')) # 期望: ['a'] -> 实际: ['a']
print(add_item('b')) # 期望: ['b'] -> 实际: ['a', 'b'] <-- 竟然保留了上次的结果!
原因:python 函数的默认参数在函数定义时只计算一次,而不是每次调用时重新计算。所有调用都共享同一个列表对象。
正确做法: 使用 none 作为默认值,在函数内部进行判断。
def add_item(item, list_param=none):
if list_param is none:
list_param = []
list_param.append(item)
return list_param
陷阱 2:参数定义的顺序
如果你在一个函数中混合使用了以上所有类型的参数,必须严格遵守以下顺序,否则会报错:
- 位置参数 (常规参数)
- 默认参数
*args(可变位置参数)**kwargs(可变关键字参数)
注:在 python 3 中,*args 和默认参数的位置有时可以互换(形成命名关键字参数),但对于初学者,建议死记上述顺序以避免混淆。
5. 总结与资源 (conclusion & resources)
核心知识点回顾
- 位置参数:按顺序入座,最死板但最常用。
- 关键字参数:指名道姓,清晰易读。
- 默认参数:提供备选方案,简化调用。
*args:打包多余的位置参数为元组。**kwargs:打包多余的关键字参数为字典。- 切记:默认参数不要用空列表
[]!
下一步做什么?
掌握了函数的参数,你就具备了编写通用代码库的能力。建议尝试编写一个简单的命令行工具(cli),利用 *args 和 **kwargs 来处理用户输入的各种复杂指令。
到此这篇关于从入门到精通详解python函数参数全攻略的文章就介绍到这了,更多相关python函数参数内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论