• 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
  • 相关阅读:
    【Visual Leak Detector】QT 中 VLD 输出解析(二)
    java基础巩固6
    【JavaScript 逆向】极验四代无感验证码逆向分析
    CB利用链及无依赖打Shiro
    云原生架构体系
    Matlab简单入门
    2022钉钉杯初赛A题(银行卡电信诈骗危险预测)
    网络编程套接字
    java缓存
    Spring如何扫描Bean的
  • 原文地址:https://blog.csdn.net/qq_38727995/article/details/127416460