函数:函数是指将一组语句的集合通过一个名字(函数名)封装起来。要想执行这个函数,只需调用其函数名即可。
特性:
1.减少重复代码
2.程序变得可扩展
3.程序变得易维护
----------------------------------
1.1.参数:
1.形参 2.实参 3.位置参数 4.默认参数:必须放在位置参数后面 - 形参 5.关键参数:必须放到位置参数后面 - 实参 6.非固定参数--元组形式的 7.非固定参数--字典形式的 def fun1(x,*args,**kwargs): print(x,args,kwargs) fun1(2,3,4,5,name='alice',age=12) fun1(2,*(3,4,5),name='alice',age=12) 2 (3, 4, 5) {'name': 'alice', 'age': 12}
1.2.返回值:
未指定 返回 None return x return x,y 默认返回一个元组(x,y) return (x,y) (x,y) return [x,y] [x,y]
----------------------------------
2.局部变量 全局变量
1 age = 12 2 def fun1(x,y): 3 # global age 4 age = 13 5 return age, x+y 6 7 def func2(): 8 print(age) 9 10 res = fun1(1,2) 11 print(res) 12 13 name = (1,2,3,[2,3]) 14 def fun1(): 15 name[3][0]=33 16 print(name) 17 18 fun1() 19 print(name) 20 (1, 2, 3, [33, 3]) 21 (1, 2, 3, [33, 3])
总结:局部不能修改全局变量,除非加上global
全局变量如果是列表,字典,元组里面包含列表,整体不能修改,但是单个元素可修改
函数调用是在内存的栈中,先进后出,函数调用完毕,自动释放内存
堆栈参考:http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html
----------------------------------
3.嵌套函数:
函数内部可以再次定义函数
执行需要被调用
4.作用域:
python中一个函数就是一个作用域(JavaScript),局部变量放置在其作用域中
代码定义完成后,作用域已经生成,作用域链向上查找,函数名是可以当成返回值的
5.匿名函数:
作用: 1.节省代码量 2.看着高级
1 z = lambda x,y:x*y 2 print(z,z(2,3)) 3 4 z = lambda x, y: x*y if x < y else x/y 5 print(z, z(10, 2)) 6 7 data = list(range(10)) 8 print(data) 9 print(list(map(lambda x: x*x, data))) 10 11 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 12 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
6.高阶函数:
满足任意一个条件,即是高阶函数: 1.接受一个或多个函数作为输入 2.return返回另外一个函数
1 def func(x,y): 2 return x+y 3 4 def calc(x): 5 return x 6 7 f = calc(func) 8 print(f(2,3))
----------------------------------
7.递归:
用途:函数里面自己调用自己,不知道什么时候能结束这个循环,循环不用for while,用函数实现循环 特点:函数里面自己调用自己;递归执行过程一层一层进,一层一层出。
1 def calc(n): 2 n = int(n /2) 3 if n > 0: 4 return calc(n) 5 else: 6 return n 7 8 print(calc(10)) 9 10 def calc(n,count): 11 print(n,count) 12 if count < 5: 13 return calc(n/2,count+1) 14 else: 15 return n 16 17 res = calc(188,1) 18 print('res=',res) 19 20 188 1 21 94.0 2 22 47.0 3 23 23.5 4 24 11.75 5 25 res= 11.75
递归总结:
1.必须有一个明确的结束条件
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈stack这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧,由于栈的大小不是无限的,所以,递归调用的过多,会导致栈溢出。)