当前位置:首页 > 技术分析 > 正文内容

Python可变参数:*args 和 **kwargs 详解

ruisui8822小时前技术分析1

1. 基本概念

*args(非关键字可变参数)

  • 用于接收任意数量的位置参数(positional arguments)
  • 参数会被打包成一个元组(tuple)
  • args是约定俗成的名称,你可以使用其他名称,但*是必须的

**kwargs(关键字可变参数)

  • 用于接收任意数量的关键字参数(keyword arguments)
  • 参数会被打包成一个字典(dictionary)
  • kwargs是约定俗成的名称,同样可以替换为其他名称,但**是必须的

2. 代码示例

基本使用

def example_function(arg1, *args, **kwargs):
    print(f"固定参数: {arg1}")
    print(f"*args 参数: {args} (类型: {type(args)})")
    print(f"**kwargs 参数: {kwargs} (类型: {type(kwargs)})")

# 调用示例
example_function("固定值", "arg1", "arg2", key1="value1", key2="value2")

输出:

固定参数: 固定值
*args 参数: ('arg1', 'arg2') (类型: <class 'tuple'>)
**kwargs 参数: {'key1': 'value1', 'key2': 'value2'} (类型: <class 'dict'>)

实际应用场景

数学计算函数

def sum_numbers(*args):
    return sum(args)

print(sum_numbers(1, 2, 3))  # 输出: 6
print(sum_numbers(4, 5, 6, 7, 8))  # 输出: 30

配置函数

def configure(**kwargs):
    config = {
        'color': 'red',
        'size': 'medium',
        'font': 'Arial'
    }
    config.update(kwargs)  # 用传入的参数更新默认配置
    return config

print(configure(color='blue', font='Times New Roman'))
# 输出: {'color': 'blue', 'size': 'medium', 'font': 'Times New Roman'}

3. 组合使用规则

  1. 参数顺序必须遵循:普通参数 → *args → **kwargs
def func(a, b, *args, **kwargs):
    pass

在*args和**kwargs之间可以有普通参数,但必须显式指定参数名

def func(a, *args, b, **kwargs):
    pass
# 调用时: func(1, 2, 3, b=4, c=5, d=6)

4. 解包参数

*和**也可以用于解包参数:

def func(a, b, c):
    print(a, b, c)

args = (1, 2, 3)
func(*args)  # 等同于 func(1, 2, 3)

kwargs = {'a': 1, 'b': 2, 'c': 3}
func(**kwargs)  # 等同于 func(a=1, b=2, c=3)

5. 实际应用案例

案例1:装饰器

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("函数执行前")
        result = func(*args, **kwargs)
        print("函数执行后")
        return result
    return wrapper

@my_decorator
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")

案例2:继承中的方法重写

class Parent:
    def do_something(self, *args, **kwargs):
        print("Parent doing something")

class Child(Parent):
    def do_something(self, *args, **kwargs):
        print("Child doing something")
        super().do_something(*args, **kwargs)  # 调用父类方法

6. 注意事项

  1. *args和**kwargs不是Python语法的一部分,只是约定俗成的命名
  2. 当不需要接收可变参数时,不要使用它们
  3. 在函数内部,args是一个元组,kwargs是一个字典
  4. 使用可变参数可能会降低代码的可读性,应适度使用

7. 最佳实践

  • 使用有意义的名称(如*filenames代替*args当处理文件名时)
  • 在文档字符串中说明参数的含义
  • 避免过度使用,只在真正需要处理可变数量参数时使用

希望这个详细的讲解能帮助你理解*args和**kwargs!如果有任何疑问,欢迎继续提问。

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/4696.html

标签: kwargs.get
分享给朋友:

“Python可变参数:*args 和 **kwargs 详解” 的相关文章

一次Java内存占用高的排查案例,解释了我对内存问题的所有疑问

问题现象7月25号,我们一服务的内存占用较高,约13G,容器总内存16G,占用约85%,触发了内存报警(阈值85%),而我们是按容器内存60%(9.6G)的比例配置的JVM堆内存。看了下其它服务,同样的堆内存配置,它们内存占用约70%~79%,此服务比其它服务内存占用稍大。那为什么此服务内存占用稍大...

Acustica Audio 发布模拟Roland Jupiter 双声道合成器插件 TH2

福利: Acustica Audio 发布模拟Roland Jupiter 风格的双声道合成器插件 TH2 免费下载 意大利 Acustica Audio 公司发布布模拟Roland Jupiter 风格的双声道合成器插件 TH2 ,灵感来源于Acustica Audio的THING-8系列,它是...

Vue进阶(幺叁捌):vue路由传参的几种基本方式

1、动态路由(页面刷新数据不丢失)methods:{ insurance(id) { //直接调用$router.push 实现携带参数的跳转 this.$router.push({ path: `/particulars/${id}`,...

Vue实战篇|使用路由管理用户权限(动态路由)

权限控制是后台管理系统比较常见的需求,如果我们需要对某些页面的添加权限控制的话,那我们可以在路由管理中的权限做一些校验,没有通过权限校验的给出相应的提示或者直接跳转到报错页面。跟着我一起来学vue实战篇路由管理权限吧!权限校验函数getCurrentAuthority()函数用于获取当前用户权限,一...

史上最全 vue-router 讲解 !!!

前端路由 前端路由是后来发展到SPA(单页应用)时才出现的概念。 SPA 就是一个WEB项目只有一个 HTML 页面,一旦页面加载完成,SPA 不会因为用户的操作而进行页面的重新加载或跳转。 前端路由在SPA项目中是必不可少的,页面的跳转、刷新都与路由有关,通过不同的url显示相应的页面。 优点:前...

Ruoyi-vue第五十二章:Uniapp小程序配置tabbar底部导航栏

一、功能实现效果如下图底部的tabbar二、uniapp的tabBar如果应用是一个多 tab 应用,可以通过 tabBar 配置项指定一级导航栏,以及 tab 切换时显示的对应页。在 pages.json 中提供 tabBar 配置,不仅仅是为了方便快速开发导航,更重要的是在App和小程序端提升性...