• python动态参数


    Python的动态参数有两种,分别是*args**kwargs,这里面的关键是一个和两个星号的区别,而不是args和kwargs在名字上的区别,实际上你可以使用*any**whatever的方式。但就如self一样,默认大家都使用*args**kwargs

    注意:动态参数,必须放在所有的位置参数和默认参数后面!

    def func(name, age, sex='male', *args, **kwargs): # 位置参数 默认参数 动态参数
        pass
    

    *args

    一个星号表示接收任意个参数。调用时,会将实际参数打包成一个元组传入形式参数。如果参数是个列表,会将整个列表当做一个参数传入。例如:

    def func(*args):
        for arg in args:
            print(arg)
    
    func('a', 'b', 'c')
    
    li = [1, 2, 3]
    func(li)
    

    运行结果是:

    a
    b
    c
    [1, 2, 3]
    
    • 重要知识点 *
      通过循环args,我们可以获得传递的每个参数。但是li这个列表,我们本意是让它内部的1,2,3分别当做参数传递进去,但实际情况是列表本身被当做一个整体给传递进去了。怎么办呢?使用一个星号!调用函数,传递实参时,在列表前面添加一个星号就可以达到目的了。实际情况是,不光列表,任何序列类型数据对象,比如字符串、元组都可以通过这种方式将内部元素逐一作为参数,传递给函数。而字典,则会将所有的key逐一传递进去。
    def func(*args):
        for arg in args:
            print(arg)
    
    li = [1, 2, 3]
    func(*li)
    

    **kwargs

    def func(**kwargs):
        for kwg in kwargs:
            print(kwg, kwargs[kwg])
    
    dic = {
        'k1': 'v1',
        'k2': 'v2'
    }
    
    func(**dic)
    

    两个星号能将字典内部的键值对逐一传入**kwargs

    “万能”参数

    *args**kwargs组合起来使用,理论上能接受任何形式和任意数量的参数,需要注意的是,*args必须出现在**kwargs之前。

    def func(a, b, c=1, *args, **kwargs):
        print('c的值是:', c)
        for arg in args:
            print(arg)
    
        for kwg in kwargs:
            print(kwg, kwargs[kwg])
    
    
    lis = ['aaa', 'bbb', 'ccc']
    dic = {
        'k1': 'v1',
        'k2': 'v2'
    }
    
    func(1, 2, *lis, **dic)
    

    打印结果为:

    c的值是: aaa
    bbb
    ccc
    k1 v1
    k2 v2
    

    原来,lis的第一个元素被传递给参数c了!这就是Python的参数传递规则之一。

    关键字参数

    关键字参数前面需要一个特殊分隔符*和位置参数及默认参数分隔开来,*后面的参数被视为关键字参数。在函数调用时,关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错。不同于默认参数,关键字参数必须传递,但是关键字参数也可以有缺省值,这时就可以不传递了,从而简化调用。

    def student(name, age, *, sex):
        print(name,age,sex)
    
    student(name="jack", age=18, sex='male')
    

    如果函数定义中已经有了一个*args参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了。

    def student(name, age=10, *args, sex, classroom, **kwargs):
        pass
    
    student(name="jack", age=18, sex='male', classroom="202", k1="v1")
    
  • 相关阅读:
    HttpContext.GetOwinContext().Authentication 报错 解决办法
    owin Claims-based认证登录实现
    angularjs初识ng-app、ng-model、ng-repeat指令
    SpringBoot配置slf4j logback-spring.xml日志
    idea时间注释模版
    oracel截取字符串
    win10官网下载地址
    使用HttpWebRequest实现basic身份认证
    mybatis常用jdbcType数据类型与mysql的类型对照
    修改IntelliJ IDEA 默认配置路径
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/13471080.html
Copyright © 2020-2023  润新知