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!

相关推荐
aqi0017 分钟前
15天学会AI应用开发(八)使用向量数据库实现RAG功能
人工智能·python·大模型·ai编程·ai应用
Csvn1 小时前
`functools.lru_cache` —— 一行代码搞定缓存加速
后端·python
Csvn2 小时前
Monorepo 迁移血泪史:从 Multi-Repo 到 Turborepo,这 3 个坑我帮你踩完了
前端
星栈2 小时前
Dioxus 多页面怎么做:`dioxus-router`、嵌套路由、`Outlet` 和页面组织,一篇给你讲顺
前端·rust·前端框架
用户987409238872 小时前
用 Remotion + edge-tts 打造中文教学视频全自动流水线
前端
风骏时光牛马2 小时前
Less前端工程化实战:变量混合器与项目样式分层落地
前端
假如让我当三天老蒯2 小时前
Options API(选项式 API) 和 Composition API(组合式 API)
前端·vue.js·面试
SameX2 小时前
iOS 独立开发实践:用 MapKit + 像素渲染实现 Citywalk 轨迹地图 App「雁过留痕」
前端
skyey2 小时前
页面加载时,深色模式闪白的问题解决
前端