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次。当然,这个得值也是可以修改的。
python的函数(三)的更多相关文章
- 【278】◀▶ Python 数学函数说明
参考:Python 数学函数说明 目录: 一.Python 数学函数 二.Python 随机数函数 三.Python 三角函数 四.Python 数学常量 一.Python 数学函数 函数 返回值 ...
- [Python笔记]第三篇:深浅拷贝、函数
本篇主要内容:深浅拷贝,自定义函数,三目运算,lambda表达式, 深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import ...
- 第三章:Python基础の函数和文件操作实战
本課主題 Set 集合和操作实战 函数介紹和操作实战 参数的深入介绍和操作实战 format 函数操作实战 lambda 表达式介绍 文件操作函数介紹和操作实战 本周作业 Set 集合和操作实战 Se ...
- python入门(三):分支、循环、函数
1.分支 if循环格式:if condition_1: statement_block_1elif condition_2: statement_block_2else: statement_bloc ...
- python学习笔记三:函数及变量作用域
一.定义 def functionName([arg1,arg2,...]): code 二.示例 #!/usr/bin/python #coding:utf8 #coding=utf8 #encod ...
- 对Python中函数参数类型及排序问题,三个方面的总结
Python中函数的参数问题有点复杂,主要是因为参数类型问题导致的情况比较多,下面来分析一下. 参数类型:缺省参数,关键字参数,不定长位置参数,不定长关键字参数. 其实总共可以分为 位置参数和关键字参 ...
- Python【第三课】 函数基础
本篇内容 函数基本语法及特性 嵌套函数 递归函数 匿名函数 高阶函数 内置函数 1.函数的基本语法及特性 1.1 函数概念 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提 ...
- 学以致用三十二-----python中函数的括号使用
一直以来对python中函数括号的使用,有点分不清楚,到底什么时候用括号,什么时候不用括号,造成了很大看困惑. 今天来总结下. class aaa(): y = 'you' def __init__( ...
- Python虚拟机函数机制之参数类别(三)
参数类别 我们在Python虚拟机函数机制之无参调用(一)和Python虚拟机函数机制之名字空间(二)这两个章节中,分别PyFunctionObject对象和函数执行时的名字空间.本章,我们来剖析一下 ...
- python函数知识六 内置函数二、匿名函数与内置函数三(重要)
19.内置函数二 abs():绝对值 lst = [1,2,-3,1,2,-5] print([abs(i) for i in lst]) enumerate("可迭代对象",&q ...
随机推荐
- 【转】Intellij IDEA使用总结
原文地址:http://totohust.iteye.com/blog/1035550 1. IDEA内存优化 先看看你机器本身的配置而配置. \IntelliJ IDEA 8\bin\idea.ex ...
- sql-DDL, DML 常用语句
mysql的安装可见: http://www.cnblogs.com/wenbronk/p/6840484.html 很久不用mysql, 今天建表都不会了, , , 慢慢补充 sql语言分为3种: ...
- tomcat配置说明,配置不用访问工程名
# 配置项目访问不用输入项目名称 # [重要]亲测 <Host>中的 appBass="" 一定不能带目录,必须为空,因为启动tomcat会启动appBass下面的所有 ...
- Java NIO系列教程(九) ServerSocketChannel
Java NIO中的 ServerSocketChannel 是一个可以监听新进来的TCP连接的通道, 就像标准IO中的ServerSocket一样.ServerSocketChannel类在 jav ...
- logstash与kafka消息传输<一>
1.版本: logstash6.1.2.kafka-0.11.kafka-0.8.2.java1.8 Note: Logstash requires Java 8. Java 9 is not sup ...
- windows环境下搭建Java开发环境(一):jdk安装和配置
一.资源下载 官网:http://www.oracle.com/technetwork/java/javase/downloads/index.html 本人安装的是jdk1.8,百度云资源:链接:h ...
- springboot redis 缓存跨域丢失问题
对于前后端分离的项目,在开发阶段经常会遇到跨域的问题. 1.首先,对于后台的处理方式,第一种是用 @CrossOrigin 注解,@crossorigin是后端SpringMVC框架(需4.2版本以上 ...
- 使用matlibplot.pyplot设置画图的坐标系
今天看了林轩田老师的感知机算法,心血来潮想要做个可视化过程,以便观察更新的过程. 现将学习成果做个记录,下面是画出来的图,这是初始的状态,后面会通过算法找到一条经过原点的直线将两堆数据分割开来. 直线 ...
- Python中的单例模式的几种实现方式的及优化
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- Nodejs微信公众号开发
概览 key value 项目名称 node微信公众号开发 项目描述 使用node编写接口,前后端分离获取签名数据 开发者 leinov 发布日期 2018-11-07 仓库 github地址 安装& ...