几个用到能很方便的函数和递归与二分法

出师未捷身先死

多的是你不知道得事

昨天主要讲解了68个内置函数

今日 主要内容

  1. Lambda 匿名函数

Lambda 参数:  返回值

函数名称统一都叫 lambda

2,sorted()排序函数

排序函数

Sorted(iterable,key,reverse)

Key:表示排序规则

运行流程:把可迭代对中的每一个元素交给前面的函数进行筛选,

函数返回True或者False

lst = [16, 18, 32, 54, 12, 9]

 lst.sort() # list的方法

 print(lst)

  内置函数中提供了一个通用的排序方案, sorted()

 s = sorted(lst)

 print(s)

       0       1          0          1         1        0      0

 lst = ["聊斋", "西游记", "三国演义", "葫芦娃", "水浒传", "年轮", "亮剑"]

 def func(s):

     return len(s)%2

 ll = sorted(lst, key=func)

 print(ll)

 key: 排序方案, sorted函数内部会把可迭代对象中的每一个元素拿出来交给后面的key

 后面的key计算出一个数字. 作为当前这个元素的权重, 整个函数根据权重进行排序

lst = [

    {'name':"汪峰","age":48},

    {"name":"章子怡",'age':38},

    {"name":"alex","age":39},

    {"name":"wusir","age":32},

    {"name":"赵一宁","age":28}

    ]

ll = sorted(lst, key=lambda el: len(el['name']), reverse=True)

print(ll)

  1. Filter()过滤函数

Filter(function,iterable)

把可迭代对象的每一个元素交给前面的函数进行筛选,

函数返回True或者False

 lst = ["张无忌", "张铁林", "赵一宁", "石可心","马大帅"]

 def func(el):

     if el[0] == '':

         return False # 不想要的

     else:

         return True # 想要的

 筛选,

 f = filter(lambda el: el[0]!="", lst) # lst中的每一项传递给func, 所有返回True的都会保留, 所有返回False都会被过滤掉

 print("__iter__" in dir(f)) # 判断是否可以进行迭代

 for e in f:

     print(e)

 lst = [

     {"name":"汪峰", "score":48},

     {"name":"章子怡", "score":39},

     {"name":"赵一宁","score":97},

     {"name":"石可心","score":90}

 ]

 f = filter(lambda el: el['score'] < 60 , lst) # 16期的人

 print(list(f))

  1. Mao()映射函数

Map(function,iterable)

把可迭代对象的每一个数据交给前面的函数进行执行,

返回值就是map的结果 一对一进行处理

lst = [1,4,7,2,5,8]

 计算列表中没个数字的平方

 ll = []

 for el in lst:

     ll.append(el**2)

 def func(el):

     return el**2

 m = map(lambda el: el**2, lst) # 把后面的可迭代对象中的每一个元素传递给function, 结果就是function的返回值

 print(list(m))

 print("__iter__" in dir(m))

 分而治之

 map(func1, map(func2, map(func3 , lst)))

 lst1 = [1, 3, 5, 7]

 lst2 = [2, 4, 6, 8, 10]

 # 水桶效应, zip()

 m = map(lambda x, y, z: x + y+ z, lst1, lst2, [5,1,2,3,6])

 print(list(m))

5  递归

函数自己调用自己

最大深度:1000.到不了1000自己就停下来了

Import sys

Sys.....

归函数, 自己调用自己

 count = 1

 def func():

     global count

     print("alex是很帅的", count)

     count = count + 1

     func()

 func()

 递归深度. 你可以自己掉用自己的次数,

 官方文档中递归最大深度是1000. 在这之前就会给你报错

 遍历 D:/sylar文件夹, 打印出所有的文件和普通文件的文件名

 import os

 def func(filepath, n): # d:/sylar/

     # 1,打开这个文件夹

     files = os.listdir(filepath)

     # 2. 拿到每一个文件名

     for file in files:  # 文件名

         # 3. 获取到路径

         f_d = os.path.join(filepath, file) # d:/sylar/文件名/

         # 4. 判断是否是文件夹

         if os.path.isdir(f_d):

             # 5. 如果是文件夹. 继续再来一遍

             print(" "*n, file,":") # 打印文件名

             func(f_d, n + 1)

         else:   #  不是文件夹. 普通文件

             print(" "*n, file)

 func("d:/sylar",0)

  1. 二分法

核心:捏头去尾留中间.一次砍一半

俩种算法:常规循环,递归循环

Dic={“5”:”1”,”6”:”1”}

时间复杂度最低,空间复杂度最低

Lst1=[5,6,7,8]

Lst2=[0,0,0,0,1,1,1,1]

For c in lst1:

Lst2[c]=1

Lst2[4]==1

 使用二分法可以提高效率, 前提条件:有序序列

 lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789]

 n = 88

 left = 0

 right = len(lst)-1

 while left <= right:  边界, 当右边比左边还小的时候退出循环

     mid = (left + right)//2  必须是整除. 因为索引没有小数

     if lst[mid] > n:

         right = mid - 1

     if lst[mid] < n:

         left = mid + 1

     if lst[mid] == n:

         print("找到了这个数")

         break

 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:  边界

        print("哈哈")

        mid = (left + right)//2

        if n > lst[mid]:

            left = mid + 1

            return func(n, left, right)  递归  递归的入口

        elif n < lst[mid]:

            right = mid - 1

             深坑. 函数的返回值返回给调用者

            return func(n, left, right)    # 递归

        elif n == lst[mid]:

            print("找到了")

            return mid

             return   通过return返回. 终止递归

    else:

        print("没有这个数")  递归的出口

        return -1  1, 索引+ 2, 什么都不返回, None

 66, 左边界:0,  右边界是:len(lst) - 1

ret = func(70, 0, len(lst) - 1)

print(ret)  不是None

原文地址:https://www.cnblogs.com/zzy7372/p/9481600.html