Python的函数参数和递归参数

位置参数

def power(x):
    return x*x;
    

默认参数

指的是在函数定义的时候,就赋予一些参数默认值,在调用这个函数的时候不必多次传入重复的参数值。

如定义一个多次输出同一个年龄阶段和同一个城市的学生的姓名和性别。

def info(name,gender,age=20,city=‘sichuan‘):
    print(‘name:‘, name)
    print(‘gender:‘, gender)
    print(‘age‘,age)
    print(‘city‘,city)
info("xiaoqian","nv")
info("xiangj",‘nan‘)

从上面可以看出,默认参数可以简化函数的调用,设置默认参数时,有几点要注意:

一是必选参数在前,默认参数在后。

二是如何设置默认参数。

但是默认参数虽然好,但是也有坑:就是在定义默认参数的时候,默认参数必须是不可变对象。

可变参数(*)

可变参数就是传入的参数个数是可变的,可以是1个,2个或多个,甚至是0个

def calc(*numbers):
    sum = 0;
    for n in numbers:
        sum = sum + n;
    return sum;
calc();
calc(1,2,3);

如果有一个list或者是tuple,要调用一个可变参数怎么办?

python允许在list或者tuple前面加上*,传给函数。

num  = [1,2,3];
cal(*num);

可变参数允许传入0,1,n个参数,在调用的时候会自动将这些参数组装成一个tuple。而关键字参数允许你传入0个或人一个含参数名的参数,这些关键字参数在函数内部自动组装成一个dict。

关键字参数(**)

def person(name,age,**kw):
    print(‘name‘,name,‘age‘,age,‘other‘,kw)

person(‘tom‘,20);
person(‘tom1‘,10,city="beijinh");
person(‘tom2‘,30,gender="m",city="beijing");

也可以将上面的gender和city参数组装成一个dict后,再传给函数

extra = {‘city‘:‘beijing‘,‘job‘:‘engin‘};
person(‘tom11‘,100,city=extra[‘city‘],job=extra[‘job‘]);
person("tom11",100,**extra);
//注意这里kw获得的是extra的一份拷贝,对kw的改动不会影响到函数外的extra

命名关键字参数(*特殊分隔符)

关键字参数的调用,函数可以接受不受限制的关键字参数。

但是有时候也需要限制关键字参数个数,所以这时候就需要用到命名关键字参数

def person(name,age,*,city,job):
    print(name,age,city,job);
    //命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。

person("jackl",14,city="beijing",job="gee");
//命名关键字参数必须传入参数名,这和位置参数不同,如果没有传入参数名,调用就将报错

如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不需要*这个特殊分隔符了。

def person(name,age,*args,city,job):
    print(name,age,args,city,job)

要特别注意:如果没有可变参数,必须加一个作为特殊分隔符,否则Python将无法识别位置参数和命名关键字参数。

总结:

python函数一共有5种参数:必选参数,默认参数,可变参数,关键字参数,命名关键字参数。可以将这几个参数组合使用。但是要注意:参数定义的顺序必须是:

必选参数,默认参数,可变参数,命名关键字参数和关键字参数。

默认参数一定要用不可变对象

args是可变参数,args接受的是一个tuple。

kw是关键字参数,kw接受的是一个dict。

可变参数可以直接传入:func(1,2,3),又可以组装list或者tuple,再通过args传入:func((1,2,3))

关键字参数既可以直接传入func(a=1,b=2),又可以先组装dict,然后通过kw传入func(**{‘a‘:1,‘b‘:2})

命名关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。

定义命名的关键字出纳号苏时,在没有可变参数的情况下,不要忘了写特殊分隔符*,否则定义的将是位置参数。

递归函数

递归函数的优点是定义简单,逻辑清晰。但是有时候会出现栈溢出。

解决栈溢出的方法是尾递归。事实上,尾递归和循环的效果是一样的,把循环看成一种特殊的尾递归函数也是可以的

尾递归:在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。

def fact(n):
    if n == 1:
        return 1
    return n * fact(n-1)

上面的return中包含了表达式,这种不是尾递归。

def fact_item(num,product):
    if num == 1:
        return product
    return fact_item(num-1,num*product)

上面这种是尾递归,做了优化,栈不会增长,因此多少次调用也不会导致栈溢出。

遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上面的fact(n)函数改成尾递归方式,也会导致栈溢出

时间: 2024-08-11 19:02:01

Python的函数参数和递归参数的相关文章

