zoukankan      html  css  js  c++  java
  • 第二十四篇 可变长参数

    第二十四篇 可变长参数

    一、预备知识

    • 1.可变长参数:指的是在调用函数时,传入的参数个数可以不固定
    • **2.调用函数时,传值的方式无非两种,一种是位置实参,另一种是关键字实参,因此形参也必须得有两种解决方法,从此来分别接收溢出的位置实参与关键字实参 **

    二、可变长形参

    1.可变长形参之*

    • 形参中的 * 会将溢出的位置实参全部接收,以元组的形式存储起来,然后把元组赋值给 * 后的参数名。 后面的参数名一般约定俗成为args*
    def func(*args):        # args = (2,4,6,8,10)
        num = 0
        for i in args:
            num += i
        return num
    
    sum_int = func(2,4,6,8,10)
    print(sum_int)            # 30
    

    2.可变长形参之**

    • 1.形参中的 ** 会将溢出的关键字实参全部接收,以字典的形式存储起来,然后把字典赋值给 ** 后的参数名。 ** 后的参数名一般约定俗成为kwargs
    def func(**kwargs):
        print(kwargs)
        
    func(a=5,name = 'king')    # {'a': 5, 'name': 'king'}
    
    • 2.需要明白关键字参数其实是 变量名=变量值 的形式,传给函数之后会以键值对的形式存储

    三、可变长实参

    1.可变长实参之*

    • 实参中的 * 会将它后面的参数打散成位置实参且循环取出。以后但凡碰到实参中带 * ,就表示 * 后面是位置实参,马上打散成位置参数
    def func(x,y,z,*args):
        print(x,y,z,args)
        
    func(*(1,2,3,4),5,6,7)   # 先打散成(1,2,3,4,5,6,7)
    # 然后传给形参就变成 x=1,y=2,z=3,args=(4,5,6,7)
    # 所以最后的结果是:1 2 3 (4, 5, 6, 7)
    

    2.可变长实参之**

    • 实参中的 ** 会将它后面的参数打散成关键字实参且循环取出。以后但凡碰到实参中带 ** ,就表示它是关键字实参,马上打散成关键字实参
    def func(x,y,**kwargs):
        print(x,y,kwargs)
        
    func(2,3,**{'name':'king','age':20}) 
    # 2,3,{'name':'king','age':20}
    

    四、可变长参数的应用

    • 形参中:*表示接收溢出的位置参数,**表示接收溢出的关键字参数

    • 实参中:*表示传送的是位置参数,**表示传送的是关键字参数

    def f1(name,age,gender):
        print(f'my name is {name},my age is {age},my gender is {gender}')
              
    def f2(*args,**kwargs):
              print(f'args = {args}, kwargs = {kwargs}')
              f1(*args,**kwargs)
    f2(age =20, gender ='male', name ='king') 
    
    '''
    args = (), kwargs = {'age': 20, 'gender': 'male', 'name': 'king'}
    my name is king,my age is 20,my gender is male
    '''
    

    五、命名关键字形参

    • 1.当函数逻辑规定必须按照关键字实参传参,就必须按照函数的要求来进行指定关键字实参的传值
    def f(x,y,**kwargs):
    	if 'name' not in kwargs or 'age' not in kwargs:
            print('name和age必须用关键字实参进行传值')
            return
        print(kwargs['name'],kwargs['age'])
        
    f(1,3,name='king',age=20)
    # king 20
    
    • 2.在函数定义阶段, * 后面的参数都是关键字形参
    def f(i, *, name, gender='male', age):
        print(i)
        print(age)
    
    
    f(1, x='king', age=19)  '''TypeError: register() got multiple values for argument 'x' 。也就是关键字实参传值时不能随意改关键字形参的key'''
    
    • 3.给关键字形参传值时,必须按照 key = value 的形式传值,且 key 必须要命名关键字的指定的参数名
    def f(i, *, name, gender='male', age):
        print(i)
        print(age)
    
    
    f(1,'king', age=19) 
    

    六、总结

    def func(*args,**kwargs):
    	code
    
    • 上面这种写法,无论传多少位置参数或关键字参数,都可以全部接收
  • 相关阅读:
    spring 09-Spring框架基于QuartZ实现调度任务
    spring 08-Spring框架Resource资源注入
    spring 07-Spring框架Resource读取不同资源
    spring 06-Spring框架基于Annotation的依赖注入配置
    html 默认跳转
    poi 设置样式
    支付宝扫码支付回调验证签名
    构造器初始化
    cxf webservice
    CSS3 border-image 属性
  • 原文地址:https://www.cnblogs.com/itboy-newking/p/10953488.html
Copyright © 2011-2022 走看看