递归函数,匿名函数配合内置函数的使用

一:递归函数

    函数递归调用(是一种特殊的嵌套调用):在调用一个函数的过程中,又直接或间接地调用了该函数本身
    递归必须要有两个明确的阶段:
        递推:一层一层递归调用下去,强调每进入下一层递归问题的规模都必须有所减少
        回溯:递归必须要有一个明确的结束条件,在满足该条件时结束递推
            开始一层一层回溯

    递归的精髓在于通过不断地重复逼近一个最终的结果

例子:用递归实现列表二分法查找元素

有一个从小到大排列的整型数字列表

nums=[1,3,7,11,22,34,55,78,111,115,137,149,246,371]

def search(search_num,nums):
    print(nums)
    if len(nums) == 0:
        print('not exists')
        return
    mid_index=len(nums) // 2
    if search_num > nums[mid_index]:
        # in the right
        nums=nums[mid_index+1:]
        search(search_num,nums)
    elif search_num < nums[mid_index]:
        # in the left
        nums=nums[:mid_index]
        search(search_num,nums)
    else:
        print('find it')

search(31,nums)

二:匿名函数

    1:# 有名函数:基于函数名重复使用

    2:# 匿名函数:没有绑定名字的下场是用一次就回收了

    # f=lambda x,y:x+y
    # print(f)

    # print(f(1,2))

三:常用内置函数配合lambda函数的使用    #max min map filter sorted

    salaries={
    'egon':3000,
    'alex':100000000,
    'wupeiqi':10000,
    'yuanhao':2000
     }

     # max的工作原理
     #1 首先将可迭代对象变成迭代器对象

     #2 res=next(可迭代器对象),将res当作参数传给key指定的函数,然后将该函数的返回值当作判断依据

      # def func(k):
      #     return salaries[k]
      # print(max(salaries,key=func)) #next(iter_s)
      #'egon', v1=func('egon')
      #'alex', v2=func('alex')
      #'wupeiqi', v3=func('wupeiqi')

      #'yuanhao', v4=func('yuanhao')

      res=max(salaries , key=lambda key:salaties[key])#配合lambda函数使用将薪资最高的人取出来

      print(res)

      print(min(salaries,key=lambda k:salaries[k])) #next(iter_s)    #取出薪资最低的人原理与max一样

     # salaries={
     #     'egon':3000,
     #     'alex':100000000,
     #     'wupeiqi':10000,
     #     'yuanhao':2000
     # }

     # print(sorted(salaries,key=lambda k:salaries[k],reverse=True))#将字典里的人物按照薪资进行排序,reverse可以控制      排序方式,顺序或者倒序。

     # map的工作原理
     #1 首先将可迭代对象变成迭代器对象
     #2 res=next(可迭代器对象),将res当作参数传给第一个参数指定的函数,然后将该函数的返回值当作map的结果之一
     # aaa=map(lambda x:x+"_SB",names)
     # print(aaa)
     # print(list(aaa))
     # filter的工作原理#过滤函数
     #1 首先将可迭代对象变成迭代器对象
     #2 res=next(可迭代器对象),将res当作参数传给第一个参数指定的函数,然后filter会判断函数的返回值的真假,如果为真则留      下res
     names=['alexSB','egon','wxxSB','OLDBOYSB']
     # print([name for name in names if name.endswith('SB')])#列表推到式取出以SB结尾的名字
     aaa=filter(lambda x:x.endswith('SB'),names)#使用过滤函数取出以SB结尾的名字
     print(aaa) #迭代器对象

     print(list(aaa)) 

四:其他需要掌握的内置函数:

       1,bytes

        # res='你好'.encode('utf-8')#将unicode字符转成字节类型
        # print(res)
        # res=bytes('你好',encoding='utf-8')#直接用bytes可以转换

        # print(res) 

        2,chr 参考ascii表将数字转成字符,ord将字符转换成对应的数字

        # 参考ASCII表将数字转成对应的字符
        # print(chr(65))
        # print(chr(90))
        # 参考ASCII表将字符转成对应的数字

        # print(ord('A'))

        3,divmod  求商和余数

        # print(divmod(10,3))#打印结果为3余1

        4,enumerate 枚举

        # l=['a','b','c']
        # for k ,item in enumerate(l):
        #     print(k,item)

        5,  eval 把字符串中的表达式拿出来运行一下

        # l='[1,2,3]'
        # l1=eval(l)#将列表形式的字符串取出来,拿到一个列表,可以依靠索引取值,多用于从文件中取出列表,字典之类的           数据类型
        # print(l1,type(l1))

        # print(l1[0]) 

        6,pow    

        # print(pow(3,2,2)) #与 (3 ** 2) % 2类似,先平方再求余

        7,round 四舍五入

         # print(round(3.3))  #结果为3

         #print(round(3.5))#结果为4

         8,sum求和函数

         # print(sum(range(101))) #1到100的值

         9,—import—  用来导入以字符串形式输入的模块

          module=input('请输入你要导入的模块名>>: ').strip() #module='asdfsadf'
          m=__import__(module) 
          print(m.time())

五:其他需要了解的内置函数

        1, # print(abs(-13))   #求绝对值的方法
        2, # print(all([1,2,3,]))  #全部为True则为真

        3, # print(all([]))    #空的可迭代对象为真

        4, # print(any([0,None,'',1])) #有一个为True则为True
        5, # print(any([0,None,'',0]))  #False

        6, # print(any([])) #空列表为假

        7, # print(bin(3)) #11  #十进制转换成二进制
        8, # print(oct(9)) #11   #十进制转成八进制

        9, # print(hex(17)) #11  #十进制转成十六进制

        10,# print(callable(len))  #函数是否能被调用

        11, # import time

        12, # print(dir(time)) #列举出所有:time.名字

        13, # s=frozenset({1,2,3}) # 不可变集合
        14, # s1=set({1,2,3}) # 可变集合 

        15, # # print(globals())  #查看全局变量

        16, # # print(locals())     #查看局部变量

        17, # hash([1,2,3])     #是否可以被hash

        18, # def func():
               #     """
               #     文档注释
               #     :return:
               #     """
               #     pass

               # print(help(func))  #help函数查看一个函数的帮助文档

         19,  # l=['a','b','c','d','e']
                # s=slice(1,4,2)  #类似于先定义一个切片方式,以后可以方便连续使用
                # print(l[1:4:2])

                # print(l[s])

          20,# print(vars())#返回对象object的属性和属性值的字典对象,如果没有参数,就打印当前调用位置的属性和属性值 类似 locals()。

        

        


     

    

猜你喜欢

转载自blog.csdn.net/boteman123/article/details/80692443
今日推荐