Python定义函数时,不同参数类型的传递

python的底层是通过C语言实现,因此参数调用时是通过地址传递的(和C语言一样,值是单向传递,指针才能实现双向传递),比如: # -*- coding: utf-8 -*-def f1(x,y): z=x+y y=x return z a= 1 b=2 c=f1(a, b) print c, a, b 得到的结果是 3 1 2 从这里可以看出b值并没有变化,也就是说值是单向传递的. 函数的定义时,参数可以是数值,列表(当元组处理),字典等,其参数定义形式如下: def f(a, *pargs,

python的函数介绍 位置参数 关键字参数 默认参数 参数组 *args **kwargs

1.数学意义的函数与python中的函数 数学意义的函数 y = 2*3+1 x =3 y =7 x是自变量,y是因变量 2.python中定义函数的方法 一个函数往往都是为了完成一个特定的功能而存在的,所以注释信息加上是个好习惯 def atest(x): "The function definitions" x += 1 return x def:     定义函数的关键字 atest:     函数名 ():     内可定义形参 "":    文档描述(非必

python基础 函数定义 返回值 参数

函数定义 1 #python中函数定义.def函数定义的关键字,fun1函数名,x为函数的形参可以有多个,多个之间用“,”隔开:return 函数返回值的关键字,python中return可以是非必要 2 def fun1(x): 3 x += 1 4 return x 函数返回值 1 # 函数返回值可以有多个,之间使用“’”分隔,返回值讲多个值组成的元组进行返回. 当无return时python会隐式return “None”,如果只返回一个值就返回这个值本身 2 def fun2(x, y)

Python 5.函数作用域与递归(基础篇)

本章大纲: -变量作用域- 变量由作用范围限制 两种不同的作用域: 全局(global):在函数外部定义 局部(local):在函数内部定义 变量的作用范围 全局变量 在整个程序范围都有效 全部变量可以在局部范围里面使用 局部变量在局部范围内可以使用 局部变量无法在全局范围内使用 LEGB原则 L(Local)局部作用域 E(Enclosing function locale)外部嵌套函数作用域(命名空间) G(Global module)全局变量,函数定义所在模块的命名空间 B(Buildin

python中函数的不定长参数

#定义一个含有不定长参数的函数,本例第三个参数*args def sum_nums(a,b,*args): print('_'*30) print(a) print(b) print(args) #调用函数: sum_nums(11,22,33,44,55,66,77) sum_nums(11,22,33) sum_nums(11,22) sum_nums(11)#错误调用,传递的参数不够 #输出结果: ______________________________ 11 22 (33, 44,

Python之函数、参数、局部全局变量、前向引用、递归

函数 函数:实现某种功能(数学形式.python def函数式编程) 过程:就是函数没有返回值 参数 1.形参 实参 位置参数 关键字参数 默认参数 1 # 形参x,y不分配内存空间 实参2,3在调用的时候才分配空间,调用完毕就释放空间 2 def calc(x, y): 3 res = x ** y 4 return res 5 6 7 c = calc(2, 3) 8 print(c) 9 10 11 def test(x, y, z): 12 print(x) 13 print(y) 14

python学习日常-函数参数与递归

先说递归:因为原理简单,但是要用灵活运用的话,是非常困难的. 递归的原理就是在函数内部调用函数自己,以实现循环的目的, 比如一个阶乘函数def fn(n): if n==1: return n; else : return fn(n-1)*n; 还有一种尾递归的说法,原因是递归非常容易栈溢出,所以在返回值中不应该出现剩函数本身, 上面的阶乘就可以化为 def fn(n,product): if n==1: return product; else : return fn(n-1,n*produc

关于python的函数的*和**参数:

1.将足够的参数解包以后传递给函数:>def f(p1, p2, p3, p4):>     print p1+p2+p3+p4>>li = [1, 2, 3, 4]>f(*li)10>>tu = (1, 2, 3, 4)>f(*tu)10>>di = {'p1':1, 'p2':2, 'p3':3, 'p4':4}>f(**di)>10 2.使用封包的方法访问多余的参数>>> def funct(*para, **

[python]关于函数传入参数

在传入参数时有两个特殊参数,*args,**kwargs,功能如下: def foo(*args, **kwargs): print 'args = ', args print 'kwargs = ', kwargs print '---------------------------------------' if __name__ == '__main__': foo(1,2,3,4) foo(a=1,b=2,c=3) foo(1,2,3,4, a=1,b=2,c=3) foo('a', 1