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 ...
随机推荐
- 源码分析篇 - Android绘制流程(三)requestLayout()与invalidate()流程及Choroegrapher类分析
本文主要探讨能够触发performTraversals()执行的invalidate().postInvalidate()和requestLayout()方法的流程.在调用这三个方法到最后执行到per ...
- sql查询其他服务器数据库表
exec sp_addlinkedserver 'abc', '', 'SQLOLEDB', '192.168.49.34' exec sp_addlinkedsrvlogin ' go --查询 s ...
- google 被墙的解决办法
昨晚无意中发现的东西,分享给各位使用,google搜索技术方面的东西还是很准确的,可惜被墙了,但是上有政策下有对策…… 谷歌地址: http://74.125.224.18/ http://91.21 ...
- java web 答辩总结
今天我们组答辩.在昨天前三个组答辩之后,整理了一些试题. 在这个项目的答辩准备:首先把这个java web这本书大概的看了一遍:对整理的那些试题也把答案整理出来了:针对老师提问频率较高的试题:针对自己 ...
- 各大语言性能对比PK数据
这里我用的python版本是Python 3.6.2(64位),php版本是PHP 7.0.12(64位),node版本是v6.11.0(64位),Go 1.8.3(64位),C# 基于.Net 4. ...
- C# WebApi 中设置Session可用
在Global.acax中,添加下面方法 //设置session可用 public override void Init() { PostAuthenticateRequest += MvcAppli ...
- 第15课-数据库开发及ado.net-数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库
第15课-数据库开发及ado.net 数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库 1. 学习方法 2. 多涨见识 3. 比自己强的人一起,学习更强:比自己更聪明的人 ...
- [EWS]查找 文件夹
摘要 有时在操作exchange的时候,需要查找用户exchange文件夹,比如用户新建了一些文件夹. 一个例子 这里以查找用户outlook邮箱中的历史对话文件夹为例. private const ...
- Java ArrayList 数组之间相互转换
做研发的朋友都知道,在项目开发中经常会碰到list与数组类型之间的相互转换,本文通过一个简单的例子给大家讲解具有转换过程. package test.test1; import java.util.A ...
- Java JDBC的基础知识(二)
在我的上一篇Java JDBC的基础知识(一)中,最后演示的代码在关闭资源的时候,仅仅用了try/catch语句,这里是有很大的隐患的.在程序创建连接之后,如果不进行关闭,会消耗更多的资源.创建连接之 ...