python函数
python中函数有两种,一种是内置函数,一种是自定义函数。这里不晓得有没有大牛知道为什么内置函数可以直接调用,没见在哪里定义了。另外一种是自定义函数,函数的定义方式如下,关键字def后面跟空格,再跟函数名,参数,函数体,函数名的命名可以使用posix命名或者小驼峰命名,函数定义了,但是不会自发执行函数体中的内容,只有在程序中显示的调用了函数才会执行函数体中的内容。
定义函数
def func(params): #必须带:并且:后面必须为代码块,切代码块不能为空
pass
调用函数
func(needParams) #调用函数直接用函数的方法名即可,且当参数不是收集参数时,实参必填
函数中参数的作用域
对于全局变量,函数可以自行调用,但是函数内部的变量则只能在内部使用,除非定义成全局变量,globals()和locals()为 两个内置函数,调用他们会返回全局参数的字典和局部参数的字典。对于变量,没有做特殊定义,只能局部变量在局部和 其内部调用,总之是只能从里面访问外面不能从外面访问里面。例外:函数内部的变量可以用global声明成全局变量
函数中的参数:
·普通参数:就是一般的参数,可以根据位置来传参也可以通过关键字来传参
def commonArgs(name,age):pass
commonArgs('zhangsan',20) or commonArgs(name = 'lisi' ,20)
·默认参数:也叫关键字参数,在定义函数时候给参数一个默认的值,所以这个参数可以传参也可不传参,
def defaultArgs(name,age = 18):pass
defaultArgs('zhangsan') or defaultArgs('zhangsan',age = 20)
·收集参数:在不确定有多少个传入参数的时候可以使用收集参数,收集参数又分普通收集参数和关键字收集参数
def collectionCArgs(*args):pass #普通收集参数 def collectionDArgs(**args):pass #关键字收集参数
collectionCArgs() or collectionCArgs('1',1) collectionDArgs() or collectionDArgs(name ='1',age=2)
对于参数,用的最多的是混合使用,混合使用参数,一定是普通参数在前面,默认参数(关键字参数)在后面,当普通收集参数后面有普通参数时,给这个 普通参数传值一定要用关键字传值,
def egArgs(name,age,*args,hobby,sex='man',**othArgs,like = 'dodo'):pass
在这个函数中,前面都是普通参数,从sex参数后面都是关键字参数,顺序不能错,且给在收集参数后面的参数传值时一定要用关键字传值
egArgs('张三',18,1,2,'33',hobby='jump',height='180',like='toto')
递归函数:函数的自我调用,优点:代码逻辑清晰,更贴近逻辑 。缺点:消耗性能,
在python中,函数的递归不会导致程序崩溃,但是会抛出异常,python中限制了递归的深度,常见的递归有斐波拉契数列,二分查找算法,八皇后问题,汉诺塔问题,下面我就简单的写下汉诺塔的递归调用(伪代码),对于汉诺塔游戏有不清楚的可以自己去百度下怎么玩
设计原型:柱子A,柱子B,柱子C ,碟子 n(不确定的正整数)
把n个碟子从A -> C ,对于这样的问题,看起来很复杂,其实需要我们一层层的揭开就好理解了,就像高中数学,我们从一般推理出特殊,假定只有2个盘子,我们的做法是 A->B, A->C, B->C, 那么如果有三个盘子呢? 我们做法其实也三步 1:把A上的两个盘子移到b上,2:把A上的最后一个盘子移到C上,3:把B上的两个盘子移到C上,
那么现在假定有n个 def gameNuo(n,A,B,C): 要把n个盘子从A移动到C借助B
1:把n-1个盘子从A移动到B借助C gameNuo(n-1,A,C,B)
2:把A上的一个盘子移动到C上
3:把B上的n-1个盘子移动到C上借助A gameNuo(n-1,B,A,C) ,至此盘子移动完毕,随着n的减少,当n = 2时就按照已有的程序执行,这就是递归,根据特殊情况推出一般情况
def gameNuo(n,A,B,C):
if n == 1 :
print(A,'->',C)
gameNuo(n-1,A,C,B)
pring(A,'->',C)
gameNuo(n-1,B,A,C)