• python的函数(三)


    1,函数多类型传值和冗余参数

    2,递归函数

    1,函数多类型传值和冗余参数

    1.0,函数多类型传值

    定义1个函数,

    def fun(x,y):
      return x+y
    

      

    调用该函数print fun(1,2),返回3。但是有一种情况,我就想输入一个参数,是否可行?当然,可以考虑使用默认参数。但是除了默认参数我们还可以传入一个元祖,就能完成相当于传入2个参数的效果。

    def fun(x,y):
        return x+y
    
    t=(1,2)
    
    print fun(*t)
    

      

    上面的代码只是传入了一个参数,但是传入的是元祖,可以发现元祖的个数和传入参数刚好匹配,在元祖前面加个*号就可以将元祖传入到函数中并与形参一一对应。可见传入元祖或列表用*号。

    def fun(x,y,z):
        return x+y+z
    
    print fun(**{'x':1,'y':3,'z':5})
    

      

    上面的代码传入字典,用于替代出入的三个参数,传入字典要用**号。

    2,冗余参数(可变参数)

    在定义函数的时候,不确认函数传入的参数的个数,这个时候就需要用到可变参数了。

    def fun(x,*args,**kwargs):
        print x
        print args
        print kwargs
    
    
    fun(1)
    

     

    上述会返回1,和一个空的元祖和一个空的字典。可见args或者*kwargs是可以不用传给参数给它的。

    def fun(x,*args,**kwargs):
        print x
        print args
        print kwargs
    
    
    fun(1,23,3,4,5)
    

     

    上面的代码返回1和(23,3,4,5)和1个空字典。可见这些元素23,3,4,5都传给args这个参数了。

    def fun(x,*args,**kwargs):
        print x
        print args
        print kwargs
    
    
    fun(1,23,3,4,5,k=1)
    

      

    上面的代码返回如下:

    1
    (23, 3, 4, 5)
    {'k': 1}

     可以发现这个和上面的区别是多传入了一个参数,这个参数的传给了**kwargs这个参数并以字典返回。所以,如果需要出入字典的话,需要使用**kwargs这个可变参数。

    def fun(x,*args,**kwargs):
        print x
        print args
        print kwargs
    
    fun(1,23,3,4,5,k=1,*(5,6,7),**{'name':'tom'})
    

      

    上面代码返回如下:

    1
    (23, 3, 4, 5, 5, 6, 7)
    {'k': 1, 'name': 'tom'}

    可以发现这些23,3,4,5,k=1,*(5,6,7)都传给*args,k=1和{'name':'tom'}字典传给**kwargs。

    2,递归函数

    2.0 递归函数的通俗定义:

      就是函数内使用函数本身。例子如下:

    def fun(n):
        print(n)
        if int(n/2)>0:
            return (fun(n/2))

    上述代码其实就是递归函数。fun(n)函数里面有调用了fun(n/2),即函数本身。

    在写简单的例子,求10以内的数的乘积。可以使用循环的方法写出。

    def sum(x):
        sum1 = 1
        for i in xrange(1,x+1):
            sum1*=i
        print sum1
    
    sum(10)
    

      

    如果用递归函数写的话:

    def sum(x):
        if x==1:
            return 1
        else:
            return x*sum(x-1)
    
    print sum(10)
    

      
    2.1,递归函数的特点:

    1,必须要有1个明确的结束条件。
    2,每次进入递归,问题规模要减少,必须向默认结果收敛。
    3,效率不要,如果递归层数过多,会导致栈溢出。

    2.2,测试递归函数的递归次数

    def fun(n):
        n+=1
        print(n)
        return fun(n)
    print fun(1)

    从输出来的结果999来看,python默认递归的此时应该为999。

    小结:

    1,定义函数时,如果不确定的参数的个数可以用*args和**kwargs定义。

    #*args接受N个位置参数,转换成元祖的形式。如果直接传入元祖,需要使用*号。
    '''
    def test(*args):
    print(args)
    test(1,2,3,4,5,5,7)
    test(*[1,2,3,4,5,5,7])
    '''
    #**kwargs 把N个关键字参数(x=?,y=?啥形式的称为关键字参数),转换成字典的形式。如果直接传入字典,则需使用**。
    '''
    def test2(**kwargs):
    print(kwargs)
    test2(name='tom',age='30')
    test2(**{'name':'tom','age':'30'})
    '''

    2,递归函数的实质就是函数本身自我的调用,但是必须要有个结束条件,不然就是死循环。这样Python就会报错,最终也可能会导致栈溢出。python默认最多递归为999次。当然,这个得值也是可以修改的。

  • 相关阅读:
    Problem 1014 xxx游戏 暴力+拓扑排序
    Codeforces Beta Round #10 D. LCIS
    HDU 1423 Greatest Common Increasing Subsequence LCIS
    Codeforces Round #349 (Div. 1) A. Reberland Linguistics dp
    BZOJ 3875: [Ahoi2014]骑士游戏 dp+spfa
    Codeforces Round #360 (Div. 2) E. The Values You Can Make 01背包
    Codeforces Round #360 (Div. 2) D. Remainders Game 中国剩余定理
    UVALive 4872 Underground Cables 最小生成树
    POJ 1182 食物链 并查集
    山东省第六届ACM省赛
  • 原文地址:https://www.cnblogs.com/lin1/p/8195604.html
Copyright © 2020-2023  润新知