python中函数部分简介与定义(二)
一 闭包函数:
在函数内部引用了外部函数的作用域里的函数名
二 装饰器:
开放封闭原则:对功能拓展,对修改封闭。
遵循两个选择:1.不改变源代码。2.不改变原函数的调用方式。
#装饰器模板
def outter(func): def warpper(*args,**kwargs): res = func(*args,**kwargs) return res return warpper
三 递归函数:
分为回溯和递归:
回溯:每次重复执行的过程是建立在下一次重复执行的基础上,然而重复的复杂度是逐渐降低的。直到有条件让循环结束。否则会无限递归。
递归:循坏执行下去后,在一次次的往回执行,直到有结果。
def count(n): if n == 1: #给一个结束的条件 return 22 return count(n-1) + 2 res = count(5) print(res)
总结递归函数:递归函数中必须要有个结束递归的条件,否则无限递归没有任何的意义。
四,匿名函数(lambda)
顾名思义就式无名函数,它有以下特点:
1.匿名函数的参数规则,作用域关系跟普通函数是一样的。
2.匿名函数的函数体是一个表达式,这个表达式还必须有个返回值。
3.匿名函数是临时存在的,用完就没了。
4.匿名函数不会单独使用,一般都和内置函数配合使用。
#下面就是匿名函数与内置函数的配合使用:
salary = {'andy':18768,
'tank':19872,
'egon':38461,
'jason':28632}
salary = sorted(salary,key= lambda x:salary[x],reverse=Ture) #求得从大到小排序, 匿名函数 lambda 与内置函数 sorted 搭配用
print(salary)
salary = max(salary,key= lambda x:salary[x]) #求得字典里最大值,匿名函数 lambda 与内置函数 max 搭配用
print(salary)
salary = min(salary,key= lambda x:salary[x]) #求得字典里最小的值,匿名函数 lambda 与内置函数 min 搭配
print(salary)
五,常用的内置函数
map(映射)与 lambda 结合使用:
l = [4,2,3,6,7,8]
res = map(lambda x:x**2,l) #这里返回的是个迭代器
print(list(res))
l = ['andy','jason','egon']
res = map(lambda x:x+'_nb',l)
print(list(res))
l = ['tank','egon','jason','andy']
res = map(lambda x:x+'_nr' if x == 'andy' else x+'_nb') #结合三元表达式一起
print(last(res))
reduce(合并)与 lambda 结合使用::在python2中还是内置函数,但是在python3中需要导入模块
from functools import reduce #导入模块,使用reduce
res = reduce(lambda x,y:x+y,range(1,889)) #用reduce和lambda 求得1到888的数之和,最后面的参数可以不用传值。
print(res)
l = ['my','name','is','haha'] #将列表中的字符串拼接在一起
res = reduce(lambda x,y:''+y+'',l)
print(res)
filter(剥离)与 lambda 结合使用::
l = ['lxx_sb','xx_nb','xy_sb'] res = filter(lambda x:x.endswith('sb'),l) #判断为真就会执行,是个迭代器 print(list(res))
l = [1,2,3,66,99,43]
res = filter(lambda x:x>=66,l)
print(list(res))
zip(拉链):
l = ['name','jason','andy'] l1 = ['1','2','4'] l2 = ['a','b'] print(list(zip(l,l1,l2))) #
六 三元表达式
固定的表达模式如下:变量1 if 条件 else变量2
如果满足条件执行变量1
否则执行变量2
x = 22 y = 18 res = x if x > y else y
print(res)
五 列表生成式
l = ['andy_n','ruby_x','tank_n','egon_x','jason_n'] res = [name for name in l if name.endswith('_n')] #将变量name, for循环后判断是否满足条件,如果满足则执行左边的变量name print(res) #['andy_n','tank_n',jason_n]
六 字典生成式
l = ['tank','andy','jason'] res = {i:j for i,j in enumerate(l,1) if j != 'andy'}
#用for循环在枚举后的列表中,当条件满足则执行左边的条件 print(res) #{1:'tank',3:'jason'}
七 算法之二分法
容器类型里的数字必须有大小顺序。
l = [1,2,3,4,5,6] def get1(l,number): if number not in l: print('None') l1 = l // 2 #将列表一分为二,获取中间的索引 if number > l[l1]: right = l[l1+1:] #获取列表右边的数字 get1(right,number) elif number < l[l1]: #获取列表左边的数字 left = l[0:l1] get1(left,number) else: print('number') get1(l,6)