Python中位置参数和关键字参数
·
位置参数 vs 关键字参数
一、简单定义
| 参数类型 | 定义 | 特点 |
|---|---|---|
| 位置参数 | 按照参数定义的位置顺序传递的参数 | 顺序必须一致 |
| 关键字参数 | 使用 参数名=值 的形式指定的参数 | 顺序可以任意 |
二、直观示例
def introduce(name, age, city):
print(f"我是{name},今年{age}岁,来自{city}")
# 1. 位置参数调用(按顺序)
introduce("张三", 25, "北京")
# 输出:我是张三,今年25岁,来自北京
# 2. 关键字参数调用(指定参数名)
introduce(age=25, city="北京", name="张三")
# 输出:我是张三,今年25岁,来自北京(顺序可以乱)
# 3. 混合使用
introduce("张三", city="北京", age=25)
# 输出:我是张三,今年25岁,来自北京
三、详细对比
def order_drink(drink, size, ice, sugar):
print(f"订单:{size}杯 {ice} {sugar}糖 {drink}")
# 🔸 位置参数方式(必须按顺序)
order_drink("奶茶", "大杯", "少冰", "半糖")
# 必须记住顺序:饮料→大小→冰量→糖量
# 🔹 关键字参数方式(顺序随意)
order_drink(
sugar="半糖",
drink="奶茶",
ice="少冰",
size="大杯"
)
# 更清晰,不需要记顺序
# ⚠️ 规则:位置参数必须在关键字参数之前
order_drink("奶茶", size="大杯", ice="少冰", sugar="半糖") # ✅ 正确
order_drink(drink="奶茶", "大杯", ice="少冰", sugar="半糖") # ❌ 错误!
四、在函数定义中的区别
def example(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2):
"""
pos1, pos2: 仅位置参数(只能用位置传递)
pos_or_kwd: 位置或关键字都可以
kwd1, kwd2: 仅关键字参数(只能用关键字传递)
"""
print(pos1, pos2, pos_or_kwd, kwd1, kwd2)
# 使用示例
example(1, 2, 3, kwd1=4, kwd2=5) # ✅ 正确
example(1, 2, pos_or_kwd=3, kwd1=4, kwd2=5) # ✅ 正确
# example(pos1=1, pos2=2, 3, kwd1=4, kwd2=5) # ❌ pos1不能用关键字
# example(1, 2, 3, 4, 5) # ❌ kwd1必须用关键字
五、实际应用场景
# 1. 必填参数用位置参数(简洁)
def create_user(name, age, email):
"""创建用户 - name/age/email都是必填"""
pass
create_user("张三", 25, "zhang@email.com") # 简洁明了
# 2. 可选参数用关键字参数(清晰)
def search_users(name=None, age=None, city=None, limit=10):
"""搜索用户 - 所有参数都可选"""
pass
# 调用时只指定需要的条件
search_users(city="北京", limit=20) # 清晰:只搜索北京的,取20条
search_users(age=25, name="李") # 清晰:搜索25岁且姓李的
# 3. 混合使用(最佳实践)
def send_message(content, *, urgent=False, retry=3, timeout=5):
"""发送消息 - content必填,其他可选"""
print(f"发送:{content},紧急:{urgent},重试:{retry}")
send_message("你好") # ✅ 只传必填
send_message("紧急通知", urgent=True) # ✅ 指定紧急
send_message("重要消息", retry=5, timeout=10) # ✅ 指定其他选项
六、记忆口诀
| 参数类型 | 调用方式 | 记忆方法 |
|---|---|---|
| 位置参数 | func(1, 2, 3) | 按位置对号入座 |
| 关键字参数 | func(a=1, b=2) | 按关键字(名字)找人 |
七、为什么需要区分?
# 1. 提高代码可读性
def plot(x, y, color='red', linewidth=1, linestyle='-'):
pass
# 一眼就能看出每个参数的含义
plot([1,2,3], [4,5,6], color='blue', linewidth=2)
# 2. 提供默认值
def connect(host, port=3306, timeout=30):
pass
connect("localhost") # 使用默认port和timeout
connect("server.com", 5432) # 只改port
connect("server.com", timeout=60) # 只改timeout
# 3. 强制清晰性(*后面的参数必须用关键字)
def register(name, age, *, email, phone):
pass
register("张三", 25, email="zhang@email.com", phone="123456") # ✅ 清晰
# register("张三", 25, "zhang@email.com", "123456") # ❌ 错误,必须用关键字
简单总结:
-
位置参数:按顺序给值,像排队(简单快速)
-
关键字参数:指名道姓给值,像点名(清晰灵活)
更多推荐

所有评论(0)