day15
chaos not is a pit,
前方高能---- 内置函数二
1.lambda匿名函数
2.sorted()
3.filter()
4.map()
5.递归函数
一. lambda匿名函数
为了解决一些简单的需求而设计的一句话函数.
# 计算n的n次方 def func(n): return n * n print(func(10)) f = lambda n: n **n print(f(10))
lambda 表示的是匿名函数,不需要用def来声明,一句话就可以声明出一个函数.
语法:
函数名 = lambda 参数 : 返回值
注意:
1.函数的参数可以有多个,多个参数之间用逗号隔开.
2. 匿名函数不管多复杂,只能写一行,且逻辑结束后直接返回数据.
3. 返回值和正常的函数一样,可以是任意数据类型.
匿名函数并不是说一定没有名字,这里前面的变量就是一个函数名,说他是匿名原因是我们通过__name__查看的时候是没有名字的,统一都叫lambda.在调用的时候没有什么特别之处,像正常的函数调用即可.
二 . sorted()
排序函数.
语法: sorted(iterable , key = None, reverse = False)
Iterable : 可迭代对象.
key : 排序规则(排序函数),在sorted内部会将可迭代对象中的每一个元素传递给这个函数的参数,根据函数运算的结果进行排序.
reverse : 是否倒序, True : 倒序, False : 正序
lst = [1,5,3,4,6] lst2 = sorted(lst) print(lst) # 原列表不会改变 print(lst2) # 返回的新列表是经过排序的. dic = {1:'A',3:'C',2:'B'} print(sorted(dic)) # 如果是字典,则返回排序过后的key
和函数混合使用.
# 根据字符串长度进行排序 lst = ['求求','恶恶恶','打打打打','啊','旺旺'] # 计算字符串的长度 def func(s): return len(s) print(sorted(lst,key=func))
和lambda组合使用.
# 根据字符串长度进行排序 lst = ['求求','嗯嗯','恶','踩踩踩踩踩'] # 根据字符串长度 def func(s): return len(s) print(sorted(lst,key=lambda s : len(s))) lst = [ {"id":1, "name":'alex', "age":18}, {"id":2, "name":'wusir', "age":16}, {"id":3, "name":'taibai', "age":17}] # 按照年龄对学生信息进行排序 print(sorted(lst,key= lambda el : el['age']))
三 . filter()
筛选函数
语法 : filter(function, Iterable)
function: 用来筛选的函数,在filter中会自动的把iterable中的元素传递给function,然后根据function返回的True或者False来判断是否保留此项数据.
Iterable: 可迭代对象.
lst = [1,2,3,4,5,6] ll = filter(lambda x : x %2 == 0 ,lst) # 筛选所有的偶数 print(ll) print(list(ll))
lst = [{"id":1, "name":'alex', "age":18}, {"id":2, "name":'wusir', "age":16}, {"id":3, "name":'taibai', "age":17}] f = filter(lambda el : el['age'] > 16 ,lst) #筛选年龄大于16的数据 print(list(f))
四.map()
映射函数
语法:map(function , iterable) 可以对可迭代对象中的每一个元素进行映射,分别去执行function.
计算列表中的每个元素的平方,返回新列表.
def func(e): return e*e mp = map(func,[1,2,3,4,5]) print(mp) print(list(mp))
改变成lambda
print(list(map(lambda x : x*x,[1,2,3,4,5])))
计算两个列表中相同的位置的数据的和.
l1 = [1,2,3,4,5] l2 = [5,6,7,8,9] print(list(map(lambda x,y:x+y,l1,l2)))
五. 递归
在函数中调用函数本身,就是递归.
def func(): print('我是谁,') func() func()
在python中,递归的深度最大到998
count = 0 def func(): global count print('你是谁啊',count) count += 1 func() func()
递归的应用:
文件夹系统.使用递归遍历该文件夹中的所有文件.
import os def func(filepath,n): files = os.listdir(filepath) # 获取到当前文件夹中的所有文件 for file in files: # 遍历文件夹中的文件,这里获取的这是本层文件名 fi_d = os.path.join(filepath,file) #加入文件夹,获取到文件夹+文件 if os.path.isdir(fi_d): #如果该路径下的文件是文件夹 print('\t'*n,file) func(fi_d,n+1) # 继续进行相同的操作 else: print('\t'*n,file) # 递归出口,最终在这里隐含着return # 递归遍历目录下所有文件 func('f:/15全栈知识点',0)
六. 二分查找
二分查找,每次能够排除掉一半的数据,查找的效率非常高,但是局限性比较大,必须是有序序列才可以使用二分查找.
要求: 查找的序列必须是有序序列.
# 判断n是否在lst中出现,如果出现请返回n所在的位置 # 二分查找 ---- 非递归算法 lst = [22,33,44,55,66,77,313,5555,67899] n = 567 left = 0 right = len(lst) - 1 count = 1 while left <= right: middle = (left+right) // 2 if n < lst[middle]: right = middle -1 elif n > lst[middle]: left = middle + 1 else: print(count) print(middle) break count = count + 1 else: print('不存在')