• python--可变长参数(*args、**kwargs)、返回值(return)


    一、可变长参数

    1、默认参数:

    代码如下:

    def information_register(name, age, country, sex):
        print("---注册信息---")
        print("姓名:", name)
        print("age:", age)
        print("国籍:", country)
        print("性别:", sex)
    
    
    information_register("山炮", 22, "CN", "")
    information_register("二狗", 21, "CN", "")
    information_register("三傻", 25, "CN", "")

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

    def information_register(name,age,sex,country="CN"):
        print("---注册信息---")
        print("姓名:", name)
        print("age:", age)
        print("国籍:", country)
        print("性别:", sex)
    
    
    information_register("山炮",22,"")
    information_register("二狗",21,"")
    information_register("三傻",25,"")

    只需要把创建country这个形参的时候给它传一个实参就可以:country="CN"。这样就成了默认参数,这个参数在调用时不指定,那默认就是CN,指定了的话,就用你指定的值。另外要注意的一点就是 :我把country变成默认参数后,把他的位置放到了最后,这个是因为关键字参数不能放在位置参数前面。

    2、非固定位置参数:*args

    作用:接收N个位置参数,转换成元组的形式

    def test(*args):  # 形参必须以*开头,args参数名随便定义,但是最好按规范来,定义成args
        print(args)
    
    
    test(1, 2, 3, 4, 5)  # 输入多个位置参数
    
    # 输出结果
    (1, 2, 3, 4, 5)  # 多个参数转换成元组

    2.1、不传值,传入列表

    def test(*args):
        print(args)
    
    
    print("------data1------")
    test()  # 如果什么都不传入的话,则输出空元组
    print("------data2------")
    test(*[1, 2, 3, 4, 5])  # 如果在传入的列表的前面加*,输出的args = tuple([1,2,3,4,5])
    print("------data3------")
    test([1, 2, 3, 4, 5])  # 如果再传入的列表前不加*,则列表被当做单个位置参数,所以输出的结果是元组中的一个元素
    
    #输出结果
    ------data1------
    ()
    ------data2------
    (1, 2, 3, 4, 5)
    ------data3------
    ([1, 2, 3, 4, 5],)

    2.2、位置参数和非固定位置参数*args

    def test(x,*args):
        print(x)  #位置参数
        print(args)  #非固定参数
     
    test(1,2,3,4,5,6)
     
    #输出结果
    1
    (2, 3, 4, 5, 6) 

    第一个实参是形参X 的值,后面的值就变成了非固定位置参数的*args的实参了

    2.3、关键字参数和非固定位置参数*args

    def test(x,*args):
        print(x)
        print(args)
     
    test(x=1,2,3,4,5,6)
     
    #输出结果
        test(x=1, 2, 3, 4, 5, 6)
                 ^
    SyntaxError: positional argument follows keyword argument
     #位置参数在关键字参数后面
    
    
    显然报错了,因为x=1是关键字参数,*args是位置参数,而关键字参数不能再位置参数前面的,所以报错,只要把关键字参数放在位置后面就可以了,代码如下:
    
    def test(*args,x):
        print(x)
        print(args)
    
    
    test(2, 3, 4, 5, 6,x=1)
    
    #输出结果
    1
    (2, 3, 4, 5, 6)

    3、非固定关键字传参:**kwargs

    作用:把N个关键字参数,转换成字典形式

    def test(**kwargs):  # 形参必须以**开头,kwargs参数名随便定义,但是最好按规范来,定义成kwargs
        print(kwargs)
    
    
    test(name="zhangsan", age=18)  # 传入多个关键字参数
    
    #输出结果
    {'name': 'zhangsan', 'age': 18}

    3.1、传入字典

    def test(**kwargs):
        print(kwargs)
    
    
    test(**{"name": "zhangsan", "age": 18})  # 传入字典时,一定要在字典前面加**,否则就会报错
    
    #输出结果
    {'name': 'zhangsan', 'age': 18}
    传入字典时,一定要在字典前面加**,否则就会报错验证,代码如下:
    def test(**kwargs):
        print(kwargs)
    
    
    test({"name": "zhangsan", "age": 18})
    
    #输出结果
    Traceback (most recent call last):
        test({"name": "zhangsan", "age": 18})
    TypeError: test() takes 0 positional arguments but 1 was given  #报类型错误,传入的是位置参数
    View Code

    因为传入的字典被当做位置参数,所以被报类型错误,所以:传字典,加**

    3.2、位置参数和非固定关键字参数:**keargs

    def test(name, **kwargs):
        print(name)
        print(kwargs)
    
    
    print("-----data1-----")
    test("zhangsan")  # 1个位置参数
    print("-----data2-----")
    test("zhangsan", age=18, sex="M")  # 1个位置参数,两个关键字参数
    print("-----data3-----")
    test(name="zhangsan", age=18, sex="M")  # 3个关键字参数
    
    #输出结果
    -----data1-----
    zhangsan#输出1个位置参数
    {}  #没有输入关键字参数,所以输出空字典
    -----data2-----
    zhangsan#第1个位置参数
    {'age': 18, 'sex': 'M'} #剩下关键字参数,转换成1个字典
    -----data3-----
    zhangsan#第1个关键字参数
    {'age': 18, 'sex': 'M'} #剩下的关键字参数,转换成1个字典

    3.3、位置参数、关键字和非固定关键字参数

    def test(name, age=18, **kwargs):
        print(name)
        print(age)
        print(kwargs)
    
    
    print("----------data1--------")
    test("zhangsan", sex='M', hobby='tesl')
    print("----------data2--------")
    test("zhangsan", 34, sex='M', hobby='tesl')
    print("----------data3--------")
    test("zhangsan", sex='M', hobby='tesl', age=34)  # age关键字参数放到最后,也可以的
    
    #输出结果
    ----------data1--------
    zhangsan
    18    #不传,显示默认参数
    {'sex': 'M', 'hobby': 'tesl'}
    ----------data2--------
    zhangsan
    34    #传位置参数
    {'sex': 'M', 'hobby': 'tesl'}
    ----------data3--------
    zhangsan
    34    #关键字参数,放在前后并没有影响
    {'sex': 'M', 'hobby': 'tesl'}

    注:如果遇到一个关键字传参和非固定关键字传参,前后放的位置是不影响传参的,但是我们一般还是按顺序来

    3.4、位置参数、关键字参数、非固定位置参数和非固定关键字参数

    def test(name, age=18, *args, **kwargs):
        print(name)
        print(age)
        print(args)
        print(kwargs)
    
    
    print("-------第1种传参--------")
    test("zhangsan", 19, 1, 2, 3, 4, sex="m", hobby="tesla")
    print("-------第2种传参--------")
    test("zhangsan", 19, *[1, 2, 3, 4], **{'sex': "m", 'hobby': "tesla"})
    
    #输出结果
    --------第1种传参--------
    zhangsan    #传name位置参数
    19    #给age传位置参数
    (1, 2, 3, 4)    #非固定位置参数,以转换成元组
    {'sex': 'm', 'hobby': 'tesla'}    # 非固定关键字参数,转换成字典
    --------第2种传参--------
    zhangsan
    19
    (1, 2, 3, 4)    #以列表的形式传入,在列表前加*
    {'sex': 'm', 'hobby': 'tesla'}    #以字典的形式传入,在字典前加**

    关键字参数不能再位置参数前面,同样的非固定关键字参数也不能在非固定位置参数前面,代码如下:

    def test(name, age=18, *args, **kwargs):
        print(name)
        print(age)
        print(args)
        print(kwargs)
    
    
    test("zhangsan", 19, sex="m", hobby="tesla", 1, 2, 3, 4, 5)
    
    #输出结果
        test("zhangsan", 19, sex="m", hobby="tesla", 1, 2, 3, 4, 5)
                                                    ^
    SyntaxError: positional argument follows keyword argument
    View Code

    小结:

    1. 参数分为位置参数、关键字参数、默认参数、非固定位置参数和非固定关键字参数
    2. 位置参数之前传参,位置是不能调换的,多一个或者少一个参数都是不可以的。
    3. 关键字参数是不能放在位置参数前面的。
    4. 函数传参的位置顺序依次是,位置参数,默认参数、非固定位置参数、关键字参数、非固定关键字参数(def test(name,age=18,*args,**kwargs))
    5. 关键字传参,可以不用考虑位置的前后问题

    二、返回值(return)

    1、return的作用

     return其实有两个作用:

    • 需要用一个变量来接受程序结束后返回的结果
    • 它是作为一个结束符,终止程序运行
    def test():
        print("in the test_1")
        return 0
        print("the end") #结果中没有打印
     
    x = test()
    print(x)
     
    #输出结果
    in the test_1 #第一次打印
    0 #结果返回值

    注:return 0后面的代码就不执行了,只执行return前面的代码;变量x接受了test()函数结束后的返回结果 

    2、返回多个值

    上面的例子是返回来一个值,下面试一试无返回值,返回一个值,返回多个值的情况:

    def test_1():
        print("in the test_1")
     
    def test_2():
        print("in the test_2")
        return 0
     
    def test_3():
        print("in the test_3")
        return 1,"hello",["zhangsan","shuaigao"],{"name":"zhangsan"}
     
    x = test_1()
    y = test_2()
    z =test_3()
    print(x)
    print(y)
    print(z)
     
    #输出结果
    in the test_1
    in the test_2
    in the test_3
    None #x的值
    0  #y的值
    (1, 'hello', ['zhangsan', 'shuaigao'], {'name': 'zhangsan'}) #z的值

    返回值return的作用?  -------因为我们想要想要这个函数的执行结果,这个执行结果会在后面的程序运行过程中需要用到

    小实验:

    一个函数体内部调用另外一个函数,代码如下:

    def test(name,age=18,**kwargs):
        print(name)
        print(age)
        print(kwargs)
        test1()
     
    def test1():
        print("hello")
     
    #在test1函数之后调用
    test("zhangsan",age=23,sex="m",hobby="tesla")
     
    #输出
    zhangsan
    23
    {'hobby': 'tesla', 'sex': 'm'}
    hello
  • 相关阅读:
    区块链系统时钟同步(NTP时间同步服务器)
    解读GPS卫星同步时钟(NTP网络时间服务器)技术方案
    qsort的cmp函数理解
    IEEE浮点数标准
    看图认识CSS
    Liunx模拟网络延时
    0-4Python2升级3、CentOS-Vim-Golang环境配置
    怎么用Windws远程桌面(mstsc)远程连接服务端的Ubuntu或者CentOS?|内网穿透|服务器安装CentOS
    [Windows]进程无响应且无法在任务管理器关闭
    [python] 批量更改不同文件夹里同名文件夹名字并移动到一起
  • 原文地址:https://www.cnblogs.com/doumingyi/p/12451788.html
Copyright © 2020-2023  润新知