• 08-不定长函数


    在开发过程中,我们需要计算两个数的和,代码如下:

    root@ubuntu:/home/python/codes/python基础-05# cat test.py 
    #-*- coding:utf-8 -*-
    def sum_2_nums(a,b):
        result = a+b
        print("result=%d"%result)
    
    num1 = int(input("第1个数:"))
    num2 = int(input("第2个数:"))
    sum_2_nums(num1,num2)
    
    root@ubuntu:/home/python/codes/python基础-05# python3 test.py 
    第1个数:1
    第2个数:2
    result=3

    但是如果我们想计算n个数的和,那么代码需要怎么写呢?

    root@ubuntu:/home/python/codes/python基础-05# cat test.py 
    #-*- coding:utf-8 -*-
    def sum_n_nums(a,b,*args):  #在这里定义的函数中携带三个参数,a,b,args,那么这个*args是啥呢?表示都存放在*args,变量名任叫args,*代表着对python解释器说:如果传递的实参个数大于形参的个数,剩下的都给#args
        result = a+b
        for temp in args:
            result += temp
        print("result=%d"%result)
    
    sum_n_nums(11,22,33,44,55)
    
    root@ubuntu:/home/python/codes/python基础-05# python3 test.py 
    result=165

    让我们来具体的来看一下*args是什么东西:

    root@ubuntu:/home/python/codes/python基础-05# cat test.py 
    #-*- coding:utf-8 -*-
    def sum_n_nums(a,b,*args):  #*args表示命名函数
        print(a)
        print(b)
        print(args)
    
    sum_n_nums(11,22,33,44,55)
    
    root@ubuntu:/home/python/codes/python基础-05# python3 test.py 
    11
    22
    (33, 44, 55)  #元组,也就是说*告诉python解释器,如果有多传进来的值,都交给*args,然后以元组的形式保存起来
    root@ubuntu:/home/python/codes/python基础-05# cat test.py 
    #-*- coding:utf-8 -*-
    def sum_n_nums(a,b,*args):
        print(a)
        print(b)
        print(args)
    
    sum_n_nums(11,22,33)
    
    root@ubuntu:/home/python/codes/python基础-05# python3 test.py 
    11
    22
    (33,)  #这个是什么鬼,原来当元组只有一个参数的时候,需要在后面添加一个“,”号,整体才可以称为元组,否则别人也不知道这是什么东西
    root@ubuntu:/home/python/codes/python基础-05# cat test.py 
    #-*- coding:utf-8 -*-
    def sum_n_nums(a,b,*args):
        print(a)
        print(b)
        print(args)
    
    sum_n_nums(11,22)
    
    root@ubuntu:/home/python/codes/python基础-05# python3 test.py 
    11
    22
    ()  #因为在调用函数的时候只是传递了两个参数

    字典形式参数

    root@ubuntu:/home/python/codes/python基础-05# cat test.py 
    #-*- coding:utf-8 -*-
    def sum_n_nums(a,b,*args,**kwargs):
        print(a)
        print(b)
        print(args)
        print(kwargs)
    
    sum_n_nums(11,22,33,name='xiaoyafei',age=19)  #有的人可就纳闷了,怎么调用函数还有带变量名的,在这里解释一句,**kwargs是字典形式参数,如果传递了多余的参数,而多余的参数面前是不带变量名的,统统都给args,
    否则都交给kwargs,并且是以字典的形式保存的
    root@ubuntu:
    /home/python/codes/python基础-05# python3 test.py 11 22 (33,) {'name': 'xiaoyafei', 'age': 19}

    总结

    *args表示告诉python解释器这个变量可以保存没有名字的变量的值

    **kwargs表示告诉python解释器可以保存实参里带有名字的参数

    拆包

    root@ubuntu:/home/python/codes/python基础-05# cat test.py 
    #-*- coding:utf-8 -*-
    def sum_n_nums(a,b,c=33,*args,**kwargs):
        print(a)
        print(b)
        print(c)
        print(args)
        print(kwargs)
    A = [11,22,33]
    B = {"name":"laowang","age":20}
    sum_n_nums(11,22,33,*A,**B)  
    
    root@ubuntu:/home/python/codes/python基础-05# python3 test.py 
    11
    22
    33
    (11, 22, 33)
    {'name': 'laowang', 'age': 20}

     拆包总结

    1.如果想往函数里传递的是元组里的内容/字典里的内容,将来在调用的时候再元组前写上*,在字典面前写上**

    2.*和**表示拆包,把元组拆成一个一个的值,把字典拆成一个一个的key value

    3.如果没有写*和**,那么就会当成一个普通的值扔到args里

    4.在实参里写入*和**表示拆包,把里面的值当做参数传递

  • 相关阅读:
    tigerVNC远程桌面,跨内网
    Nutch 二次开发之parse正文内容
    在一个字符串中找到第一个仅仅出现一次的字符。
    图像处理之霍夫变换(直线检測算法)
    EJB3.0开发环境的搭建
    uestc 250 数位dp(水)
    Matlab画图-非常具体,非常全面
    高性能I/O设计模式Reactor和Proactor
    leetcode第一刷_Path Sum II
    PreTranslateMessage作用和用法
  • 原文地址:https://www.cnblogs.com/xiaoyafei/p/8556419.html
Copyright © 2020-2023  润新知