前言
在 Python 函数开发中,参数传递 是最基础、最核心的知识点,而位置参数 和关键字参数是所有 Python 开发者必须熟练掌握的基本功。
很多新手写函数时,经常遇到:参数传错、顺序混乱、代码可读性差、调用报错等问题,本质就是没有彻底理解这两种参数的用法。
本章带你从零吃透位置参数、关键字参数、混合使用、默认参数、强制关键字参数,搭配大量实战代码 + 避坑指南,让你写出规范、健壮、易读的函数。
一、核心概念:什么是位置参数 / 关键字参数
1.1 函数参数基础
我们定义函数时,括号里写的叫形参(形式参数) ; 调用函数时,括号里传的值叫实参(实际参数)。
Python 传递实参主要分为两大类:
- 位置参数(Positional Arguments) :按顺序匹配,顺序不能乱
- 关键字参数(Keyword Arguments) :按
参数名=值匹配,顺序无关
1.2 一句话区分
- 位置参数 :靠顺序说话
- 关键字参数 :靠名字说话
二、位置参数(最基础、最常用)
2.1 定义
调用函数时,按照形参定义的顺序依次传入实参,Python 会按位置一一对应。
2.2 基础示例
python
# 定义函数:计算两数之和
def add(x, y):
return x + y
# 位置参数调用:严格按 x、y 顺序传参
result = add(10, 20)
print(result) # 输出 30
2.3 核心规则
- 顺序必须严格对应,传错顺序结果直接错误
- 数量必须匹配,不能多传、不能少传
- 最简单、执行效率最高
2.4 错误示例(必看)
python
def info(name, age):
print(f"姓名:{name},年龄:{age}")
# 错误:顺序传反
info(20, "张三")
# 输出:姓名:20,年龄:张三(逻辑错误)
# 错误:参数数量不匹配
info("张三")
# 报错:info() missing 1 required positional argument: 'age'
三、关键字参数(高可读性、高容错)
3.1 定义
调用函数时,使用参数名=值的形式传参,明确指定给哪个形参赋值,顺序可以任意调换。
3.2 基础示例
python
def info(name, age):
print(f"姓名:{name},年龄:{age}")
# 关键字参数调用:指定名字传参
info(name="张三", age=20)
info(age=20, name="张三") # 顺序调换,结果完全一样
3.3 核心优势
- 代码可读性极高,一眼看懂每个值的含义
- 顺序无关,不会传错顺序
- 适合参数多的函数
四、混合使用:位置参数 + 关键字参数(实战最常用)
4.1 黄金规则(死记硬背)
位置参数必须写在前面,关键字参数必须写在后面!
错误写法直接报错!
4.2 正确示例
python
def student(name, age, grade, school):
print(f"{name} {age}岁,班级:{grade},学校:{school}")
# 正确:位置参数在前,关键字参数在后
student("张三", 15, grade="高一", school="第一中学")
4.3 错误示例
python
# 错误:关键字参数写在了位置参数前面
student(name="张三", 15, "高一", "第一中学")
# 报错:SyntaxError: positional argument follows keyword argument
五、默认参数(带默认值的参数)
5.1 定义
定义函数时,给参数设置默认值,调用时不传该参数,自动使用默认值。
5.2 示例
python
# school 设置默认值
def student(name, age, school="Python中学"):
print(f"{name} {age}岁,学校:{school}")
# 不传 school,使用默认值
student("张三", 16)
# 传参则覆盖默认值
student("李四", 17, "第一中学")
5.3 重要规则
- 有默认值的参数,必须放在无默认值参数的后面
- 默认参数只在函数定义时赋值一次(避坑重点)
六、进阶:强制关键字参数(* 号用法)
6.1 作用
强制要求调用者必须使用关键字参数传参,提高代码安全性。
6.2 语法
*后面的所有参数,只能用关键字传参。
python
def person(name, age, *, gender, city):
print(name, age, gender, city)
# 正确:gender、city 必须用关键字传参
person("张三", 20, gender="男", city="北京")
# 错误:不能用位置参数传 gender、city
person("张三", 20, "男", "北京")
# 报错:TypeError
七、完整实战综合案例
我们写一个规范的多功能函数,包含位置、关键字、默认、强制关键字四种用法,模拟真实开发场景。
python
# 综合函数:用户信息注册
def user_info(username, password, *, nickname="用户", age=None):
"""
用户注册函数
:param username: 用户名(位置参数,必填)
:param password: 密码(位置参数,必填)
:param nickname: 昵称(强制关键字,有默认值)
:param age: 年龄(强制关键字,可选)
"""
print("===== 注册信息 =====")
print(f"账号:{username}")
print(f"密码:{password}")
print(f"昵称:{nickname}")
if age:
print(f"年龄:{age}")
# 标准调用
user_info("zhangsan", "123456", nickname="张三", age=20)
# 简化调用
user_info("lisi", "654321")
八、高频报错与避坑指南
报错 1:位置参数跟在关键字参数后面
原因 :混合传参时顺序错误 解决:永远把位置参数写前面
报错 2:缺少必填参数
原因 :漏传了无默认值的形参 解决:检查函数定义,补齐所有必填参数
报错 3:参数重复赋值
原因:同一个参数既用位置传,又用关键字传
def add(x, y): pass
add(10, x=20) # 报错
避坑总结
- 简单函数用位置参数,简洁高效
- 参数≥3 个时,优先用关键字参数,可读性强
- 混合使用:位置在前,关键字在后
- 默认参数必须放最后
- 强制关键字参数用
*分隔,更安全
九、最佳实践(企业开发规范)
- 参数数量尽量 ≤ 5 个,过多建议用字典 / 对象封装
- 公共函数、工具函数尽量使用关键字参数,方便他人调用
- 必传参数用位置参数,可选参数用默认 + 关键字参数
- 所有函数必须写文档字符串(注释),标明参数含义
十、本章总结
- 位置参数:按顺序传参,简单高效,顺序不能错
- 关键字参数:按名字传参,可读性高,顺序无关
- 混合规则:位置参数必须在前,关键字在后
- 默认参数:简化调用,必须放在无默认值参数后面
- 强制关键字参数 :
*后面只能用关键字传参
掌握以上内容,你已经完全精通 Python 函数参数传递,写出的代码会更规范、更专业、更不容易出 Bug!