• 匿名函数,二分查找


    ---恢复内容开始---

    一.lamda匿名函数:

    语法:函数名 = lambda 参数:返回值

    def func(n):
        return n*n
    print(func(10))
    
    f = lambda n:n*n  #匿名函数
    print(f(10))

    lambda表示的是匿名函数,不需要def来声明,一句话就可以声明出一个函数.

    注意:

      1.函数的参数可以是多个,多个参数之间用逗号隔开,

      2,匿名函数不管多复杂,只能写一行,且逻辑结束后直接返回数据

      3.返回值和正常的函数一样,可以是任意数据类型

    ps:__name__ 查看函数名:

    def func(n):
        return n*n
    a = func
    print(a(5))
    print(a.__name__)
    结果:25
        func  #函数的函数名是func
    
    f = lambda n :n*n
    print(f(5))
    print(f.__name__)
    结果:25
        <lambda> #函数的函数名   

    匿名函数其实是有名字,只是所有的函数名是lambda

    二.sorted()

      排序函数

      语法:sorted(Iterable,key=None,reverse = False)

       Iterable:可迭代对象

         key:排序规则,在sort内部会将可迭代对象中的每一个元素传递给这个数的参数,根据函数运算的结果进行排序.

       reverse:是否是倒叙,True:倒叙,False:正序 不写默认False

    lst = [4,7,2,88,34,28,33,1]
    lst1 = sorted(lst)
    print(lst) #原列表不会变
    print(lst1) #返回的新列表是经过排序的

      和函数组合使用,自己定义规则

    lst = ["大阳哥a", "尼古拉斯aa", "赵四aaa", "刘能a", "广坤aaaaaa", "谢大脚a"]
    def func(s):
        return s.count('a') #返回数字  根据a的个数排序
    ls = sorted(lst,key = func)
    print(ls)

      和lambda组合使用

    lst = ["大阳哥a", "尼古拉斯aa", "赵四aaa", "刘能a", "广坤aaaaaa", "谢大脚a"]
    ls = sorted(lst,key = lambda s:s.count('a'))
    print(ls)
    lst = [
            {'id':1, 'name':'alex', 'age':18},
            {'id':2, 'name':'taibai', 'age':58},
            {'id':3, 'name':'wusir', 'age':38},
            {'id':4, 'name':'ritian', 'age':48},
            {'id':5, 'name':'女神', 'age':18}
           ]
    
    ls = sorted(lst,key=lambda dic:dic['age'],reverse = True)
    print(ls)
    例2

    三.filter()

      筛选函数

      语法:filter(function,Iterable)

         function:用来筛选的函数,在fifter中会自动的把iterable中的元素传递给function,然后根据function返回的True或False来判断是否保留此项数据

        Iterable:可迭代对象

    lst = [1,2,3,4,5,6,7,8,9]
    ls = filter(lambda a:a%2==0,lst) #出来的ls是迭代器, 筛选左右的偶数
    print(list(ls)) #筛选出来的元素放到列表里
    结果:[2, 4, 6, 8]
    print('__iter__'in dir(ls)) #True
    print('__next__'in dir(ls)) #True
    lst = [
            {'id':1, 'name':'alex', 'age':18},
            {'id':2, 'name':'taibai', 'age':58},
            {'id':3, 'name':'wusir', 'age':38},
            {'id':4, 'name':'ritian', 'age':48},
            {'id':5, 'name':'女神', 'age':18}
           ]
    ls = filter(lambda dic:dic['age']>40,lst)
    print(list(ls))
    结果:[{'age': 58, 'name': 'taibai', 'id': 2}, {'age': 48, 'name': 'ritian', 'id': 4}]
    筛选年龄大于40的人

    四.map()

      映射函数

      语法:map(funtion,iterable)可以对可迭代带对象中的每一个元素进行映射,分别去执行function

      计算列表中的每个元素的平方,返回新列表

    lst = [1,3,4,5,6,7]
    print(list(map(lambda n:n*n,lst))) #lst可以用切片分割,一块一块执行(用于大量数据时)
    结果:[1, 9, 16, 25, 36, 49]
    lst1 = [ 1, 2, 3, 4, 5]
    lst2 = [ 2, 4, 6, 8]
    print(list(map(lambda x, y:x+y, lst1, lst2))) # 如果函数中有多个参数. 后面对应的列表要一一对应

    五.递归:

      在函数中调用函数本身,就是递归

    def func()
        print('我是谁')
        func()
    func()

    在python中递归的深度最大是998

    递归是应用:

      可以使用递归来遍历各种树形结构,比如文件夹系统,可以使用递归来遍历改文件夹中的所有文件

    import os
    filePath = 'E:python-practice'
    def read(filePath,n):
        it = os.listdir(filePath) #获取到当前文件夹中的所有文件
        for el in it:#遍历文件夹中的文件,这里获取的只是本层文件名
            fp = os.path.join(filePath,el)  #加入文件夹,获取到文件夹+文件
            if os.path.isdir(fp):#如果该路径下的文件时文件夹
                print('	'*n,el)
                read(fp,n+1) #继续进行相同的操作
            else:
                print('	'*n,el) #递归出口,最终在这里隐含着return
    read(filePath,0)

    六.二分查找

    每次能够排除掉一半的数据,查找的效率非常高,但是局限性比较大,必须是有序序列才可以使用二分查找

    要求:查找的序列必须是有序序列

    # 判断n是否在lst中出现. 如果出现请返回n所在的位置
    # 二分查找---非递归算法
    lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789]
    left = 0
    right = len(lst)-1
    n  = int(input('数:'))
    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 +=1
    else: print('没有')
    #用普通递归二分法
    lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789]
    def func(n,left,right):
        if left <= right:
            middle = (left + right) // 2
            if n < lst[middle]:
                right = middle-1
            elif n>lst[middle]:
                left = middle+1
            else:
                return middle
            return func(n,left,right)
        else:
            return -1
    print(func(44,0,len(lst)-1))
    另类二分法,很难计算位置
    lst = [22, 33, 44, 55, 66, 77, 88, 99, 101, 238, 345, 456, 567, 678, 789]
    def func(lst,n):
        left = 0
        right = len(lst)-1
        middle = (left + right) // 2
        if right<=0:
            print('没有')
            return
        if n < lst[middle]:
            lst = lst[:middle]
        elif n > lst[middle]:
            lst = lst[middle+1:]
        else:
            print('在这里')
            return
        func(lst, n)
    func(lst,77)
  • 相关阅读:
    AJAX聊天室小DEMO(讨厌JS,IE下有问题已解决)
    [ZT]线索二叉树(C#数据结构五)
    栈(C#数据结构学习二)
    eclipse 安装 resin 3 步骤
    解决全局utf8编码下asp.net接收gb2312乱码的问题
    模板里的控件要用FindControl(id)方法读取
    OpenSessionInView
    asp:button控件调用js函数不刷新方法
    OFFICE 出现“正在配置”的解决方法
    开发经验
  • 原文地址:https://www.cnblogs.com/ITdong-1/p/9349686.html
Copyright © 2020-2023  润新知