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)函数改成尾递归方式,也会导致栈溢出
Python的函数参数和递归参数的更多相关文章
- python的函数介绍 位置参数 关键字参数 默认参数 参数组 *args **kwargs
1.数学意义的函数与python中的函数 数学意义的函数 y = 2*3+1 x =3 y =7 x是自变量,y是因变量 2.python中定义函数的方法 一个函数往往都是为了完成一个特定的功能而存在 ...
- python中函数的不定长参数
例1: #定义一个含有不定长参数的函数,本例第三个参数*args def sum_nums(a,b,*args): print('_'*30) print(a) print(b) print(args ...
- python学习笔记12(函数三): 参数类型、递归、lambda函数
一.函数参数的类型 之前我们接触到的那种函数参数定义和传递方式叫做位置参数,即参数是通过位置进行匹配的,从左到右,依次进行匹配,这个对参数的位置和个数都有严格的要求.而在Python中还有一种是通过参 ...
- Python学习5——抽象,涉及抽象和结构、函数的自定义、参数、作用域、递归
此处将抽象和结构.自定义函数.参数的使用.作用域.递归放在一起学习,看起来很怪是不是? 但实际上这几者之间是有紧密联系的,不然Python基础教程(第三版)的作者为什么会把它们放在一起哪?手动滑稽 好 ...
- python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程
python学习7—函数定义.参数.递归.作用域.匿名函数以及函数式编程 1. 函数定义 def test(x) # discription y = 2 * x return y 返回一个值,则返回原 ...
- python之函数、参数、作用域、递归
函数的定义 函数也就是带名字的代码块.使用关键字def来定义,指出函数名及参数,以冒号结尾. def fibs(num): result =[0,1] for i in range(num-2): r ...
- Python基础(函数,函数的定义,函数的调用,函数的参数,递归函数)
1.函数 我们知道圆的面积计算公式为: S = πr2 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同大小的圆的面积: r1 = 12.34 r2 = 9.08 r3 = ...
- python中函数的参数和返回值
目录 函数 目标 01. 函数参数和返回值的作用 1.1 无参数,无返回值 1.2 无参数,有返回值 1.3 有参数,无返回值 1.4 有参数,有返回值 02. 函数的返回值 进阶 示例 -- 温度和 ...
- Python——函数的命名关键字参数
命名关键字参数 对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数.至于到底传入了哪些,就需要在函数内部通过kw检查. 仍以person()函数为例,我们希望检查是否有city和job参数: ...
随机推荐
- Sberbank Russian Housing Market比赛总结
第一次真正意义上参加kaggle比赛,都是工作之余看看别人的kernel,然后整理整理自己的分析代码. 总体来说,本次比赛对我而言更像一个入门比赛,更多的是走走kaggle比赛的整个流程,看看高手们都 ...
- Kaggle 数据挖掘比赛经验分享(转)
原作者:陈成龙 简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台.笔者从 2013 年开始,陆续参加了多场 Kaggle上面举办的比 ...
- Windows 提权对照表 精确到sp版本号
https://www.securitysift.com/download/MS_privesc_and_exploits_table.csv
- 安装openssl-0.9.8报错out range of signed 32bit displacement .
安装openssl-0.9.8报错out range of signed 32bit displacement http://blog.csdn.net/wangtingyao1990/article ...
- mac系统中实现vitualBox中访问内网端口
第一步,增加外网网段 打开vitualbox后,按管理菜单,点击->主机网络管理器,如图1所示.点击创建,创建下个网络主机. 图1 然后,关掉虚拟机,虚拟机的设置中,找到网络选项卡,然后点击网络 ...
- 接口测试Session/Cookie笔记(二)
Windows系统运行计算器命令:calc python显示上一步操作命令:Alt+p python显示上一步操作结果:_(英文下划线) Session是存放在服务器的键值对 ,用于保存客户端的某个特 ...
- 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记5——Direct3D中的顶点缓存和索引缓存
第12章 Direct3D绘制基础 1. 顶点缓存 计算机所描绘的3D图形是通过多边形网格来构成的,网网格勾勒出轮廓,然后在网格轮廓的表面上贴上相应的图片,这样就构成了一个3D模型.三角形网格是构建物 ...
- 你想了解的轮询、长轮询和websocket都在这里了
日常生活中,有很多需要数据的实时更新,比如群聊信息的实时更新,还有投票系统的实时刷新等 实现的方式有很多种,比如轮询.长轮询.websocket 轮询 轮询是通过设置页面的刷新频率(设置多长时间自动刷 ...
- 在网站中嵌入VideoJs视频播放器
一个博客难免需要引用视频来说明内容,但想要自己来实现一个视频播放器是不是一时半会就能完成的,更重要的是这需要对视频播放技术有一定的了解.于是自然而然的有人会想到开源项目.一个不错的选择便是video. ...
- .NET 二进制序列化器,SOAP序列化器,XML序列化器
这里就不说JSON序列化了,只介绍三种:二进制序列化器,SOAP序列化器,XML序列化器 直接上代码: /// <summary> /// 二进制序列化器. /// 最节省流量,压缩程度最 ...