函数可以说程序语言中极为重要的一块了,可以大幅度减少代码量,使代码变得简洁明了。让主程序的逻辑清晰。后面会学到的装饰器也是通过函数功能实现的,装饰器可以给函数添加新的功能,这就让函数变得可优化、扩展。这是一个初学者学习函数的心得。深感学习进度缓慢,学习时间不够,难受。
函数的定义
函数的定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。
特性:
1. 减少重复代码
2. 使得程序变得可扩展
3. 使程序变得易维护
'''形式1''' def test0(x):#函数名(形参)(如果不调用函数则不占用内存空间的参数)。统一叫位置参数 "your function definition(文档描述)" x+=1#代码块 return x#可以返回多个值,返回出一个元组出来(里面包含多个值),可以返回函数或者过程(此时返回的是函数或过程的地址) '''形式2''' def test1():#不传入参数,只执行一段代码。 "test1" print('in the testing1') return 0#也可以不返回值 print('fuck off')#这段代码不执行,因为在return后面。
函数参数的传入
'''形式1''' def test3(x,y): 'testing3' print(x) print(y) test(1,2) #与形参一一对应,称为位置参数。 test(y=2,x=1) #与形参顺序无关,称为关键参数 #注意:关键参数必须放在位置参数之后,否则容易报错。 '''形式2''' def test(*args): #若实参数目不固定,用*表示接受参数不固定。接受N个位置参数,转换成元组形式。 print(args) print(test(1,2,3,4,5,6))#输出元组(1,2,3,4,5,6,7) print(test([1,2,3,4,5,6,7])) #输出一个([1,2,3,4,5,6,7]) '''形式3''' def test2(**kwargs):#接受N个key-value形式个关键字参数,转换成字典形式 print(1,kwargs) print(2,kwargs['name']) print(3,kwargs['age']) print(4,kwargs['sex']) test2(name='negu',age=22,sex='male') #可以和位置参数,关键字参数,默认参数联用 输出:1 {'name': 'negu', 'age': 22, 'sex': 'male'} 2 negu 3 22 4 male '''例子''' def test3(name,age=22,*args,**kwargs):#位置参数不能写在某关键字参数后面 print('name=',name) print('args=',args) print('age=',age) print('kwargs=',kwargs) print('hobby=',kwargs['hobby']) print('args=',args) logger('test3') test3('negu',22,'haha','hehe','bibi',sex='male',hobby='python')#age可用位置或关键字参数方式赋值
局部变量
局部变量在定义局部变量的子程序(函数)中局部变量起作用,在其他地方全局变量起作用。
def change_name(name):#可以改全局变量school,前面加上一个global school(少用,用了容易导致程序混乱) school = "mage linux" print("before change",name,school)输出:before change Xiada mage linux name = 'NEGU' #这个函数就是这个变量的作用域,这就叫局部变量 print('after change is %s'%name)#输出after change is NEGU name = 'negu' change_name('Xiada') print(school)#学校还是iue,全局变量。 print(name) #还是negu没有改变,因为name只是一个局部变量只在函数里生效。
高阶函数
高阶函数的定义:在某个函数中若输入函数参数或者返回函数参数则是高阶函数。
def add(a,b,f): return f(a)+f(b) res=add(3,-6,abs)#abs为内置函数,取绝对值 print(res)#输出9
匿名函数
#这段代码 def calc(n): return n**n print(calc(10)) #换成匿名函数 calc = lambda n:n**n print(calc(10)) #匿名函数可以和filter、map、functools.reduce联用
递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归特性: 1. 要有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模比上次递归都应该有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
def calc(n): print(n) if int(n/2) > 0 : return calc((int(n/2))) calc(10) 输出为: 10 5 2 1