zoukankan      html  css  js  c++  java
  • python===lambda匿名函数===day15

    lambda  匿名函数  

      : 表达式   变量= lambda  参数 : 函数体(直接return 的内容)

            其中  当函数中有多个参数时,  参数中间用   ,    逗号隔开

      所有的匿名函数 的名字都叫 lambda   

        可以一行搞定一个函数  ,但是 不能完成复杂的函数操作

      e.g 

        def  func(n):                           变量  = lambda  : 函数体

          return  n+n        ====> 整个函数用匿名函数来写 ===>  a=  lambda x :  x+x 

        print(func(3))  ====>  6                         print(a(3))====>  6

    sortde()排序函数

      语法:  sorted(   可迭代对象  ,    key = 函数的排序规则    ,    reverse=True(倒序)(若不倒序就不写)    ) 

        排序规则 : 最后返回值必须是数字, 这样才有依据排序

      e.g   lst= [ '谢大脚'  ,  ' 刘能 '  ,   ' 尼古拉斯 ' ]

        l1=sorted( lst   ,   key=lambda  x  : len (x) ,     reverse = True ) # 按照元素长短来排序   ,   倒序

        print(l1)======> [ ' 尼古拉斯'  , ' 谢大脚'  , '刘能' ]

    filter()  筛选函数  ====>  结果出来是个迭代器   因此最后需要 用  list  括起来

      语法 :  li= filter ( 函数  ,  可迭代对象  )  

      e.g   def  f ( i ):

          return i % 2==1

        lst = [1,2,4,5,3,6]        ===>  l1= filter ( lambda  i : i%2==1,  lst)  

        l1= filter(f, lst)

        print(  list(  l1  )  )====>  [ 1, 5,3]               print(  list(  l1  )  )====>  [ 1, 5,3

    map()  ===>  出来也是一个1迭代器   也要用  list  括起来

      语法 :  map (  函数   ,   可迭代对象  )  

      e.g   

      lst1=[ 1,2,3,4,5]

      lst2=[5,4,3,2]

      print(list(map(lambda x , y :  x+y , lst1 lst2)))===> [ 6,6,6,6]   把可迭代对象中 相对应的每个元素的和  按照短的取值

    递归   

      自己调用自己 ,  最大的深度是 997 , 998 就爆了 

      难点 :  不好想 , 要找规律 , 不好读

      e.g  

      import  sys 

      sys.setrecursionlimit(10000)   #  d可调用的递归深度  , 但是 不一定可以跑到   

      import  os

      file Path = " d:sylar ..."

      def  read (file Path,  n) 

        it = os .listdir (file Path)  #  查看文件夹中的文件 

        print('_ _iter_ _' in dir( it )) ===>  可以看出是可迭代对象

        for el  in  it :   # el  只是文件名,  但是其中还有文件

          if  os.Path.isdir( os . Path .join (  filePath  ,  el ) ) :  # 判断是不是文件夹 ,若是就再一次调用函数,若不是就打印

              print(  '   *n ',  el)   #  格式

              read (  os .path . join (  file path  ,  el  )   ,   n+1   )   调用一次n+1  ,向里边缩进一层   #   递归入口

          else:

               print(  "   *  n  "   ,  el  )    #不是文件夹直接打印

       read  ( faithpath  ,  0  )

      其中

      os . Path .join (  filePath  ,  el )   是将filepath  路径和el 文件夹名的路径放在一起,  就成了  el 文件夹的路径了  ,再按照 el

          文件夹路径打开文件夹,     若不放到一块 , el 就只是一个文件夹的名字,  不是文件夹打不开

    二分法  

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

        每次排除一半,  效率高,, 但是局限性大

       掐头结尾取中间,   不停的改变左和右,  间接改变中间,   效率高

      

    e.g      查找66所在位置

      lst=[ 11, 22, 33,44,55,66,77,88,99]

    方法一:    不用递归  纯算法

       lst=[ 11, 22, 33,44,55,66,77,88,99]

       left=0   #   最左边的值的索引值

       right= len(lst) - 1    #  最右边的值得索引值

       count = 1

       while  left <=right:

          middle = ( left + right )//2     # 中间值索引为两边和除以2 取整

          if n > lst [ middle ]  :    #  若66 比中间值大.  它应该在中间的右边 ,  

            left = middle +1   #  这时最左边值的索引应该是 中间向右移动 middle+1

          elif  n < lst [ middle ] :  #  若66 比中间值小.  它应该在中间的左边 ,  

            right = middle -1  ##  这时最右边值的索引应该是 中间向左移动 +1

          else :      #   若 66 等于中间值 , 那66 所在位置就是索引为 middle  的位置

            print ( count )

            print ("存在")

            print ( middle )

          count = count+1    #  获得循环次数

       else: 

          print ('不存在')

        

    方法二:     递归

      lst=[ 11, 22, 33,44,55,66,77,88,99]

      def  binary_search ( left , right , n)

        middle = ( left + right ) //2

        if  left  >  right :      #    递归出口 

          print ("没找到")

          return  -1  

        if  n > lst[ middle ] :     #  

          left = middle +1 

        elif  n < lst [ middle ]:

          right = middle -1

        else:

          return  middle     #  return  只接收第一次调用函数的结果  ,如果再调用一次函数他就不管用了

        return  binary_search ( left , right , n)   #  这个return 接收的是第二次或者以后调用函数执行的结果,  返回的是后来调

                        用的结果,  若不写就没有后来函数执行的结果, 会返回None       

    print ( binary_search( 0, len(lst) , 66)

    方法三:    递归

      lst=[ 11, 22, 33,44,55,66,77,88,99]

      def  binary_search( lst , n)

        left = 0

        right= len( lst ) -1

        middle = ( left + right ) //2

        if  right <=0:           #  递归出口

          print("没找到")

        if  n > lst [ middle ]:

          lst = lst [ middle +1  :   ]    #  若值比中间只大 ,  列表直接就变为中间右半边的列表了

        elif  n < lst [ middle ]:

          lst= lst [   :  middle-1 ]    #   若值比中间值小  ,  列表就变为  中间 左半边的列表了

        else :

          print ("找到了") 

          return  1 

      binary_search( lst  , n)   # 递归入口

     

  • 相关阅读:
    关于《大道至简》第四章的收获
    关于《大道至简》第三章的收获
    关于《大道至简》第二章的收获
    关于《大道至简》第一章的收获
    【模板】AC自动机(加强版)
    求第 i 个素数 Meissel Lehmer Algorithm + 二分 【模板】
    Meissel Lehmer Algorithm 求前n个数中素数个数 【模板】
    黑匣子_NOI导刊2010提高(06) Splay Tree
    CF446B DZY Loves Modification 优先队列
    CF446A DZY Loves Sequences 简单dp
  • 原文地址:https://www.cnblogs.com/lynysy/p/9342536.html
Copyright © 2011-2022 走看看