Python 函数参数深度解析教程

server/2025/4/2 5:46:06/

目录

    • 一、参数基础类型
      • 1. 位置参数(Positional Arguments)
      • 2. 默认参数(Default Arguments)
      • 3. 可变参数
        • 3.1 可变位置参数(`*args`)
        • 3.2 可变关键字参数(**kwargs)
    • 二、高级参数组合
      • 1. 命名关键字参数(Keyword-only Arguments)
      • 2. 参数组合顺序规则
    • 三、参数传递机制
    • 四、常见问题与陷阱
    • 五、最佳实践建议


一、参数基础类型

1. 位置参数(Positional Arguments)

  • 定义函数定义时按顺序声明的参数,调用时必须按相同顺序传递值
  • 特点
    • 参数顺序决定传值逻辑
    • 调用时缺少参数会触发TypeError
  • 注意:多参数场景下需严格保持顺序,否则可能引发逻辑错误

2. 默认参数(Default Arguments)

  • 定义:在参数声明时赋予默认值,调用时可省略传参
  • 特性
    • 必须声明在位置参数之后
    • 默认值在函数定义时初始化,应避免使用可变对象(如列表)
  • 典型用法def func(a, b=5):

3. 可变参数

3.1 可变位置参数*args
  • 功能:接收任意数量位置参数,打包为元组
  • 调用方式
python"> def sum_all(*nums): return sum(nums)sum_all(1,2,3)  # 输出6
  • 可通过list解包列表/元组传递参数
3.2 可变关键字参数(**kwargs)
  • 功能:接收任意数量键值对,打包为字典
  • ​调用方式
python">def print_info(**data):for k,v in data.items(): print(f"{k}:{v}")
print_info(name="Alice", age=25)
  • 可通过**dict解包字典传递参数

二、高级参数组合

1. 命名关键字参数(Keyword-only Arguments)

  • 定义:通过*分隔符强制要求以键值对形式传参
  • 语法
python">def register(name, *, email, phone):pass
# 必须指定参数
register("Bob", email="bob@test.com", phone=123456)

2. 参数组合顺序规则

  1. 位置参数 → 默认参数 → 可变位置参数(*args) → 命名关键字参数 → 可变关键字参数(**kwargs)
  2. 错误示例:def func(a=1, b)会导致语法错误(默认参数在位置参数前)

三、参数传递机制

1. 参数解包技巧

  • ​列表/元组解包:使用*传递到*args
python">def sum_all(*args):print(sum(args))nums = [2,3,4]
sum_all(*nums)  # 等价于sum_all(2,3,4)
  • 字典解包:使用**传递到**kwargs
python">class People:def __init__(self, name, age, **kwargs):self.name = nameself.age = ageself.info = kwargsdef __str__(self):return f'Name: {self.name}, Age: {self.age}, Other Message: {self.info}'data = {'city':'GuangZhou', 'job':'Engineer'}
yant = People('Yant', 24, **data)
print(yant) ## Name: Yant, Age: 24, Other Message: {'city': 'GuangZhou', 'job': 'Engineer'}

2. 参数作用域

  • 函数内部修改不可变类型参数(如整数、字符串)不会影响外部变量
  • 修改可变类型参数(如列表)会影响原始对象

四、常见问题与陷阱

1. 默认参数陷阱

  • ​问题:默认值在函数定义时创建,多次调用共享同一对象,这个问题需要留意,新手开发者出现的概率非常高
python">def append_to(element, target=[]):target.append(element)return target
# 连续调用会在原列表累积元素,不会创建新的列表
print(append_to(1))  # [1]
print(append_to(2))  # [1, 2]
  • 解决方案:使用None占位并重新初始化
python">def append_to(element, target=None):target = target or []target.append(element)return target

2. 参数顺序错误

  • ​典型错误def func(a=1, b)导致语法错误,这个错误pycharm会提示
  • 修正:必选参数需在默认参数前声明def func(b, a=1)

3. 命名冲突

  • ​现象**kwargs中的键名与函数参数名重复时引发逻辑错误
  • ​规避:确保键名不与已有参数名冲突
