1. 函数基本语法及特性
封装成函数的好处:
- 减少重复代码
- 可扩展(具有一致性)
- 易维护
#函数定义 def func1(): """testing""" #文档介绍 print("in the func1") #操作 return 0 #返回值
2. 函数参数与局部变量
2.1 位置参数、默认参数、关键参数
默认参数的应用:
- 软件一键安装(默认勾选)
- 连接数据库的端口号
函数调用:
- 位置调用:与形参一一对应
- 关键字调用:与形参顺序无关(关键参数只能写在位置参数后面)
#位置参数 stu_register("王山炮",22,"CN","python_devops") #一一对应 #默认参数 def stu_register(name,age,course,country="CN"): #关键参数(只能放在位置参数之后) stu_register(age=22,name='alex',course="python",)
2.2 非固定参数
非固定参数的应用
- 以防以后出现另外的参数,给其留个位置
- 参数个数很多时,用非固定参数
实参不固定时,如何定义形参:参数组。主要有两种方式:
- 位置参数类:用*args形成元组
- 关键字参数类:用**kwargs形成字典
#加入非固定参数后,几种参数混合使用 def test3(name, *args, age = 24, **kwargs): print(name) print(age) print(args) print(kwargs) ''' #**kwargs:接收关键字参数,转换成字典 #*args:接收位置参数,转换成元组,不能接收关键字参数 ''' test3('zhuyijun','man', sex = 'm', hobby = 'piano', age = 18) #默认参数可赋可不赋值 '''结果如下: zhuyijun 18 ('man',) {'sex': 'm', 'hobby': 'piano'} '''
2.3 局部变量
在子程序(函数)内定义的变量称为局部变量。局部变量也称为形参,只有在函数内部有效。可以这么理解,每一个函数,接受到的是传过来的复制品,返回后就销毁了,毕竟不是地址。
形参理解:
- 函数内部不能修改:字符串、整数
- 函数内部可以修改:列表、字典、元组(本来就不能改)、集合、类(以后学)
如果非要在函数内部修改全局变量:在函数内部定义:global 变量名 ----->不过,不要用!
3. 返回值
函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束
- 返回数=0:返回None
- 返回数=1:返回objcet
- 返回数>1:返回tuple ----->其实类似超市买一大堆,然后大袋子(元组),就一个
为什么要有返回值:我想要函数执行的结果,根据这个结果继续接下来的操作(比如True、False)
#返回多个值 def many(): print('many') return 1, 'hello', ['alex', 'wupei'], {'name': 'zhu'} str = many() print(str) '''结果 many (1, 'hello', ['alex', 'wupei'], {'name': 'zhu'}) '''
4. 递归、高阶
4.1 递归
定义:一个函数在内部调用自身本身
特性:
- 必须有一个明确结束条件
- 每深一层,问题规模应有所减少
- 效率不高(递归调用的次数过多,会导致栈溢出)
递归函数实际应用案例,二分查找
#一直除2 def calc(n): print(n) if int(n/2) > 0: return calc(int(n/2)) print("->", n) calc(10)
4.2 高阶函数
#高阶函数(用得不多) def add(a, b, f): #把函数当参数传进去 return f(a) + f(b) res = add(3, -6, abs) print(res)
5. 函数式编程
- 面向对象:--->类--->class ---->当前最火
- 面向过程:--->过程--->def --->把一段段过程串起来
- 函数式编程:--->函数--->def --->很早就出来了,不过最近几年又开始热了
过程,就是没有返回值的函数而已。在python中,过程也给了返回值None
#函数与过程的区别 #函数 def func1(): """testing""" #文档介绍 print("in the func1") return 0 #过程 def func2(): '''testing''' print('in the func2') x = func1() y = func2()
- 数学里的函数:输入确定,输出就确定; ----->函数式编程
- 编程:输入确定,输出不一定,比如内部有逻辑运算。python
因此,python不是完全的函数式编程
注:函数式编程和编写函数不一样!函数式编程必须输出完全确定。