• Python中`*args`和`**kwargs`的用法


    欢迎关注公众号【Python开发实战】,免费领取Python、PyCharm安装教程和Python学习电子书!

    Python中*args**kwargs的用法

    首先,不是必须写成*args**kwargs,只有变量前面星号*才是必须的。也可以写成*vars**kwvars,写成*args**kwargs只是一个通俗的命名约定。

    *args**kwargs主要用于函数的定义中,可以将任意数量的参数传递给一个函数。即预先并不知道,函数调用时会传递多少个参数,在这样的场景下就需要使用这两个关键字。最常见的使用场景是编写装饰器时使用。

    *args的用法

    *args:允许将任意数量的位置参数传递给一个函数,在函数内部,args会被转化为元组。

    def test_args(f_arg, *args):
        print('args的数据类型:', type(args))
        print('第一个位置参数:', f_arg)
        for arg in args:
            print('通过*args传递的参数:', arg)
            
    test_args('linux', 'python', 'web', 'sql')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    输出:

    args的数据类型: 
    第一个位置参数: linux
    通过*args传递的参数: python
    通过*args传递的参数: web
    通过*args传递的参数: sql
    
    • 1
    • 2
    • 3
    • 4
    • 5

    **kwargs的用法

    **kwargs:允许将任意数量的关键字参数传递给一个函数,在函数内部,kwargs被转化为字典。

    def test_kwargs(**kwargs):
        print('kwargs的数据类型:', type(kwargs))
        for key, value in kwargs.items():
            print(f'{key} : {value}')    
            
    test_kwargs(age=18)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    输出:

    kwargs的数据类型: 
    age : 18
    
    • 1
    • 2

    如果某个函数需要能够同时接受任意数量的位置参数和关键字参数,可以同时使用*args**kwargs
    但是需要注意的是参数的位置,*args要放在函数定义中最后一个位置参数后面,**kwargs要放在函数定义中所有参数的最后面,在*args后面仍然可以定义其他参数,但在*args后面定义的参数,函数调用时需使用关键字参数传参。

    def any_args1(*args, name, **kwargs):
        print(args)
        print(kwargs)
        print(name)
        
    def any_args2(*args, name='lau', **kwargs):
        print(args)
        print(kwargs)
        print(name)
        
    any_args1('one', 1, name='lau', two=2)
    any_args2('one', 1, two=2)
    any_args2('one', 1, name='katie', two=2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    输出:

    ('one', 1)
    {'two': 2}
    lau
    ('one', 1)
    {'two': 2}
    lau
    ('one', 1)
    {'two': 2}
    katie
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    使用*args**kwargs调用函数

    现在来看一下怎样使用*args**kwargs来调用一个函数。

    def test_args_kwargs(arg1, arg2, arg3):
        print(f'arg1: {arg1}')
        print(f'arg2: {arg2}')
        print(f'arg3: {arg3}')
    
    • 1
    • 2
    • 3
    • 4

    首先,使用*args调用函数test_args_kwargs。

    args = (3, 'one', 9)
    test_args_kwargs(*args)
    
    • 1
    • 2

    输出:

    arg1: 3
    arg2: one
    arg3: 9
    
    • 1
    • 2
    • 3

    再使用**kwargs来调用函数test_args_kwargs。

    kwargs = {'arg2': 'one', 'arg1': 3, 'arg3': 5}
    test_args_kwargs(**kwargs)
    
    • 1
    • 2

    输出:

    arg1: 3
    arg2: one
    arg3: 5
    
    • 1
    • 2
    • 3
  • 相关阅读:
    程序员面试代码
    python sorted 自带函数模块 排序方法使用
    java毕业设计开题报告SSM图书馆预约占座系统
    Java剑指Offer二维数组中的查找
    数字孪生技术在光网络中的应用与问题
    CEAC之《计算机应用助理工程师》3
    sql语句,分组后,组内根据datetime字段排序,保留日期最新的一条组内记录,删除其他项。(用于组内重复数据的剔除)
    【无标题】
    兴达易控DP主站转TCP把ABB流量计接入到施耐德PLC
    C++基础——初始化列表
  • 原文地址:https://blog.csdn.net/qq_38727995/article/details/127416460