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 导入 Spark 最新源码及编译 Spark 源代码(博主强烈推荐)
前言 其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. 准备工作 1.sca ...
- [Python学习笔记-001] 内置函数getattr()
如果某个实例foo有多个方法, 当对foo的每一个方法我们都需要使用try ... except ...进行包装的时候,内置函数getattr()可以用来精简代码. 1. getattr()的用法 # ...
- Java的HashCode,Equal和==
----------------------------------------以下是分割线---------------------------------------- 我们都知道Java语言是完 ...
- ibatis in的用法
<dynamic-mapped-statement name="queryLabelservicecodeLogSize" result-class="java.l ...
- Spring 环境与profile(一)——超简用例
什么是profile,为什么需要profile? 在开发时,不同环境(开发.联调.预发.正式等)所需的配置不同导致,如果每改变一个环境就更改配置不但麻烦(修改代码.重新构建)而且容易出错.Spring ...
- webpack4 自学笔记四(style-loader)
全部的代码及笔记都可以在我的github上查看, 欢迎star:https://github.com/Jasonwang911/webpackStudyInit/tree/master/css 引入- ...
- 拥抱HTML5
HTNL5是2014年10月W3C推出的新标准,引入新的特性并对移动端更加友好. canvas <canvas>标签用于标记画布元素, 使用js脚本可以在画布上绘制自定义图形. 绘制矩形; ...
- [转]解决ssh登录后闲置时间过长而断开连接
本文转自: 转载自博客园wanghetao的博客 我们通过终端连接服务器时,当鼠标和键盘长时间不操作,服务器就会自动断开连接,我们还的需要重新连接,感觉很麻烦,总结一下解决此问题的方法 方法一 修改/ ...
- Oracle左连接、右连接、全外连接以及(+)号用法
1.准备工作 Oracle 外连接(OUTER JOIN)包括以下: 左外连接(左边的表不加限制) 右外连接(右边的表不加限制) 全外连接(左右两表都不加限制) 对应SQL:LEFT/RIGHT/F ...
- winform窗体 小程序【三级联动】
三级联动[省,市,区] 类似地区选择,当选的某个省份,后面的下拉框相对变成对应省份的区县 实现省市区联动关键是数据库的表,[每个省内区的AreaCode列是同样的] public Form2() { ...