函数基础

函数:函数是指将一组语句的集合通过一个名字(函数名)封装起来。要想执行这个函数,只需调用其函数名即可。
特性:
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这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧,由于栈的大小不是无限的,所以,递归调用的过多,会导致栈溢出。)

原文地址:https://www.cnblogs.com/alice-bj/p/8449325.html