1. lamda匿名函数
2. sorted()
3. filter()
4. map()
5. 递归函数
一 匿名函数(lambda) 函数名= lambda 参数: 返回值
简单算法 a+b
常规算法
def func(a,b): # return a+b # ret=func(1,2) # print(ret)
lambda算法
f=lambda a,b: a+b print(f(2,3))
又如:
# 计算n的n次⽅方
def func(n):
return n**n
print(func(10))
f = lambda n: n**n
print(f(10))
需要注意:
1. 函数的参数可以有多个. 多个参数之间⽤用逗号隔开
2. 匿匿名函数不管多复杂. 只能写⼀一⾏行行, 且逻辑结束后直接返回数据
3. 返回值和正常的函数⼀一样, 可以是任意数据类型
二 sorted (排序函数) sorted(iterable, key=func, reverse=True/False)
语法:sorted(Iterable, key=None, reverse=False) sorted(Iterable, key=None, reverse=False)
key: 排序规则(排序函数), 在sorted内部会将可迭代对象中的每一个元素传递给这个函
数的参数. 根据函数运算的结果进行排序(把可迭代对象中的每一个元素拿出来, 放到func中运行. 返回一个数字. 根据数字进行排序)
例子1
和lambda 使用
lst=['迪拉姆 ','十多个','所有的','撒','我的']
def func(name): # # return len(name) % 2 # a=sorted(lst,key=lambda:len(name)) # print(a)
按以下年龄进行排序
lst = [{"id": 1, "name": 'alex', "age": 18},
# {"id": 2, "name": 'wusir', "age": 16},
# {"id": 3, "name": 'taibai', "age": 17}]
# # # def func(dic):
# # # return dic['age']
# # # l1=sorted(lst,key=func) 配合函数用
print(l1)
l2=sorted(lst,key=lambda a:a['age']) ## 配合lambda用
print(l2)
和函数使用
# 根据字串长度进行排序
lst = ["麻花藤", "冈本次郎", "中央情报局", "狐仙"]
# 计算字符串串⻓长度
def func(s):
return len(s)
print(sorted(lst, key=func))
三 filter(筛选函数)
语法: filter(function. Iterable)
function: 用来筛选的函数. 在filter中会自动的把iterable中的元素传递给function. 然后
根据function返回的True或者False来判断是否保留留此项数据 (把可迭代对象中的每一个元素拿出来, 放到func中运行.返回True/False. 根据返回的True和False来决定这个数据是否保留)
Iterable: 可迭代对象
和 函数和 lambda使用:
lst=[11,22,15,26,56,19] def func(age): return age>18and age%2==0 f=filter(func,lst) # f=filter(lambda age:age>18 and age%2==0,lst) print(f) # # print("__iter__"in dir(f)) for i in f: print(i)
筛选年龄大于17的例子:
lst = [{"id": 1, "name": 'alex', "age": 18}, {"id": 2, "name": 'wusir', "age": 16}, {"id": 3, "name": 'taibai', "age": 17}] f=filter(lambda a:a['age']>=17,lst) # for i in f: # print(i) print(list(f))
四 map (映射函数)
语法: map(function, iterable)
可以对可迭代对象中的每一个元素进⾏行行映射. 分别取执行
function (把可迭代对象中的每一个元素拿出来, 放到func中运行.返回数据就是结果)
计算列表中每个元素乘2的值
lst=[1,2,5,6,9] # l1=[i**2 for i in lst] # print(l1) # f=map(lambda r:r*2,lst) #可以处理更复杂 # print(list(f))
计算两个列表相同位置的数据的和 # lst1 = [1, 2, 3, 4, 5] # lst2 = [2, 4, 6, 8, 10] # # print(list(map(lambda x, y: x + y , lst1, lst2)))
五 递归(在函数中调⽤用函数本⾝身. 就是递归) 越画越小的圈
ef func(): print("我叫李嘉诚") func() # 递归入口 func() # 调用函数
用递归实现1到100 import sys sys.setrecursionlimit(5000) #设置递归最大深度,一般不要改 def func(n): print(n) func(n+1) func(1) 结果为3222 #d递归深度官网给的为1000 但到不了1000 一般到997-998 原因
为正式启动递归前要占几个数
因递归可以来遍历各种树形结构,例如我们的文件夹系统,可以使用递归来遍历.
例子
import os # # def func(file_path,ceng): # lst= os.listdir(file_path)# 得到文件夹里所有的文件 # for file in lst: # 文件名 # #获取文件路径的全路经 # full_path=os.path.join(file_path,file) # if os.path.isdir(full_path): #判断这个路径是否是一个文件夹 # print(" "*ceng,file) # func(full_path,ceng+1) # else: # print(" "*ceng,file) # else: # return # # func("E:上课打包",0)
六 二分法查找:
前提: 有序. (必须是有序序列列.)
核心思想:掐头去尾取中间
例子
lst = [1,8,16,32,55,78,89,1,5,4,7,5,9,6,8,5,4,5,44,5,2,1,4,5,1] # lst=[1, 1, 1, 1, 2, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8, 9, 16, 32, 44, 55, 78, 89] lst1=sorted(lst) print(lst1) #无序例子 先排序 # 方法一 n=int(input("请输入一个数:")) left=0 right=len(lst1)-1 while left<=right: mid=(left+right)//2 # 索引只能是整数 所以地板除 if n>lst1[mid]: left=mid+1 elif n<lst1[mid]: right=mid-1 else: print("这个数在%s位置:" % mid) break else: print("你要找的数不再这")
方法二 递归 切片
递归的第一套方案
# def func(n, lst):
# left = 0
# right = len(lst) - 1
# if left <= right:
# mid = (left + right)//2
# if n > lst[mid]:
# new_lst = lst[mid+1:]
# return func(n, new_lst)
# elif n < lst[mid]:
# new_lst = lst[:mid]
# return func(n, new_lst)
# else:
# print("刚刚好, 在这里出现了")
# return True
# else:
# return False
#
# lst = [1, 1, 1, 1, 2, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 7, 8, 8, 9, 16, 32, 44, 55, 78, 89]
# ret = func(2, lst)
# print(ret)