zoukankan      html  css  js  c++  java
  • 4-[函数]-参数

    1.形参,实参

    • 形参变量
    只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量
    • 实参
    可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值
    

      

       

    2,默认参数

      (1)相同CN可以变为默认参数

      发现 country 这个参数 基本都 是"CN", 就像我们在网站上注册用户,像国籍这种信息,你不填写,默认就会是 中国, 这就是通过默认参数实现的,把country变成默认参数非常简单

      (2)默认参数必须放在最后面

      

      

    另外,你可能注意到了,在把country变成默认参数后,我同时把它的位置移到了最后面,为什么呢? 
    

      按位置一一对应,默认参数必须放在位置参数后面

      (3)修改默认参数

      

     3.位置参数,关键参数

      (1)位置参数

         

     (2)关键参数

    • 正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可(指定了参数名的参数就叫关键参数),
    • 但记住一个要求就是,关键参数必须放在位置参数(以位置顺序确定对应关系的参数)之后

       

      

     但绝不可以这样:关键字参数应该放在 位置参数后

    stu_register("王山炮",course='PY',22,country='JP' )
    

      

    当然这样也不行: 给age赋值2次

    stu_register("王山炮",22,age=25,country='JP' )
    

      

    4.非固定参数 *args : 元组

      (1)如果参数中出现,*users,传递的参数就可以不是固定个数参数,传过来的参数打包成元组

    # 报警, 1个运维人员
    def send_alert(mgs, user):
        pass
    
    send_alert('出现error,请处理', 'alex')
    # 报警,10个运维人员
    def send_alert(mgs, *users):  #('alex', 'xxx', 'ttt')
        for u in users:
            print('%s->%s'%(mgs,u))
    
    send_alert('出现error,请处理', 'alex', 'xxx','ttt')
    # 运行结果
    出现error,请处理->alex
    出现error,请处理->xxx
    出现error,请处理->ttt

      (2)如果穿过来的是list,会把他作为元组的第一个元素

    # 报警,10个运维人员
    def send_alert(mgs, *users):  # ('alex', 'xxx','ttt')--->  (['alex', 'xxx', 'ttt'],)
        for u in users:
            print('%s->%s'%(mgs,u))
    
    #send_alert('出现error,请处理', 'alex', 'xxx','ttt')
    send_alert('出现error,请处理', ['alex', 'xxx','ttt'])
    # 运行结果
    出现error,请处理->['alex', 'xxx', 'ttt']

      (3)传入list,使用一个星号

      不光列表,任何序列类型数据对象,比如字符串、元组都可以通过这种方式将内部元素逐一作为参数,传递给函数。而字典,则会将所有的key逐一传递进去。

    def send_alert(mgs, *users):  # ('alex', 'xxx','ttt')--->  ('alex', 'xxx', 'ttt')
        print(users)
        for u in users:
            print('%s->%s'%(mgs,u))
    
    send_alert('出现error,请处理', *['alex', 'xxx','ttt'])
    
    # 运行结果
    ('alex', 'xxx', 'ttt')
    出现error,请处理->alex
    出现error,请处理->xxx
    出现error,请处理->ttt

      (4)位置参数不能放在*args后面

      

      

      (4)关键字参数可以放在*args后面

      

    5.非固定参数**kwargs :字典

        (1)两个星表示接受键值对的动态参数,数量任意。调用的时候会将实际参数打包成字典。例如:

      

         (2)使用两个星号!字典传给它

        

       (3)“万能”参数

      当*args**kwargs组合起来使用,理论上能接受任何形式和任意数量的参数,在很多代码中我们都能见到这种定义方式。需要注意的是,*args必须出现在**kwargs之前。

    def func(*args, **kwargs):
    
        for arg in args:
            print(arg)
    
        for kwg in kwargs:
            print(kwg, kwargs[kwg])
    
    
    lis = [1, 2, 3]
    dic = {
        'k1': 'v1',
        'k2': 'v2'
    }
    
    func(*lis, **dic)

    6.拆包 *  **

    • 把元组拆成一个个,当成参数传递
    • 把字典拆成一对对键值对,当成参数传递

      (1)拆包之前

    ###### 拆包之前
     def test(a,b,c=33,*args,**kwargs):
         print(a)
         print(b)
         print(c)
         print(args)
         print(kwargs)
     
     #test(11,22,33,44,55,66,task=99,done=98)
     
     A = (44,55,66)
     B = {"name":"alex","age":18}
     
     test(11,22,33,A,B)
    
    ####  运行结果
    11
    22
    33
    ((44, 55, 66), {'age': 18, 'name': 'alex'})            #A,B是传递的参数
    {}                                                   #没有传入命名参数    

      (2)拆包之后

    ####   拆包之后
     def test(a,b,c=33,*args,**kwargs):
         print(a)
         print(b)
         print(c)
         print(args)
         print(kwargs)
     
     #test(11,22,33,44,55,66,task=99,done=98)
     
     A = (44,55,66)
     B = {"name":"alex","age":18}
     
     test(11,22,33,*A,**B)
    
    
    ####  运行结果
    11
    22
    33
    (44, 55, 66)
    {'age': 18, 'name': 'alex'}
  • 相关阅读:
    用Sqoop进行Hive和MySQL之间的数据互导
    Spark读HBase写MySQL
    Kafka如何彻底删除topic及数据
    LDAP-HA安装与配置(Keepalived方式实现)
    配置两个Hadoop集群Kerberos认证跨域互信
    MYSQL HA 部署手册
    ELK简单安装测试
    Elasticsearch CURL命令
    大数据常见错误解决方案(转载)
    生成 RSA 公钥和私钥的方法
  • 原文地址:https://www.cnblogs.com/venicid/p/8405688.html
Copyright © 2011-2022 走看看