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的函数(三)的更多相关文章

  1. 【278】◀▶ Python 数学函数说明

    参考:Python 数学函数说明 目录: 一.Python 数学函数 二.Python 随机数函数 三.Python 三角函数 四.Python 数学常量 一.Python 数学函数   函数 返回值 ...

  2. [Python笔记]第三篇:深浅拷贝、函数

    本篇主要内容:深浅拷贝,自定义函数,三目运算,lambda表达式, 深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import ...

  3. 第三章:Python基础の函数和文件操作实战

    本課主題 Set 集合和操作实战 函数介紹和操作实战 参数的深入介绍和操作实战 format 函数操作实战 lambda 表达式介绍 文件操作函数介紹和操作实战 本周作业 Set 集合和操作实战 Se ...

  4. python入门(三):分支、循环、函数

    1.分支 if循环格式:if condition_1: statement_block_1elif condition_2: statement_block_2else: statement_bloc ...

  5. python学习笔记三:函数及变量作用域

    一.定义 def functionName([arg1,arg2,...]): code 二.示例 #!/usr/bin/python #coding:utf8 #coding=utf8 #encod ...

  6. 对Python中函数参数类型及排序问题,三个方面的总结

    Python中函数的参数问题有点复杂,主要是因为参数类型问题导致的情况比较多,下面来分析一下. 参数类型:缺省参数,关键字参数,不定长位置参数,不定长关键字参数. 其实总共可以分为 位置参数和关键字参 ...

  7. Python【第三课】 函数基础

    本篇内容 函数基本语法及特性 嵌套函数 递归函数 匿名函数 高阶函数 内置函数 1.函数的基本语法及特性 1.1 函数概念 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提 ...

  8. 学以致用三十二-----python中函数的括号使用

    一直以来对python中函数括号的使用,有点分不清楚,到底什么时候用括号,什么时候不用括号,造成了很大看困惑. 今天来总结下. class aaa(): y = 'you' def __init__( ...

  9. Python虚拟机函数机制之参数类别(三)

    参数类别 我们在Python虚拟机函数机制之无参调用(一)和Python虚拟机函数机制之名字空间(二)这两个章节中,分别PyFunctionObject对象和函数执行时的名字空间.本章,我们来剖析一下 ...

  10. python函数知识六 内置函数二、匿名函数与内置函数三(重要)

    19.内置函数二 abs():绝对值 lst = [1,2,-3,1,2,-5] print([abs(i) for i in lst]) enumerate("可迭代对象",&q ...

随机推荐

  1. 源码分析篇 - Android绘制流程(三)requestLayout()与invalidate()流程及Choroegrapher类分析

    本文主要探讨能够触发performTraversals()执行的invalidate().postInvalidate()和requestLayout()方法的流程.在调用这三个方法到最后执行到per ...

  2. sql查询其他服务器数据库表

    exec sp_addlinkedserver 'abc', '', 'SQLOLEDB', '192.168.49.34' exec sp_addlinkedsrvlogin ' go --查询 s ...

  3. google 被墙的解决办法

    昨晚无意中发现的东西,分享给各位使用,google搜索技术方面的东西还是很准确的,可惜被墙了,但是上有政策下有对策…… 谷歌地址: http://74.125.224.18/ http://91.21 ...

  4. java web 答辩总结

    今天我们组答辩.在昨天前三个组答辩之后,整理了一些试题. 在这个项目的答辩准备:首先把这个java web这本书大概的看了一遍:对整理的那些试题也把答案整理出来了:针对老师提问频率较高的试题:针对自己 ...

  5. 各大语言性能对比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. ...

  6. C# WebApi 中设置Session可用

    在Global.acax中,添加下面方法 //设置session可用 public override void Init() { PostAuthenticateRequest += MvcAppli ...

  7. 第15课-数据库开发及ado.net-数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库

    第15课-数据库开发及ado.net 数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库 1.  学习方法 2.  多涨见识 3.  比自己强的人一起,学习更强:比自己更聪明的人 ...

  8. [EWS]查找 文件夹

    摘要 有时在操作exchange的时候,需要查找用户exchange文件夹,比如用户新建了一些文件夹. 一个例子 这里以查找用户outlook邮箱中的历史对话文件夹为例. private const ...

  9. Java ArrayList 数组之间相互转换

    做研发的朋友都知道,在项目开发中经常会碰到list与数组类型之间的相互转换,本文通过一个简单的例子给大家讲解具有转换过程. package test.test1; import java.util.A ...

  10. Java JDBC的基础知识(二)

    在我的上一篇Java JDBC的基础知识(一)中,最后演示的代码在关闭资源的时候,仅仅用了try/catch语句,这里是有很大的隐患的.在程序创建连接之后,如果不进行关闭,会消耗更多的资源.创建连接之 ...