python3.x 基础三:函数
1.OOP 面向对象编程,万物皆对象,以class为主,抽象化
2.POP 面向过程变成,万事皆过程,def定义过程
3.函数式编程,将某种功能封装起来,用的时候直接调用函数名,def定义函数,也叫function/方法/过程/子程序
函数定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需要调用其函数名即可 --Alex
特性:
- 减少重复代码
- 使程序变得可扩展
- 使程序变得易维护
语法定义:
def 函数名(): 函数执行语句
- 不带参数的函数调用
>>> def func_name1(): ... print("hello world") ... >>> func_name1() hello world
- 带1个参数的函数调用
>>> def func_name1(name): ... print("my name is :",name) ... >>> func_name1('alex') my name is : alex >>> name = 'oldboy' >>> func_name1(name) my name is : oldboy >>>
- 带2个参数的函数调用
- def定义函数的时候,括号里面的变量叫形参,引用内存空间
- 调用函数的时候,括号里面的变量叫实参,内存数据
- 形如(variable1,variable2),叫位置参数
- 形如(variable1=value1,variable2=value2),叫关键字参数
- 关键字参数一定要在位置参数后面
- 没特别指明,形参和实参必须一一对应,多一个少一个都报错
>>> def func_name2(a,b): ... c=a*b ... print(c) ... >>> func_name2(2,3) 6 >>> x,y=5,5 >>> func_name2(x,y) 25 >>> func_name2(a=2,b=3) 6 >>> func_name2(a=2,5) File "<stdin>", line 1 SyntaxError: positional argument follows keyword argument >>> func_name2(2,b=5) 10
>>> func_name2(a=2,b=3,c=4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: func_name2() got an unexpected keyword argument 'c'
>>> func_name2(a=2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: func_name2() missing 1 required positional argument: 'b'
- 函数返回值,遇到return语句将结束函数
>>> def with_return(a,b): ... return(a * b) ... return(a + b) ... >>> def without_return(a,b): ... print(a*b) ... print(a+b) ... >>> with_return(2,3) 6 >>> without_return(2,3) 6 5 >>> x=with_return(2,3) >>> print(x) 6 >>> y= without_return(2,3) 6 5 >>> print(y) None >>>
- 全局变量与局部变量
- 函数体外定义的变量称为全局变量,在函数体内也生效,前提是先定义全局变量,后定义函数
- 函数体内定义的变量称为局部变量,只在当前函数体内生效
name,age = 'alex',18 print(name,age) def func_name0(): name = 'oldboy' age = 100 print(name,age) print(age+1) func_name0() print(name,age) alex 18 oldboy 100 101 alex 18
- 非固定参数,当传入的参数不确定个数的时候
- 非固定参数*args,传入的参数变成元组,元组可为空
- 非固定参数**kwargs,传入的参数变成字典,
- *args与**kwargs可同时使用
>>> def func_name5(name,age,*args): ... print(name,age,args) ... >>> func_name5('alex',18) alex 18 () >>> func_name5('alex',18,'oldboy') alex 18 ('oldboy',) >>> func_name5('alex',18,'oldboy',100) alex 18 ('oldboy', 100) >>> func_name5('alex',18,'oldboy',100,[1,2]) alex 18 ('oldboy', 100, [1, 2]) >>> func_name5('alex',18,'oldboy',100,[1,2],{'key1':'v1','k2':'v2'}) alex 18 ('oldboy', 100, [1, 2], {'key1': 'v1', 'k2': 'v2'})
>>> def func_name6(name,age,**kwargs): ... print(name,age,kwargs) ... >>> func_name6('alex',18) alex 18 {} >>> func_name6('alex',18,'oldboy') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: func_name6() takes 2 positional arguments but 3 were given >>> func_name6('alex',18,oldboy=100) alex 18 {'oldboy': 100} >>> func_name6('alex',18,oldboy=100,salary=1,address='beijing') alex 18 {'address': 'beijing', 'salary': 1, 'oldboy': 100}
>>> def func_name7(name,age,*args,**kwargs): ... print(name,age,args,kwargs) ... >>> func_name7('yzw',28,18,'man',address='guanghzou',mail='xxx@com.cn') yzw 28 (18, 'man') {'address': 'guanghzou', 'mail': 'xxx@com.cn'} >>> func_name7('zvy',18) zvy 18 () {}
- 嵌套函数,函数中调用函数,但是只能调用同级的函数,不能隔级调用
- 递归函数
- 必须有一个明确的结束条件
- 每递归一次,问题规模比上一次都应有减少
- 效率不高,下面这个越到后面效率越低
>>> list1=[0,1] >>> for i in range(2,10): ... list1.append(list1[i-1]+list1[i-2]) ... >>> print(list1) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] >>> def func_fib(x): ... if x == 0: ... return 0 ... elif x == 1 or x == 2: ... return 1 ... return func_fib(x-1)+func_fib(x-2) ... >>> func_fib(10) 55
- 匿名函数--link:
- 高阶函数,变量指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
>>> def func_high(a,b,f): ... return f(a),f(b) ... >>> num1=10 >>> str1='hello' >>> func_high(num1,str1,id) (10911456, 140199339463320)