python">def insert_dict(name, age, **kwargs):person = {'name': name,'age': age,**kwargs}return personresult = insert_dict('Yant', 28, name='Yant', City='Guangzhou')
print(result)
Traceback (most recent call last):File "E:\PythonProject\pythonStudy\drfStudy\.debug\main.py", line 10, in <module>result = insert_dict('Yant', 28, name='Yant', City='Guangzhou')
TypeError: insert_dict() got multiple values for argument 'name'

五、最佳实践建议

  1. 参数设计原则
  • 优先使用位置参数保证基础功能
  • 默认参数简化高频使用场景
  • *args/**kwargs增强灵活性
  1. ​可读性优化
  • 关键字参数明确传参意图(如connect(timeout=10)
  • 复杂参数组合添加类型注解
  1. ​调试技巧

本文综合了Python参数系统的核心机制与实战经验,完整参数规范请参考
Python官方标准库文档


http://www.ppmy.cn/server/179821.html

相关文章

【Linux探索学习】第二十九弹——线程概念:Linux线程的基本概念与线程控制详解

Linux学习笔记&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 在现代操作系统中&#xff0c;线程是程序执行流的最小单元。与进程相比&#xff0c;线程更加轻量级&#xff0c;创建和销毁的开销更小&…

三维动态规划-LeetCode3418. 机器人可以获得的最大金币数

太爽了&#xff01;做完这道题&#xff0c;让我感觉就像是斩杀了一条大龙&#xff01;历时72天&#xff0c;分3次花掉30小时。终获突破&#xff01; 零、题目 3418. 机器人可以获得的最大金币数 给你一个 m x n 的网格。一个机器人从网格的左上角 (0, 0) 出发&#xff0c;目…

Day16 -实例:Web利用邮箱被动绕过CDN拿真实ip

本想测试一下全局ping&#xff0c;刚好注册的时候收到了邮件&#xff0c;刚好去做一下复现。 原理&#xff1a;主动让对方站点给我们发邮件&#xff08;注册、修改密码、订阅推送等&#xff09;我们查看邮件原文&#xff0c;原文里存在真实的邮件站点ip 特点&#xff1a;邮件…

[python]基于yolov10实现热力图可视化支持图像视频和摄像头检测

YOLOv10 Grad-CAM 可视化工具 本工具基于YOLOv10模型&#xff0c;结合Grad-CAM技术实现目标检测的可视化分析&#xff0c;支持图像、视频和实时摄像头处理。 功能特性 支持多种Grad-CAM方法实时摄像头处理视频文件处理图像文件处理 环境要求 Python 3.8需要电脑带有nvidia…

复杂的数据类型

简单的数据类型如&#xff1a;float、int、double、char复杂的数据类型如&#xff1a;数组、指针、结构 一、数组 &#xff08;1&#xff09;数组把多个同一类型的值存储在同一个变量名下。 &#xff08;2&#xff09;定义数组&#xff1a;类型 数组名[数组长度] 如&…

科软25机试

题目: 2025科软复试上机题&#xff08;回忆版&#xff09;题解_哔哩哔哩_bilibili 1. 字符串反转 #include<bits/stdc.h> using namespace std;void solve(string& a, int CurN) {if (!(CurN % 2)) {int right a.size() - 1;int left 0;while (left < right)…

EF Core 执行原生SQL语句

文章目录 前言一、执行查询&#xff08;返回数据&#xff09;1&#xff09; 使用 FromSqlRaw或 FromSqlInterpolated 方法&#xff0c;适用于 DbSet<T>&#xff0c;返回实体集合。2&#xff09;结合 LINQ 查询3&#xff09;执行任意原生SQL查询语句&#xff08;使用ADO.N…

Eclipse IDE for ModusToolbox™ 3.4环境通过JLINK调试CYT4BB

使用JLINK在Eclipse IDE for ModusToolbox™ 3.4环境下调试CYT4BB&#xff0c;配置是难点。总结一下在IDE中配置JLINK调试中遇到的坑&#xff0c;以及如何一步一步解决遇到的问题。 1. JFLASH能够正常下载程序 首先要保证通过JFLASH(我使用的J-Flash V7.88c版本)能够通过JLIN…