zoukankan      html  css  js  c++  java
  • python 中的 *args 和 **kwargs

    在阅读Python代码时,经常会看到如下函数的定义:

    def fun(*args, **kwargs):

    很多同学可能会对此感到困惑,这个 * args和 **kwargs是什么东西、为啥会在源码中应用的这么管阿帆呢?

    这就要从函数的参数说起了,函数在传参时通常分为四种情况:

      1、普通参数:即在调用函数时必须按照准确的顺序来进行传递。

      2、默认参数:即参数含有默认值、在调用函数时可以进行参数传递、若没有进行参数传递则使用默认值,要注意,默认参数必须在普通函数的右侧,(否则解释器无法解析)。

      3、元组参数:即*args,参数格式存储在一个元组中,长度没有限制,必须位与普通函数和默认参数之后。

      4、字典参数:**kwargs,参数格式化存储在一个字典中,必须位与参数列表的最后面

    普通参数实例如下,在调用函数的时候必须传入参数,否则会抛出TypeError异常:

    def fun(name);
        print "Hello:", name
    
    fun('Python')

    默认参数必须跟在普通参数之后,不能在普通参数之前,默认参数可以穿值,也可以不传,不传值时就采用默认参数;

    def fun(base, rate=0.1):
        return base + base*rate
    
    fun(100)
    
    fun(100, 0.2)

    元组参数需要跟在普通参数默认参数的后面,其最大的特点就是不限制长度:

    def fun(arg1, arg2='Default', *args):
        print('arg1:', arg)
        print('arg2:', arg2)
        for eacharg in args:
            print('tuple:', eacharg)


    fun('Python')
    fun('Python', 'Excellent')
    fun('Python', 'Excellent', 'I', 'love', '100', 'Years')

    最后一次调用的结果为:

    arg1: Python

    arg2: Excellent

    tuple arg: I

    tuple arg: Love

    tuple arg: Python

    tuple arg: 100

    tuple arg: Years

    由此可见,元组的长度是不可受限制的

    字典参数必须跟在其它参数后面,并且长度也是不手限制的;

    def fun(arg1, arg2 = 'Default', *args, **kwargs):
        print('arg1:', arg1)
        print('arg2:', arg2)
        
        for eacharg in args:
            print('tuple arg:', eacharg)
    
        for eachkwarg in kwargs.keys():
            print('dict arg', eacharg, ':', kwarg[eachkwarg])
    
    
    
    fun('Python', 'Excellent', 'I', 'Love', 'You', language = 'Python', number = 100, time = 'Years')

    运行的输出结果为:

    arg1: Python

    arg2: Excellent

    tuple arg: I

    tuple arg: Love

    dict arg number : 100

    dict arg language : Python

    dict arg time : Years

    当我们将普通参数和默认参数放到元组或者字典参数中时,函数的定义就变为仅仅剩余元组和字典参数了:

    def fun(*args, **kwargs):
         
        for eacharg in arg:
            
            print('tuple arg:', eacharg)
    
    
        for eachkwarg in kwargs.keys():
            
            print('dict arg:', eachkwarg, ":", kwargs[eachkwarg])
    
    
    fun('Python', 'Excellent', 'I', 'Love', '100', 'You',language = 'Python', number = 100, time = 'Years')

    这也是很多源码中对函数的定义。运行结果输出为:

    tuple arg: Python

    tuple arg: Excellent

    tuple arg: I

    tuple arg: Love

    dict arg number : 100

    dict arg language : Python

    dict arg time : Years

    所有的参数均可以正确获取

    运行的输出结果为:

    arg1: Python

    arg2: Excellent

    tuple arg: I

    tuple arg: Love

    dict arg number : 100

    dict arg language : Python

    dict arg time : Years

  • 相关阅读:
    做过的项目介绍
    我在爱板网写的-- 【望月追忆】带你入门STM32F0系列文章
    注释:佛祖保佑--永无BUG
    【项目】----C/C++语法知识:typedef struct 用法详解
    【神舟王】----PCB 数字地 和 模拟地 处理方法
    NSDateFormatter的常用格式和格式化参数
    IOS常用开发第三方库整理
    iOS上如何让按钮文本左对齐问题(对齐方式)
    Swift学习5---协议(protocol)和扩展(extension)
    Swift学习4---枚举和结构体
  • 原文地址:https://www.cnblogs.com/jcjc/p/10845119.html
Copyright © 2011-2022 走看看