您的位置:首页 > 编程语言 > Python开发

python04-函数的定义、调用与递归

2016-05-26 15:28 483 查看
一、 函数的定义

python的函数部分我觉得难点在与函数的参数,所以准备单独写关于参数的部分。而本文就写关于定义、调用以及函数的递归。

python中函数的定义格式为:

def  函数名(参数名, 参数名):


下面缩进后写函数内容。比如说写一个能返回我我自己名字的函数(不要说我自恋):

def re_name(name):
print(‘Sui Xiansen’)
return


对于函数体内的内容,说一下几点:

1.1 pass语句。

如果你想要函数什么也不执行,或者说还没想好函数体内改写什么,可以加一个pass语句,这可以让你的编译通过不出错。

def re_name():
pass


1.2 return的内容

可以不return东西回来,即return none或者是 return

可以return回两个值,甚至是多个,依次接收值就好了。这种机制的原理是:其实返回来的是一个tuple,只是把()省略了而已。举个例子:

def re_name(x,y):
return x,y


调用的时候: z,w=re_name(‘sui’,’sun’)

1.3 变量类型的限定

python函数在写变量的时候不像C一样要写明数据类型,所以如果你需要限定变量的数据类型,就需要在函数体内部加一个判断语句。

此处又用到了一个内置函数 isinstance(变量,数据类型) 返回布尔值。

比如说我的re_name()函数的变量要求只能是字符串,不能是其他数据类型,否则就提示错误。那么我应该这么写。

def re_name(name):
if not isinstance(name,str):
raise TypeError(‘数据类型不对啊哥们’)
else:
print(name)


然后当你调用的时候用了 re_name(2)就会出现以下提醒:



至于raise和TypeError的用法,以后再说呗。

二、 函数的调用

这一部分简直是没什么可说的,上面的实例中都演示过了。一个简单的问题提一下:

当我定义完re_name函数以后,写一句 asd=re_name 然后我使用asd(‘sui’)会不会有效呢?

结果当然是,有效的!

三、 递归函数

递归的意思就是函数的返回值还是返回用这个函数。举例就是:1+2+3+4+5+……+n

def sum_n(n):
if n==1:
return 1
return n+sum_n(n-1)


讲一个小故事,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

这就是汉诺塔的故事,一个经典的递归算法的例子。

假设三根柱子是A,B,C,需要将64个圆盘从A搬到C,那么需要以下这三个过程:

a) 把最上面的63个圆盘由A搬到B;

b) 将A剩下的那个最大的圆盘由A搬到C;

c) 将B上面的63个圆盘搬到C;

这样问题就转换成了“B上面的63个圆盘搬到C”,很显然,继续重复上面的三步就好了,直到最后n由64变为1,直接搬过去就好。

def hannuo_tower(n,’A’,’B’,’C’):
if n==1:
print(‘A’,’’,’C’)
else:
hannuo_tower(n-1,’A’,’C’,’B’)
hannuo_tower(1,’A’,’B’,’C’)
hannuo_tower(n-1,’B’,’A’,’C’)


python的实现过程如上所示,经过计算得到的结果表明移完这些金片需要5845.54亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python