1.lamda匿名函数
为了解决一些简单需求而设计的一句话函数
# 求n的平方
#第一种方法:
def func(n):
return n * n
print(func(4)) #16
#第二种方法:
a = lambda n: n * n
print(a(4)) #16
语法: 函数名=lamda参数:返回值 匿名函数不需要特殊声明,一句话就可以生成一个函数
注意:1匿名函数可以使用多个参数,每个参数要用逗号隔开
2匿名函数不管多复杂,只能写一行,且逻辑结束后直接返回值
3返回值和普通函数一样,可以是任意数据类型
匿名函数并不是没有名字,通过__name__查询统一显示的是lamda,调用时跟普通函数一样

应用:和函数组合使用
2 sorrted排序函数
语法:sorted(iterable,key=None,reverse=False) # iterable:可迭代对象 key:排序规则,在sorted内部会将可迭代对象的每一个元素传递给这个函数的参数,根据函数运行结果进行排序.
# reverse:是否倒序 True:是,False:否
lst=[1,5,3,7,6,9,2]
lst1=sorted(lst)
print(lst)# [1, 5, 3, 7, 6, 9, 2] 原列表不会改变
print(lst1)#[1, 2, 3, 5, 6, 7, 9] 排序后的内容给了新列表
dic={1:'A',2:'B',3:'C'}
print(sorted(dic))# [1, 2, 3] 返回的是排序后的key值
应用:1与函数组合使用;特别注意key值调用函数没有()
# 对列表中的内容按照长度排序
lst=['山本五十六','渡边','索尼爱立信','一本道','馋'] def func(el): return len(el) print(sorted(lst,key=func)) # ['馋', '渡边', '一本道', '山本五十六', '索尼爱立信']
2与lamda组合使用
按照年龄排序
dic=[{'name':'zhao','age':18},{'name':'qian','age':8}, {'name':'sun','age':38},{'name':'li','age':28}] print(sorted(dic,key=lambda a:a['age'])) #打印结果为[{'name': 'qian', 'age': 8}, {'name': 'zhao', 'age': 18}, {'name': 'li', 'age': 28}, {'name': 'sun', 'age': 38}
3 filter筛选函数
语法:filter(function,iterable) #function:用来筛选的函数,在filter中会自动把可迭代对象中的元素传递给function,然后根据function返回的True或者False来判断是否保留这项数据,True:保留 iter:可迭代对象
筛选年龄大于20的
lst=[{1:'名字','2':18},{1:'韩天宇','2':25},{1:'罗永浩','2':42}] print(filter(lambda a:a['2'],lst))# <filter object at 0x000001DC35DC8978> print(list(filter(lambda a:a['2']>20,lst)))#[{1: '名字', '2': 18}, {1: '韩天宇', '2': 25}, {1: '罗永浩', '2': 42}]
4 map映射函数
语法:map(function,iterable) 对可迭代对象中的每一个元素进行映射,分别去执行function
计算多个数的平方
def func(n):
return n**2
mp=map(func,[2,3,4])
print(mp)#<map object at 0x000001EDF0C989B0>
print(list(mp))#[4, 9, 16]
计算多个数平方(lamda方式) print(list(map(lambda a:a**2,[2,4,6])))#[4, 16, 36]
# 计算两个列表中相同位置的数的和 lst=[1,2,3,4,5] lst1=[3,6,98,45,78] print(list(map(lambda x,y:x+y,lst,lst1))) #[4, 8, 101, 49, 83]
5 递归:在函数中调用函数
def func():
print('哈哈')
func()
func() #死循环 ,循环深度最大为1000
我们可以使用递归来遍历各种树形结构, 比如我们的文件夹系统. 可以使用递归来遍历该文件夹中的所有文件
import os
def read(filepath,n):
files=os.listdir(filepath) #获取到当前文件夹中的所有文件
for fi in files: #遍历文件夹中的文件,这里获取的只是本层文件名
fi_d=os.path.join(filepath,fi) #加入文件夹 获取到文件夹+文件
if os.path.isdir(fi_d): #如果该路径下的文件是文件夹
print(" "*n,fi)
read(fi_d,n+1) # 继续进行相同的操作
else:
print(" "*n,fi) #递归出口,最终在这里隐含着return
read('d:/财哥',0) #递归遍历目录下的文件
6二分法
二分查找:每次砍掉一般的数据,查找效率比较高,但是必须是有序数列.
func(n, left, right):
if left <= right: # 边界 左边界小于等于右边界
mid = (left + right)//2 #中间值 地板除
if n > lst[mid]: #如果数据n大于中间值
left = mid + 1# 左边界挪到中间+1的位置,相当于缩小一半位置
return func(n, left, right) # 递归 递归的入口
elif n < lst[mid]:#如果数据n小于中间值
right = mid - 1#右边界挪到中间位置-1
# 深坑. 函数的返回值返回给调用者
return func(n, left, right) # 递归
elif n == lst[mid]: #如果n==中间值
print("找到了")
return mid
# return # 通过return返回. 终止递归
else:
print("没有这个数") # 递归的出口
return -1 # 1, 索引+ 2, 什么都不返回, None
# 找66, 左边界:0, 右边界是:len(lst) - 1
ret = func(66, 0, len(lst) - 1)
print(ret) # 不是None