Python 函数核心:位置参数与关键字参数详解

前言

在 Python 函数开发中,参数传递 是最基础、最核心的知识点,而位置参数关键字参数是所有 Python 开发者必须熟练掌握的基本功。

很多新手写函数时,经常遇到:参数传错、顺序混乱、代码可读性差、调用报错等问题,本质就是没有彻底理解这两种参数的用法。

本章带你从零吃透位置参数、关键字参数、混合使用、默认参数、强制关键字参数,搭配大量实战代码 + 避坑指南,让你写出规范、健壮、易读的函数。

一、核心概念:什么是位置参数 / 关键字参数

1.1 函数参数基础

我们定义函数时,括号里写的叫形参(形式参数) ; 调用函数时,括号里传的值叫实参(实际参数)

Python 传递实参主要分为两大类:

  1. 位置参数(Positional Arguments) :按顺序匹配,顺序不能乱
  2. 关键字参数(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 核心规则

  1. 顺序必须严格对应,传错顺序结果直接错误
  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 核心优势

  1. 代码可读性极高,一眼看懂每个值的含义
  2. 顺序无关,不会传错顺序
  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 重要规则

  1. 有默认值的参数,必须放在无默认值参数的后面
  2. 默认参数只在函数定义时赋值一次(避坑重点)

六、进阶:强制关键字参数(* 号用法)

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)  # 报错

避坑总结

  1. 简单函数用位置参数,简洁高效
  2. 参数≥3 个时,优先用关键字参数,可读性强
  3. 混合使用:位置在前,关键字在后
  4. 默认参数必须放最后
  5. 强制关键字参数用*分隔,更安全

九、最佳实践(企业开发规范)

  1. 参数数量尽量 ≤ 5 个,过多建议用字典 / 对象封装
  2. 公共函数、工具函数尽量使用关键字参数,方便他人调用
  3. 必传参数用位置参数,可选参数用默认 + 关键字参数
  4. 所有函数必须写文档字符串(注释),标明参数含义

十、本章总结

  1. 位置参数:按顺序传参,简单高效,顺序不能错
  2. 关键字参数:按名字传参,可读性高,顺序无关
  3. 混合规则:位置参数必须在前,关键字在后
  4. 默认参数:简化调用,必须放在无默认值参数后面
  5. 强制关键字参数*后面只能用关键字传参

掌握以上内容,你已经完全精通 Python 函数参数传递,写出的代码会更规范、更专业、更不容易出 Bug!

相关推荐
风落无尘1 小时前
第十一章《对齐与安全》 完整学习资料
python·安全·机器学习
Kratzdisteln1 小时前
【无标题】
前端·python
hakesashou2 小时前
python文件操作需要导入模块吗
python
wuxinyan1232 小时前
工业级大模型学习之路029:解决双智能体调用数据库报错问题
数据库·人工智能·python·学习·智能体
SunnyDays10112 小时前
Python操作Excel批注:从基础添加到高级自定义的完整指南
开发语言·python·excel
独隅2 小时前
PyTorch自动微分模块:从原理到实战一
人工智能·pytorch·python
qq_333120972 小时前
C++高并发内存池的整体设计和实现思路_C 语言
java·c语言·c++
mh_f2 小时前
33.批量通过GET链接下载图片到指定文件夹下
java
金銀銅鐵2 小时前
[Java] 如何理解 class 文件中方法的 access flags?
java·后端